CDK + Typescript で DynamoDB のテーブルを作成する

サーバーレスアーキテクチャでアプリケーションを構成する場合、クラウドリソース作成用のテンプレートをどのように管理すべきか悩む。

今回は、

という構成。 AmplifyでもCFnは書けるが、フロントのデプロイの影響を受けてしまいそうなのと、フロントとバックエンドは疎結合にしたほうが良かろう思ってAPIのリソース定義はAWS SAMで書くことにした。DBも同じくバックエンドということでSAMで定義している。

aws.amazon.com

なのでこのCDKのコードは不要になってしまったのだけど、供養ということで。

import * as cdk from '@aws-cdk/core';
import { Table, AttributeType, BillingMode, GlobalSecondaryIndexProps } from "@aws-cdk/aws-dynamodb";

export class DynamodbStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // NOTE: RemovalPolicy.DESTROYは
    //  テーブルにデータが入っている状態でcdk destroyが実行された時、データごとテーブルを削除する
    const table = new Table(this, "myTable", {
      partitionKey: {
        name: "userId",
        type: AttributeType.STRING,
      },
      sortKey: {
        name: "timestamp",
        type: AttributeType.NUMBER
      },
      tableName: "monologue",
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      billingMode: BillingMode.PAY_PER_REQUEST
    });

    table.addGlobalSecondaryIndex({
      indexName: "gql-keywords",
      partitionKey: {
        name: "keyword",
        type: AttributeType.STRING
      },
      sortKey: {
        name: "timestamp",
        type: AttributeType.NUMBER
      }
    });

    new cdk.CfnOutput(this, "DynamoDB tablename", {
      value: table.tableName
    })
  }
}