6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【AWS】CDKv2で環境構築 DynamoDB編

Last updated at Posted at 2022-06-26

はじめに

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

Lambda編はこちら
Cognito編はこちら
apigateway編はこちら
StepFunctions編はこちら

準備

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

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

$ cdk init --language typescript

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

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

DynamoDB

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

/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の設定

/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

/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

とコマンド打つだけで一気に数十個(私の場合)テーブル作成できるのでホント楽です^^

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?