kakakakakku blog

Weekly Tech Blog: Keep on Learning!

AWS CDK のアルファモジュールで Amazon EventBridge Scheduler を設定する

AWS CDK で Amazon EventBridge Scheduler を設定する場合,現状では L2 Construct がなく AWS CloudFormation に沿った L1 ConstructCfnSchedule を使う必要がある.以下のドキュメントにも There are no official hand-written (L2) constructs for this service yet. と書いてある.

docs.aws.amazon.com

しかし「アルファモジュール」として aws-scheduler-alpha モジュールと aws-scheduler-targets-alpha モジュールが提供されていて使うことができる❗️もちろん Experimental(実験的な)モジュールなので,仕様変更などの可能性は十分にある👌 さっそく aws-scheduler-alphaaws-scheduler-targets-alpha を使って Amazon EventBridge Scheduler を設定してみる💡

docs.aws.amazon.com

docs.aws.amazon.com

アルファモジュールに関しては以下にまとまっている.

aws.amazon.com

aws-scheduler-alphaaws-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

docs.aws.amazon.com

あとは 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,
    });
  }
}

結果

Amazon EventBridge Scheduler のスケジュールを設定できた

Amazon EventBridge Scheduler のターゲットを設定できた