Lambda を定期実行する CloudWatch イベントルールを作る CDK のスニペットを書いておく。
Lambda を定期実行する CloudWatch イベントルールを作る CDK のスニペット
Lambda を定期実行する CloudWatch イベントルールを作る CDK のスニペットを書いておく。
CDK のバージョン。
$ cdk --version 1.62.0 (build 8c2d7fc)
CDK のコード
CDK アプリはこんな感じのディレクトリ構成を想定してる。
├── bin │ └── cdk-event-rule.ts ├── cdk.json ├── cdk.out ├── lib │ └── cdk-event-rule-stack.ts │ (省略)
bin/cdk-event-rule.ts はこんな感じに書いていく。
import 'source-map-support/register'; import * as cdk from '@aws-cdk/core'; import { CdkEventRuleStack } from '../lib/cdk-event-rule-stack'; const app = new cdk.App(); new CdkEventRuleStack(app, 'CdkEventRuleStack');
lib/cdk-event-rule-stack.ts はこんな感じに書いていく。
Lambda 関数は1分毎に Hello World! をログに出力するだけのやつ。
あと Lambda 関数の構築で deprecated な lambda.Code.inline() を使ってるけど実際に使うときはこのへんは適宜 deprecated じゃないメソッドを使うようにしていく。
import * as cdk from '@aws-cdk/core'; import * as events from '@aws-cdk/aws-events'; import * as targets from '@aws-cdk/aws-events-targets'; import * as lambda from '@aws-cdk/aws-lambda'; export class CdkEventRuleStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const fn = new lambda.Function(this, `my-lambda-function`, { functionName: "hello-world", code: lambda.Code.inline(` def lambda_handler(event, context): print("Hello World!") `), handler: "index.lambda_handler", runtime: lambda.Runtime.PYTHON_3_7, }); const target = new targets.LambdaFunction(fn); new events.Rule(this, `my-event-rule`, { ruleName: 'every-minute', schedule: events.Schedule.cron({minute: '*/1'}), targets: [target], }); } }
構築したリソースと Lambda 関数の実行ログの確認
CDK アプリをデプロイしたら Lambda 関数と CloudWatch イベントルールが作られてるのを確認してく => ちゃんと作られてそう。
# Lambda 関数
$ aws lambda get-function-configuration --function-name='hello-world' | jq -r '.FunctionName'
hello-world
# CloudWatch イベントルール
$ aws events describe-rule --name='every-minute'
{
"Name": "every-minute",
"Arn": "arn:aws:events:<region>:<account-id>:rule/every-minute",
"ScheduleExpression": "cron(*/1 * * * ? *)",
"State": "ENABLED",
"EventBusName": "default"
}
Lambda 関数と CloudWatch イベントルールをデプロイして2, 3分くらい待ったら Lambda 関数の実行ログが CloudWatch に出力してるか確認していく。
こんな感じで Hello World! が出力してて Lambda 関数はちゃんと動いてそう。
$ LOG_STREAM=$(aws logs describe-log-streams --log-group-name='/aws/lambda/hello-world' | jq -r '.logStreams[0].logStreamName')
$ aws logs get-log-events --log-group-name='/aws/lambda/hello-world' --log-stream-name="${LOG_STREAM}" | jq -r '.events[].message' | grep 'Hello World!'
Hello World!
Hello World!
# 省略
以上。