前回は、サーバーレスのテンプレートを作成しました。

今回は、作成したテンプレートに DynamoDB を接続します。

DynamoDB を設定するために、serverless.yml を開きます。

まずは、テーブル名を設定します。

provider に、環境変数を設定するために、environmentを入力します。

envirionmentNOTE_TABLEを作成し、『サービス名-stage 名』にします。

『サービス名-stage 名』にする場合、${}でかこみ、YAML の場所を指定します。

provider:
  name: aws
  runtime: nodejs14.x
  region: us-west-2
  stage: dev
  memorySize: 128
  timeout: 5
  endpointType: regional
  lambdaHashingVersion: 20201221
  environment:
    NOTES_TABLE: ${self:service}-${opt:stage, self:provider.stage}

次に、DynamoDB のテーブルを定義します。

YAML で、resourcesを設定し、さらにResourcesを設定します。

Resourcesの中に、NotesTableを設定します。

resources:
  Resources:
    NotesTable:

Type に AWS::DynamoDB::Table を指定します。

※AWS と DynamoDB と Table は、コロン 2 つでくぎられるので、間違えないようにしましょう。

resources:
  Resources:
    NotesTable:
      Type: AWS::DynamoDB::Table

次に、DeletionPolicyを設定します、これは、スタックが削除された際に、リソースを保持するかバックアップするか指定できます。

保持するために、Retainを指定します。

resources:
  Resources:
    NotesTable:
      Type: AWS::DynamoDB::Table
      DeletionPolicy: Retain

プロパティを設定します。

TableNameは、先程環境設定で作成した、NOTES_TABLEを指定します。

resources:
  Resources:
    NotesTable:
      Type: AWS::DynamoDB::Table
      DeletionPolicy: Retain
      Properties:
        TableName: ${self:provider.environment.NOTES_TABLE}

キースキーマ属性のデータ型を定義するために、AttributeDefinitionsを設定します。

指定は、user_idtimestampnote_idとします。

また、user_idは String なので、AttributeType に『S』、

timestampは、Number なので、AttributeType に『N』、

note_idは String なので、AttributeType に『S』を指定します。

resources:
  Resources:
    NotesTable:
      Type: AWS::DynamoDB::Table
      DeletionPolicy: Retain
      Properties:
        TableName: ${self:provider.environment.NOTES_TABLE}
        AttributeDefinitions:
          - AttributeName: user_id
            AttributeType: S
          - AttributeName: timestamp
            AttributeType: N
          - AttributeName: note_id
            AttributeType: S

次に、KeySchema で主キーを設定します。

user_idをパーティションキーとするので、KeyType をHASHとします。

また、timestampをソートキーとするので、KeyType をRANGEとします。

resources:
  Resources:
    NotesTable:
      Type: AWS::DynamoDB::Table
      DeletionPolicy: Retain
      Properties:
        TableName: ${self:provider.environment.NOTES_TABLE}
        AttributeDefinitions:
          - AttributeName: user_id
            AttributeType: S
          - AttributeName: timestamp
            AttributeType: N
          - AttributeName: note_id
            AttributeType: S
        KeySchema:
          - AttributeName: user_id
            KeyType: HASH
          - AttributeName: timestamp
            KeyType: RANGE

ProvisionedThroughputでどのくらいリソースを提供するかを設定できます。

ReadCapacityUnitsWriteCapacityUnitsを最小単位の『1』とします。

resources:
  Resources:
    NotesTable:
      Type: AWS::DynamoDB::Table
      DeletionPolicy: Retain
      Properties:
        TableName: ${self:provider.environment.NOTES_TABLE}
        AttributeDefinitions:
          - AttributeName: user_id
            AttributeType: S
          - AttributeName: timestamp
            AttributeType: N
          - AttributeName: note_id
            AttributeType: S
        KeySchema:
          - AttributeName: user_id
            KeyType: HASH
          - AttributeName: timestamp
            KeyType: RANGE
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1

クエリを設定するために、セカンダリキーを指定します。

セカンダリキーは、note_idにします。

IndexNameに名前をつけましょう。

resources:
  Resources:
    NotesTable:
      Type: AWS::DynamoDB::Table
      DeletionPolicy: Retain
      Properties:
        TableName: ${self:provider.environment.NOTES_TABLE}
        AttributeDefinitions:
          - AttributeName: user_id
            AttributeType: S
          - AttributeName: timestamp
            AttributeType: N
          - AttributeName: note_id
            AttributeType: S
        KeySchema:
          - AttributeName: user_id
            KeyType: HASH
          - AttributeName: timestamp
            KeyType: RANGE
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        GlobalSecondaryIndexes:
          - IndexName: note_id-index
                        KeySchema:
              - AttributeName: note_id
                KeyType: HASH

Projectionで、テーブルからインデックスにコピーされる属性を指定します。

ProjectionTypeは、ALLとします。

ProvisionedThroughput は、最小単位の『1』とします。

resources:
  Resources:
    NotesTable:
      Type: AWS::DynamoDB::Table
      DeletionPolicy: Retain
      Properties:
        TableName: ${self:provider.environment.NOTES_TABLE}
        AttributeDefinitions:
          - AttributeName: user_id
            AttributeType: S
          - AttributeName: timestamp
            AttributeType: N
          - AttributeName: note_id
            AttributeType: S
        KeySchema:
          - AttributeName: user_id
            KeyType: HASH
          - AttributeName: timestamp
            KeyType: RANGE
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        GlobalSecondaryIndexes:
          - IndexName: note_id-index
            KeySchema:
              - AttributeName: note_id
                KeyType: HASH
            Projection:
              ProjectionType: ALL
            ProvisionedThroughput:
              ReadCapacityUnits: 1
              WriteCapacityUnits: 1

これで、一通り設定が完了したので、ターミナルでserverless deploy を実行して、デプロイします。

デプロイが完了した後、DynamoDB に接続すると、

image2

先程設定した、テーブル名が追加されました。

次回は、サーバーレスオフラインを使って、DynamoDB にデータを保存します。

ブログ一覧