Lambda を定期実行する CloudWatch イベントルールを作る CDK のスニペット。
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! # 省略
以上。