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