Skip to content

TypeScript DynamoDB

このジェネレーターは、Amazon DynamoDB をバックエンドとする新しい TypeScript DynamoDB プロジェクトを作成します。型安全なエンティティモデリングには ElectroDB を使用します。AWS CDK または Terraform を使用して DynamoDB テーブルをプロビジョニングおよび管理するために必要なアプリケーションコードとインフラストラクチャを生成し、シングルテーブル設計のサポートと DynamoDB Local によるローカル開発機能を備えています。

TypeScript DynamoDB プロジェクトを生成する

Section titled “TypeScript DynamoDB プロジェクトを生成する”
Terminal window
pnpm nx g @aws/nx-plugin:ts#dynamodb
変更されるファイルを確認するためにドライランを実行することもできます
Terminal window
pnpm nx g @aws/nx-plugin:ts#dynamodb --dry-run
パラメータデフォルト説明
name 必須string-生成するDynamoDBプロジェクトの名前
directory stringpackagesプロジェクトを保存するディレクトリ
subDirectory string-プロジェクトが配置されるサブディレクトリ。デフォルトではプロジェクト名になります。
framework electrodbelectrodbDynamoDB エンティティに使用するフレームワーク。
tableName string-DynamoDB テーブル名。指定しない場合は自動生成されます。
infra dynamodb | nonedynamodbDynamoDBテーブルのためにプロビジョニングするインフラストラクチャ。
iac inherit | cdk | terraforminherit優先するIaCプロバイダー。デフォルトでは、初期選択から継承されます。
preferInstallDependencies booleantrueジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合は false に設定します(後続のジェネレーターが Nx プロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。

ジェネレーターは <directory>/<name> ディレクトリに以下のプロジェクト構造を作成します:

  • Directorysrc
    • index.ts Project entry point and exports
    • client.ts DynamoDB client singleton and table name resolution
    • Directoryentities
      • example.ts Example ElectroDB entity definition
      • index.ts Entity exports
  • config.json Table configuration including GSI definitions and local development settings
  • package.json Project manifest defining the project’s package name and dependencies
  • project.json Project configuration and build targets

ローカル開発スクリプトは、すべての DynamoDB プロジェクト(TypeScript と Python の両方)で共有され、以下に一度生成されます:

  • Directorypackages/common/scripts/src/dynamodb
    • create-local-table.ts Creates the DynamoDB table in the local DynamoDB Local instance
    • pull-image.ts Pulls the DynamoDB Local image
    • start-container.ts Starts the DynamoDB Local container

このジェネレーターは、選択した iac に基づいてインフラストラクチャをコードとして提供するため、関連する CDK コンストラクトまたは Terraform モジュールを含む packages/common にプロジェクトを作成します。

共通のインフラストラクチャコードプロジェクトは、次のように構成されています:

  • Directorypackages/common/constructs
    • Directorysrc
      • Directoryapp/ プロジェクト/ジェネレーター固有のインフラストラクチャ用のコンストラクト
      • Directorycore/ app 内のコンストラクトによって再利用される汎用コンストラクト
      • index.ts app からコンストラクトをエクスポートするエントリーポイント
    • project.json プロジェクトのビルドターゲットと設定
  • Directorypackages/common/constructs/src
    • Directoryapp
      • Directorydynamodb
        • <name>.ts テーブル固有のインフラストラクチャ
    • Directorycore
      • dynamodb.ts 汎用 DynamoDB テーブルコンストラクト

ジェネレーターは、DynamoDB Local インスタンスを起動してテーブルを作成する dev ターゲットを設定します。プロジェクトの dev ターゲットを使用してください:

Terminal window
pnpm nx dev <project-name>

これにより自動的に以下が実行されます:

  1. DynamoDB Local イメージをプル(pull-image ターゲット)
  2. コンテナを起動
  3. config.json で定義されたインデックスを持つローカルテーブルを作成

生成されたプロジェクトは、単一の DynamoDB テーブル上で型安全なエンティティモデリングを行うために ElectroDB を使用し、DynamoDB のシングルテーブル設計に従います。生成されたサンプルエンティティを出発点として、src/entities/ 配下にエンティティファイルを追加または更新してください。

エンティティ定義の例:

packages/my-table/src/entities/example.ts
import { Entity } from 'electrodb';
import { getDynamoDBClient, resolveTableName } from '../client.js';
export const createExampleEntity = async () =>
new Entity(
{
model: {
entity: 'example',
version: '1',
service: 'MyTable',
},
attributes: {
id: {
type: 'string',
required: true,
},
createdAt: {
type: 'string',
required: true,
default: () => new Date().toISOString(),
readOnly: true,
},
updatedAt: {
type: 'string',
required: true,
default: () => new Date().toISOString(),
watch: '*',
set: () => new Date().toISOString(),
},
},
indexes: {
primary: {
pk: {
field: 'pk',
composite: ['id'],
},
sk: {
field: 'sk',
composite: [],
},
},
},
},
{ client: getDynamoDBClient(), table: await resolveTableName() },
);

詳細については、ElectroDB エンティティドキュメントを参照してください。

生成された src/client.ts は、2つの主要なユーティリティをエクスポートします:

  • getDynamoDBClient() — キャッシュされたシングルトンの DynamoDBClient を返します。LOCAL_DEV=true の場合、ローカルの DynamoDB Local インスタンスに接続します。それ以外の場合は、デフォルトの認証情報チェーンを使用して AWS クライアントを作成します。
  • resolveTableName() — DynamoDB テーブル名を返します。LOCAL_DEV=true の場合、ローカルテーブル名定数を返します。それ以外の場合は、RUNTIME_CONFIG_APP_ID 環境変数を使用して AWS AppConfig から名前を取得し、後続の呼び出しのためにキャッシュします。

dev を停止する(例:Ctrl+C で)と、DynamoDB Local コンテナは自動的に削除されますが、名前付きボリュームは保持されるため、データは再起動後も保持されます。

グローバルセカンダリインデックスの追加/削除

Section titled “グローバルセカンダリインデックスの追加/削除”

GSI は、プロジェクトルートの config.jsontableConfig.globalSecondaryIndexes キーで定義されます。GSI キーのシングルテーブル設計命名規則に従って、各 GSI のエントリを追加してください:

config.json
{
...
"tableConfig": {
"globalSecondaryIndexes": [
{
"indexName": "gsi1pk-gsi1sk-index",
"partitionKey": "gsi1pk",
"sortKey": "gsi1sk"
},
{
"indexName": "gsi2pk-gsi2sk-index",
"partitionKey": "gsi2pk",
"sortKey": "gsi2sk"
}
]
}
}

sortKeyフィールドは、ハッシュキーのみのGSIの場合はオプションです。

この設定ファイルは、すべての利用者が読み取る唯一の信頼できる情報源です:

  • ローカル開発devconfig.jsonを読み取り、GSIリストに一致するようにローカルテーブルを作成または更新します
  • CDK — コンストラクトは合成時にconfig.jsonを読み取るため、GSIの変更は次回のcdk deployに反映されます
  • Terraform — モジュールはplan/apply時にconfig.jsonを読み取ります

任意の TypeScript プロジェクトで、DynamoDB パッケージからエンティティファクトリをインポートして直接使用します:

import { createExampleEntity } from '@my-scope/my-table';
const entity = await createExampleEntity();
const result = await entity.query.primary({ id: '123' }).go();

内部的には、createExampleEntity()resolveTableName() を呼び出して、実行時に AWS AppConfig からテーブル名を取得します。

DynamoDBジェネレーターは、選択したiacに基づいてCDKまたはTerraformインフラストラクチャを作成します。

CDKコンストラクトはcommon/constructsに作成されます。使用例:

packages/infra/src/stacks/application-stack.ts
import { MyTable } from '@my-scope/common-constructs';
export class ApplicationStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const table = new MyTable(this, 'Table');
}
}

これにより、以下の設定でDynamoDBテーブルがプロビジョニングされます:

  • pk(パーティションキー)とsk(ソートキー)、両方ともString
  • config.jsonで定義されたグローバルセカンダリインデックス
  • オンデマンド(PAY_PER_REQUEST)課金
  • 自動キーローテーション付きのカスタマー管理KMS暗号化
  • ポイントインタイムリカバリが有効
  • 削除保護が有効
  • AWS AppConfigのdynamodb名前空間下のランタイム設定にテーブル名が登録される

削除保護はデフォルトで有効になっており、誤ってテーブルを削除することを防ぎます。

短期間の開発環境やプレビュースタックなど、テーブルの削除が想定される環境では無効にします。

packages/infra/src/stacks/application-stack.ts
import { MyTable } from '@my-scope/common-constructs';
const table = new MyTable(this, 'Table', {
deletionProtection: false,
});

テーブルはデフォルトでオンデマンド(PAY_PER_REQUEST)課金になります。予測可能で高スループットのワークロードには、プロビジョニングされたキャパシティに切り替えます。

packages/infra/src/stacks/application-stack.ts
import { BillingMode } from 'aws-cdk-lib/aws-dynamodb';
import { MyTable } from '@my-scope/common-constructs';
const table = new MyTable(this, 'Table', {
billingMode: BillingMode.PROVISIONED,
readCapacity: 5,
writeCapacity: 5,
});

ポイントインタイムリカバリはデフォルトで有効になっており、過去35日間の任意の時点にテーブルを復元できます。

ポイントインタイムリカバリの無効化

Section titled “ポイントインタイムリカバリの無効化”
packages/infra/src/stacks/application-stack.ts
import { MyTable } from '@my-scope/common-constructs';
const table = new MyTable(this, 'Table', {
pointInTimeRecoverySpecification: { pointInTimeRecoveryEnabled: false },
});

テーブルの暗号化に使用されるKMSキーは、デフォルトで自動キーローテーションが有効になっています。セキュリティポリシーで外部的にローテーションを管理している場合は無効にします。

暗号化キーのローテーションの無効化

Section titled “暗号化キーのローテーションの無効化”
packages/infra/src/stacks/application-stack.ts
import { MyTable } from '@my-scope/common-constructs';
const table = new MyTable(this, 'Table', {
enableKeyRotation: false,
});

connection ジェネレーターを使用して、このプロジェクトをワークスペース内の他のプロジェクトと統合します。このプロジェクトに関連する接続は以下の通りです:

tRPCAmazon DynamoDB
tRPC API to TypeScript DynamoDBtRPC API を DynamoDB テーブルに接続する
SmithyAmazon DynamoDB
Smithy API to TypeScript DynamoDBSmithy API を DynamoDB テーブルに接続する
Strands AgentsTypeScriptAmazon DynamoDB
TypeScript Agent to TypeScript DynamoDBTypeScript Agent を DynamoDB テーブルに接続する
Model Context ProtocolAmazon DynamoDB
MCP Server to TypeScript DynamoDBTypeScript MCP Server を DynamoDB テーブルに接続する