まくろぐ
更新: / 作成:

SAM で簡単な DynamoDB テーブルを生成してみる

DynamoDB のテーブルリソースも、Lambda 関数などのリソースと同様に AWS SAM で自動生成&更新することができます。 CloudFormation のテンプレートをそのまま記述するより、拡張された SAM テンプレートの形式で記述することで、シンプルにリソースを定義することができます。

SAM テンプレート内で DynamoDB のテーブルを定義するときは、リソースタイプとして AWS::Serverless::SimpleTable を指定します(CloudFormation スタック内に実際に生成されるリソースのタイプは AWS::DynamoDB::Table になります)。

DynamoDB テーブルを作成するための最低限の SAM テンプレートはとてもシンプルです。 次の例では、MyTable という 論理 ID (Logical ID) で DynamoDB のテーブルを定義しています。 論理 ID はスタック内でリソースを特定するための名前です。

template.yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: My sample app
Resources:
  MyTable:
    Type: AWS::Serverless::SimpleTable

ひとつもプライマリキーを指定していませんが、その場合はデフォルトで id という名前のプライマリキー(String 型)が定義されます。 AWS CLI で次のように実行すると、CloudFormation のスタックを作成することができます。

$ aws cloudformation deploy --stack-name mystack \
    --template-file template.yml

CloudFormation スタック内に、実際にどのような AWS リソースが作成されたかを調べるには以下のようにします。 ここではリソースタイプと、その物理 ID (Pysical ID) を table 形式で出力してみました。

$ aws cloudformation describe-stack-resources --stack-name mystack \
    --query 'StackResources[].[ResourceType,PhysicalResourceId]' \
    --output table
----------------------------------------------------------
|                 DescribeStackResources                 |
+-----------------------+--------------------------------+
|  AWS::DynamoDB::Table |  mystack-MyTable-ABD467NSG1D3  |
+-----------------------+--------------------------------+

SAM テンプレート内では、DynamoDB テーブルの論理 ID (Logical ID) を MyTable と定義しましたが、実際のテーブル名(物理 ID)は mystack-MyTable-ABD467NSG1D3 のように、スタック名と論理 ID、ハッシュ値を組み合わせたものから自動生成されていることが分かります。 この物理 ID が、DynamoDB のマネージメントコンソールなどで表示されるテーブル名になります。 もちろん、テーブル名は SAM テンプレート内で明示的に指定することができます(後述)。

DynamoDB テーブル用のプロパティ設定

SAM の AWS::Serverless::SimpleTable リソースのプロパティ設定には以下のようなものがあります。

TableName … テーブル名(物理 ID)

デフォルトでは、DynamoDB のテーブル名 (Physical ID) は CloudFormation のスタック名と Logical ID から自動生成されますが、TableName プロパティで明示的に設定できます。

Resources:
  BooksTable:
    Type: AWS::Serverless::SimpleTable
    Properties:
      TableName: myapp-table-books

PrimaryKey … プライマリキー

テーブルのプライマリキーは PrimaryKey プロパティで指定します(属性名を Name、属性タイプを Type で指定します)。 属性タイプは StringNumberBinary のいずれかの値を指定します(プライマリキー以外の属性には、他にも Boolean などの属性タイプがありますが、プライマリキーの属性タイプは 3 種類だけです)。 次の例では、プライマリキーとして、Title という名前の String 型属性を定義しています。

Resources:
  BooksTable:
    Type: AWS::Serverless::SimpleTable
    Properties:
      PrimaryKey:
        Name: Title
        Type: String

Tags … タグの配列

DynamoDB テーブルにタグを設定したいときは、Tags プロパティにマップ形式(キー&バリュー)で指定します。

Resources:
  BooksTable:
    Type: AWS::Serverless::SimpleTable
    Properties:
      Tags:
        Project: OnlineShop
        Department: Engineering

その他の情報源

関連記事

まくろぐ
サイトマップまくへのメッセージ