DynamoDBのテーブル存在チェック
DynamoDBのテーブルの存在チェックをする方法。
ListTableを利用する
一番簡単なのはListTableを実施して、その中にお目当てのテーブルがあるかどうかを見ればよい。
def exists_table(table_name, connection): return table_name in connection.list_tables()
…のだが、残念なことにDynamoDBのテーブルはリージョン単位で存在しており、特定のテーブルにprefixをつけて環境ごとの管理(例: test_, staging_ など)をしている場合に、これらのテーブルへのアクセス権限のみではListTableが失敗してしまう。
ListTable権限を付けれるならこれでも良いのだが、まあ、できれば権限は狭くしたい。
Responseコードを利用する
もう1つの方法として、Table.describe をコールした場合のStatusとして400(=ResourceNotFoundException)が返ってくることを確かめる方法がある。
具体的には以下の通り。
import logging from boto.exception import JSONResponseError from boto.dynamodb2.table import Table def exists_table(table_name, connection): try: Table(table_name, connection=connection).describe() return True except JSONResponseError as e: if e.status == 400: return False # また別の例外が返ってきた logging.exception(e) return False