HitCounterのLambdaハンドラーコードを記述しましょう。
lambda/hitcounter.ts
を作成し、次のコードを追記してください。
import { DynamoDB, Lambda } from 'aws-sdk';
export const handler: AWSLambda.APIGatewayProxyHandler = async (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!.toString());
};
このコードは、次の2つの環境変数を参照していることがわかります。
HITS_TABLE_NAME
データストアとして使用するDynamoDBのテーブル名DOWNSTREAM_FUNCTION_NAME
ダウンストリームLambda関数テーブルとダウンストリーム関数の名前はアプリをデプロイするときに決まるため、これらの値をコンストラクトコードから関連付ける必要があります。 次のセクションでそれを行います。
Lambda関数がさらに別のLambda関数を呼び出すようになっています。 呼び出される側のLambda関数をダウンストリームLambda関数、あるいは単にダウンストリーム関数とここでは呼んでいます。