リソースの定義

HitCounterコンストラクトにリソースを追加する

次に、AWS Lambda関数とDynamoDBテーブルをHitCounter コンストラクトに定義します。

いつものように、まずDynamoDBコンストラクトライブラリをインストールする必要があります(既にLambdaライブラリがインストールされています)。

npm install @aws-cdk/aws-dynamodb

Windowsユーザーへの注意 : Windowsでは、バックグラウンドで動いている、npm run watch コマンドを停止する必要があります。 停止後、 npm install を実行し、再度 npm run watch を実行します。そうしなければ、使用中のファイルに関するエラーが発生します。

さて、lib/hitcounter.tsに戻ります。 次の強調表示されたコードを追加します。

import cdk = require('@aws-cdk/core');
import lambda = require('@aws-cdk/aws-lambda');
import dynamodb = require('@aws-cdk/aws-dynamodb');

export interface HitCounterProps {
  /** the function for which we want to count url hits **/
  downstream: lambda.Function;
}

export class HitCounter extends cdk.Construct {

  /** allows accessing the counter function */
  public readonly handler: lambda.Function;

  constructor(scope: cdk.Construct, id: string, props: HitCounterProps) {
      super(scope, id);

    const table = new dynamodb.Table(this, 'Hits', {
        partitionKey: { name: 'path', type: dynamodb.AttributeType.STRING }
    });

    this.handler = new lambda.Function(this, 'HitCounterHandler', {
        runtime: lambda.Runtime.NODEJS_8_10,
        handler: 'hitcounter.handler',
        code: lambda.Code.asset('lambda'),
        environment: {
            DOWNSTREAM_FUNCTION_NAME: props.downstream.functionName,
            HITS_TABLE_NAME: table.tableName
        }
    });
  }
}

上記のコードで何をしたのか

このコードは、今までのことをわかっていれば、非常に簡単に理解できるはずです。

  • DynamoDBテーブルにpathパーティションキーを定義しました(すべてのDynamoDBテーブルには単一のパーティションキーが必要です)。
  • lambda/hitcounter.handler にバインドされるLambda関数を定義しました。
  • Lambdaの環境変数とリソースとを紐付けるために functionNametableNameを定義しました。

遅延バインディング値

functionName , および tableName プロパティは、CloudFormationスタックをデプロイするときにのみ使われる値です(テーブル/関数を定義したときにこれらの物理名を構成していないことに注意してください。論理IDのみです)。これは、CloudFormationテンププレート作成中に値を出力すると、「トークン」を取得することを意味します。これは、CDKがこれらの遅延バインディング値を表す方法です。トークンを 不透明な文字列 として扱う必要があります。これは、たとえば、それらを連結することはできますが、コード内でそれらを解析したくないということです。

訳注: CDKでデプロイした時に、Lambda関数名等の末尾に長い文字列が追加されていることを確認したかと思いますが、あの値の説明です。 さらに詳細の説明はこちら