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 が永続的に「作成中」ステータスを返す状況はありますか (無限ループに陥る可能性があります)。
助けてくれてありがとう!