CDK(TypeScript)でDynamoDBリソースを作成し、TableNameをSSMパラメータストアに保存する
#AWS
#DynamoDB
#CDK
#TypeScript
#SSM
#パラメータストア
◇概要
CDK(Typescript)を使ってDynamoDB, SSMパラメータストアを一括で構築
簡単に各リソースについて説明
Amazon DynamoDBとは
AWSのフルマネージドなNoSQLデータベースサービス KeyValueストア型でデータを保存でき、高い可用性と耐久性を持つ
今回の設定
- インデックス PrimaryIndex: PartitionKey: id(string) SortKey: meta(string) GlobalSecondaryIndex: meta-id-idx: PartitionKey: meta(string) SortKey] id(string) timestamp-id-idx: PartitionKey: timestamp(number) SortKey] id(string)
- 料金モード オンデマンドキャパシティーモード
- ポイントインタイムリカバリ 有効
- DynamoDB Stream 変更後のイメージのみ配信 オプション(NEW_IMAGE, OLD_IMAGE, NEW_AND_OLD_IMAGES, KEYS_ONLY)
- TTL設定 timestampを設定してそのtimestampに達した時に自動でレコードが削除される ttlという項目名で設定
Systems Manager Parameter Storeとは
設定データ管理と機密管理のための安全な階層型ストレージを提供。 パスワード、データベース文字列、AMI ID、ライセンスコードなどのデータをパラメータ値として保存することができる。 実際の使用例として開発環境、本番環境でそれぞれの環境のリソースにアクセスしたい場合などパラメータストアに保存して管理することでリソース名などを手動で管理しなくても済む 以下の例では「/Sample/DynamoDB/TableName」というキーでDynamoDBのTableName文字列を保存している
環境
"aws-cdk": "^1.137.0" "@aws-cdk/aws-dynamodb": "1.137.0" "@aws-cdk/aws-ssm": "^1.137.0" "@aws-cdk/core": "^1.137.0"
サンプルコード
◇ディレクトリ構成
root/ ├ bin/ │ └ cdk.ts └ lib/ ├ TestStack.ts └ utils/ └ testModule/ ├ createDynamoDBTable.ts
/lib/utils/testModule/createDynamoDBTable
import { Stack } from "@aws-cdk/core"; import { AttributeType, BillingMode, StreamViewType, Table } from "@aws-cdk/aws-dynamodb"; import { CfnParameter } from "@aws-cdk/aws-ssm"; export interface CreateDynamoDBTableprops { modulePrefix: string } export function createDynamoDBTable( stack: Stack, props: CreateDynamoDBTableprops ) { const table = new Table(stack, `${props.modulePrefix}-ddb-table`, { partitionKey: { name: "id", type: AttributeType.STRING }, billingMode: BillingMode.PAY_PER_REQUEST, pointInTimeRecovery: true, sortKey: { name: "meta", type: AttributeType.STRING }, stream: StreamViewType.NEW_IMAGE, timeToLiveAttribute: "ttl" }); table.addGlobalSecondaryIndex({ indexName: "meta-id-idx", partitionKey: { name: "meta", type: AttributeType.STRING }, sortKey: { name: "id", type: AttributeType.STRING } }); table.addGlobalSecondaryIndex({ indexName: "meta-timestamp-idx", partitionKey: { name: "meta", type: AttributeType.STRING }, sortKey: { name: "timestamp", type: AttributeType.NUMBER } }); new CfnParameter(stack, `${props.modulePrefix}-table-name-parameter`, { type: "String", value: table.tableName, description: "DynamoDB tableName for fpm RealTimeDashBoard", name: "/Sample/DynamoDB/TableName" }); return table; }
/lib/TestStack.ts
import { Construct, Stack, StackProps } from "@aws-cdk/core"; import { createDynamoDBTable } from "./utils/sample/createDynamoDBTable"; export interface TestStackprops extends StackProps { envKey: string; } export class TestStack extends Stack { constructor(scope: Construct, id: string, props: TestStackprops) { super(scope, id, props); const modulePrefix = `fpm-${props.envName}-sample`; // DynamoDB作成 const table = createDynamoDBTable(this, { modulePrefix }); } }
- /bin/cdk.ts
#!/usr/bin/env node import * as cdk from "@aws-cdk/core"; import "source-map-support/register"; import { TestStack } from "../lib/TestStack"; const app = new cdk.App(); const argContext = "environment"; const envKey = app.node.tryGetContext(argContext); if (envKey === undefined) { throw new Error(`環境名を指定してください。 ex) cdk deploy -c ${argContext}=dev`); } const envVals = app.node.tryGetContext(envKey); if (envVals === undefined) throw new Error(`${envKey}の環境設定がcdk.jsonに含まれていません`); new TestStack(app, "TestStack", { envName: envVals.envName });