Skip to content

Smithy API から DynamoDB へ

connection ジェネレーターは、Smithy APITypeScript DynamoDB プロジェクトに接続し、ローカル開発環境で両方が自動的に一緒に起動するように設定します。

このジェネレーターを使用する前に、以下を確認してください:

  1. Smithy TypeScript API プロジェクト(ts#api--framework=smithy で生成)
  2. ts#dynamodb プロジェクト
  1. インストール Nx Console VSCode Plugin まだインストールしていない場合
  2. VSCodeでNxコンソールを開く
  3. クリック Generate (UI) "Common Nx Commands"セクションで
  4. 検索 @aws/nx-plugin - connection
  5. 必須パラメータを入力
    • クリック Generate

    Smithy API バックエンドプロジェクトをソースとして選択し、DynamoDB プロジェクトをターゲットとして選択します。

    パラメータ デフォルト 説明
    sourceProject 必須 string - ソース プロジェクト
    targetProject 必須 string - 接続先のターゲット プロジェクト
    sourceComponent string - 接続元のソース コンポーネント (コンポーネント名、ソース プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをソースとして明示的に選択するには '.' を使用します。
    targetComponent string - 接続先のターゲット コンポーネント (コンポーネント名、ターゲット プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをターゲットとして明示的に選択するには '.' を使用します。
    preferInstallDependencies boolean true ジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合はfalseに設定します(後続のジェネレーターがNxプロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。

    ジェネレーターは、Smithy API の project.json を更新し、その dev ターゲットから DynamoDB プロジェクトの dev ターゲットへの依存関係を追加します。ソースファイルは変更されません。

    オペレーションでの DynamoDB の使用

    Section titled “オペレーションでの DynamoDB の使用”

    DynamoDB パッケージからエンティティファクトリーをインポートし、オペレーション実装内で使用します:

    packages/api/src/operations/list-examples.ts
    import { createExampleEntity } from ':my-scope/my-table';
    import {
    ListExamplesOperationInput,
    ListExamplesOperationOutput,
    } from '../generated/ssdk/index.js';
    import { ServiceContext } from '../context.js';
    export const listExamples = async (
    _input: ListExamplesOperationInput,
    _ctx: ServiceContext,
    ): Promise<ListExamplesOperationOutput> => {
    const entity = await createExampleEntity();
    const result = await entity.scan.go();
    return { items: result.data };
    };

    Lambda 関数が DynamoDB テーブルにアクセスできるようにするには、インフラストラクチャで必要な権限を付与します。

    テーブルコンストラクトで grantReadWriteData を呼び出します。これにより、Lambda 実行ロールに必要な DynamoDB と KMS の両方の権限が付与されます:

    packages/infra/src/stacks/application-stack.ts
    import { MyTable } from ':my-scope/common-constructs';
    const table = new MyTable(this, 'Table');
    const api = new Api(this, 'Api', {
    integrations: Api.defaultIntegrations(this).build(),
    });
    Object.entries(api.integrations).forEach(([, integration]) => {
    table.grantReadWriteData(integration.handler);
    });

    connection ジェネレーターは、プロジェクトの dev ターゲットが DynamoDB プロジェクトの dev ターゲットに依存するように設定します。dev を実行すると、DynamoDB Local がプロジェクトと同時に自動的に起動します。

    LOCAL_DEV=true 環境変数は自動的に設定されるため、getDynamoDBClient()resolveTableName() は AWS ではなくローカルの DynamoDB Local インスタンスに接続します。