1

boto3 SDKを使用して AWS Elastic File System リソースを作成しています。

EFS の boto3 ドキュメント (上記のリンク) には、ウェイターはありません (EC2 インスタンスの起動などの他のアクションとは異なります)。そのため、リソースが作成されるまでウェイターを呼び出して実行を保留することはできず、自分で作成する必要があります。頭に浮かぶエッジケースもたくさんありますが、それらを処理する例が見つかりません。

client = # Attach credentials and create an efs boto3 client

def find_or_create_file_system(self, a_token):

    fs = self.client.create_file_system(CreationToken=a_token, PerformanceMode='generalPurpose')
    # Returns either:
    # {
    #     'OwnerId': 'string',
    #     'CreationToken': 'string',
    #     'FileSystemId': 'string',
    #     'CreationTime': datetime(2015, 1, 1),
    #     'LifeCycleState': 'creating'|'available'|'deleting'|'deleted',
    #     'Name': 'string',
    #     'NumberOfMountTargets': 123,
    #     'SizeInBytes': {
    #         'Value': 123,
    #         'Timestamp': datetime(2015, 1, 1)
    #     },
    #     'PerformanceMode': 'generalPurpose'|'maxIO'
    # }

    # Or, if an FS is available with that creation token already, the above returns 
    # an error. According to boto3 docs, the error will contain the existing fs id. 
    # Is this an error I need to manage with try/catch? What is the syntax to get 
    # the id out of the error?
    if there_is_an_error
        # EFS already exists
        if fs['LifeCycleState'] == 'creating'
            # Need to wait until it's created then return its id
        elif fs['LifeCycleState'] != 'available'
            # It is being / has been deleted.
            # What now? Is that token never usable again? Does it eventually disappear so I can reuse it? How long do I have to wait before recreating it?

    #  Wait until available
    fs_desc = self.client.describe_file_systems(FileSystemId=fs.id)

    # TODO figure out whether there's a waiter for this
    while fs_desc['FileSystems'][0]['LifeCycleState'] == 'creating':
        time.sleep(5)
        fs_desc.update() # Updates metadata
        print("EFS state: {0}".format(fs_desc['FileSystems'][0]['LifeCycleState']))

    return fs.id

質問 1自分のウェイターを書かなければならないというのは正しいですか? API の他の場所からウェイターをハイジャック/転用できますか? または文書化されていないウェイターはありますか?

質問 2そのトークンを持つインスタンスが既に存在する場合に発生するエラーをキャッチするにはどうすればよいですか? そして、そのケースを処理するためにエラーメッセージからIDを取得するにはどうすればよいですか?

質問 3ファイル システムが削除された後、トークンを再利用できますか (つまり、AWS は最終的に消去されますか、それともそのトークンは保持されますか)?

Q3 に質問する理由は、client.describe_file_systems() に Filter={} オプションがないためです。そのため、現在、単純な一意のテキスト ハンドルを含むトークンを使用して、顧客に固有の EFS を作成し、後で取得しています。ランダムな UUID トークンを使用して、組織名でタグ付けすることはできますが、タグに基づいて取得することはできません!!!

質問 4その while ループは堅牢ですか? つまり、AWS が永続的に「作成中」ステータスを返す状況はありますか (無限ループに陥る可能性があります)。

助けてくれてありがとう!

4

0 に答える 0