AWS CDK で Amazon EventBridge Scheduler を設定する場合,現状では L2 Construct がなく AWS CloudFormation に沿った L1 Construct の CfnSchedule
を使う必要がある.以下のドキュメントにも There are no official hand-written (L2) constructs for this service yet.
と書いてある.
しかし「アルファモジュール」として aws-scheduler-alpha
モジュールと aws-scheduler-targets-alpha
モジュールが提供されていて使うことができる❗️もちろん Experimental(実験的な)モジュールなので,仕様変更などの可能性は十分にある👌 さっそく aws-scheduler-alpha
と aws-scheduler-targets-alpha
を使って Amazon EventBridge Scheduler を設定してみる💡
アルファモジュールに関しては以下にまとまっている.
aws-scheduler-alpha
と aws-scheduler-targets-alpha
を試す
ドキュメントとコードを確認しつつ, 試してみたサンプルコード (TypeScript) を載せておく.
$ npm install @aws-cdk/aws-scheduler-alpha $ npm install @aws-cdk/aws-scheduler-targets-alpha
👾 sandbox-cdk-scheduler-stack.ts
まず aws_scheduler_targets_alpha.LambdaInvoke
を使って Amazon EventBridge Scheduler のターゲットとして AWS Lambda 関数を指定している.今回は既に存在する AWS Lambda 関数を aws_lambda.Function.fromFunctionArn
で取得している.ちなみに Amazon EventBridge Scheduler のターゲットは多くあるけど,現在は以下の10種類がサポートされている👏
LambdaInvoke
StepFunctionsStartExecution
CodeBuildStartBuild
SqsSendMessage
SnsPublish
EventBridgePutEvents
InspectorStartAssessmentRun
KinesisStreamPutRecord
KinesisDataFirehosePutRecord
CodePipelineStartPipelineExecution
あとは aws_scheduler_alpha.Schedule
でスケジュールを指定する.今回は cron ベースの設定にした🕐 もちろん rate ベース・1回限りの設定もできる👌 また AWS CDK の v2.116.0 からフレキシブルタイムウィンドウの設定ができるようになっていたりもして,今も積極的に開発が進んでいそう.
import { Stack, StackProps, TimeZone, aws_lambda, } from 'aws-cdk-lib'; import * as aws_scheduler_alpha from '@aws-cdk/aws-scheduler-alpha'; import * as aws_scheduler_targets_alpha from '@aws-cdk/aws-scheduler-targets-alpha'; import { Construct } from 'constructs'; export class SandboxCdkSchedulerStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); const lambda = aws_lambda.Function.fromFunctionArn(this, 'SandboxCdkLambdaFunctionHello', 'arn:aws:lambda:ap-northeast-1:000000000000:function:sandbox-cdk-hello-function'); const target = new aws_scheduler_targets_alpha.LambdaInvoke(lambda, { input: aws_scheduler_alpha.ScheduleTargetInput.fromObject({ 'myKey': 'myValue', }), }); new aws_scheduler_alpha.Schedule(this, 'Schedule', { scheduleName: 'sandbox-cdk-schedule', schedule: aws_scheduler_alpha.ScheduleExpression.cron({ minute: '0', timeZone: TimeZone.ASIA_TOKYO }), target, }); } }