【AWS】CDKv2で環境構築　DynamoDB編

# はじめに
現在運用中の環境をテスト用として複製する際に`CDKv2`を用いて
コード化することになったのでその学びです。

[Lambda編はこちら](https://qiita.com/yamato1491038/items/6a3eb65688389a5d6e31)
[Cognito編はこちら](https://qiita.com/yamato1491038/items/bbef1df21e54e22d36ca)
[apigateway編はこちら](https://qiita.com/yamato1491038/items/63fc91325c6f72464b49)
[StepFunctions編はこちら](https://qiita.com/yamato1491038/items/7393c910f70bf241ed62)


# 準備

このへんの記事でまずは環境設定
https://aws.amazon.com/jp/getting-started/guides/setup-cdk/

今回は`TypeScript`を用いて実装しました。

```
$ cdk init --language typescript
```
こちらを叩いて`/lib`配下のtsファイルを編集するところからの内容です。

バージョンは`2.28.1`の時でした！

# DynamoDB

まずテーブル定義は以下のようになります。

```typescript:/lib/main-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';

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

    // DynamoDB resource -------------------

    new dynamodb.Table(this, 'Sample-table', { // 'Sample-table'はStack内で一意
      tableName: "samble-table", // テーブル名の定義
      partitionKey: { //パーティションキーの定義
        name: 'id',
        type: dynamodb.AttributeType.STRING, // typeはあとNumberとbinary
      },
      sortKey: { // ソートキーの定義
        name: 'name',
        type: dynamodb.AttributeType.STRING,
      },
      billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,  // オンデマンド請求
      pointInTimeRecovery: true, // PITRを有効化
      timeToLiveAttribute: 'expired', // TTLの設定
      removalPolicy: cdk.RemovalPolicy.DESTROY, // cdk destroyでDB削除可
    });
  }
}
```

基本的にはコメントの通り。
`billingMode`はオンデマンドかプロビジョンかの設定をします。
`pointInTimeRecovery`はポイントインタイムリカバリー設定。デフォルトはfalse。
`timeToLiveAttribute`は対象項目名を指定。エポック時間で削除時間を指定します。デフォルトは設定無し。
`removalPolicy`はCDK側の設定で`cdk destroy`でテーブルを削除するか否かの設定。
デフォルトは**削除されなく**なってます。
これはリソースによってデフォルトの動きが異なります。

# GSIの設定

```typescript:/lib/main-stack.ts

import * as cdk from 'aws-cdk-lib';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';

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

    // DynamoDB resource -------------------

    const sample_table = new dynamodb.Table(this, 'Sample-table', {　
      tableName: "samble-table", 
      partitionKey: {
        name: 'id',
        type: dynamodb.AttributeType.STRING
      },
      sortKey: {
        name: 'name',
        type: dynamodb.AttributeType.STRING,
      },
      billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
      pointInTimeRecovery: true,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });

    // GSIの設定
    sample_table.addGlobalSecondaryIndex({
      indexName: 'datetime-index',
      partitionKey: {name: 'sampleID', type: dynamodb.AttributeType.STRING},
      sortKey: {name: 'datetime', type: dynamodb.AttributeType.NUMBER},
    });
  }
}
```

一旦テーブル作成後に`addGlobalSecondaryIndex()`でGSIを作成します。
作成にはインデックス名、パーティションキー、必要であればソートキーを設定します。
もともとのテーブルの請求モードがオンデマンドであれば
自動でGSIもオンデマンドとなります！

プロビジョン設定時は何CUかを設定できます。


# DynamoDB Stream

```typescript:/lib/main-stack.ts

import * as cdk from 'aws-cdk-lib';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';

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

    // DynamoDB resource -------------------

    const sample_table = new dynamodb.Table(this, 'Sample-table', {　
      tableName: "samble-table", 
      partitionKey: {
        name: 'id',
        type: dynamodb.AttributeType.STRING
      },
      sortKey: {
        name: 'name',
        type: dynamodb.AttributeType.STRING,
      },
      billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
      pointInTimeRecovery: true,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      stream: dynamodb.StreamViewType.NEW_IMAGE, // ココを設定
    });
  }
}
```

これでStream設定がONになります。
今回は`NEW_IMAGE`ですが、OLD_IMAGEなど選択できます。

基本的にはドキュメントを参照しております！
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_dynamodb.Table.html

日本語版がないので解読に時間がかかりましたが、
まずはリソースを選択し、Dynamoであれば`Table`という項目を選択すれば
Tableを使用する際の設定パラメーターの記載がそのページにあります！
そして項目ごとに専用の書き方あれば、クリックするとその設定の方法が記述しているページに飛ぶという感じになってます。

そして
```
$ cdk deploy
```
とコマンド打つだけで一気に数十個（私の場合）テーブル作成できるのでホント楽です＾＾