HitCounterハンドラー

HitCounter Lambda ハンドラー

HitCounterのLambdaハンドラーコードを記述しましょう。

lambda/hitcounter.jsのファイルを作成し、次のコードを追記してください。

const { DynamoDB, Lambda } = require('aws-sdk');

exports.handler = async function(event) {
  console.log("request:", JSON.stringify(event, undefined, 2));

  // create AWS SDK clients
  const dynamo = new DynamoDB();
  const lambda = new Lambda();

  // update dynamo entry for "path" with hits++
  await dynamo.updateItem({
    TableName: process.env.HITS_TABLE_NAME,
    Key: { path: { S: event.path } },
    UpdateExpression: 'ADD hits :incr',
    ExpressionAttributeValues: { ':incr': { N: '1' } }
  }).promise();

  // call downstream function and capture response
  const resp = await lambda.invoke({
    FunctionName: process.env.DOWNSTREAM_FUNCTION_NAME,
    Payload: JSON.stringify(event)
  }).promise();

  console.log('downstream response:', JSON.stringify(resp, undefined, 2));

  // return response back to upstream caller
  return JSON.parse(resp.Payload);
};

実行時のリソースの発見

このコードは、次の2つの環境変数に依存していることがわかります。

  • HITS_TABLE_NAME ストレージを使用するDynamoDBテーブルの名前
  • DOWNSTREAM_FUNCTION_NAME AWS Lambda 関数のダウンストリーム

テーブルとダウンストリーム関数の実際の名前はアプリをデプロイするときにのみ決定されるため、これらの値をコンストラクトコードから関連付ける必要があります。次のセクションでそれを行います。