全力で怠けたい

怠けるために全力を尽くしたいブログ。

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!
# 省略

以上。