kakakakakku blog

Weekly Tech Blog: Keep on Learning!

AWS CDK で Amazon EventBridge Pipes(SQS ソース・Step Functions ターゲット)を設定する

AWS CDK で Amazon EventBridge Pipes を設定する場合,AWS CloudFormation に沿った L1 ConstructCfnPipeを使う必要がある.今回はソース(Amazon SQS キュー)・ターゲット(AWS Step Functions ステートマシン)で Amazon EventBridge Pipes を構成する👌

docs.aws.amazon.com

ちなみに Amazon EventBridge Pipes をソース(Amazon SQS キュー)・エンリッチメント(AWS Lambda 関数)・ターゲット(Amazon ECS タスク)で構成するのは以下の記事にまとめた🔗 似てるところもあるので参考になれば〜 \( 'ω')/

kakakakakku.hatenablog.com

AWS CDK で試す

L1 Construct なので AWS CloudFormation の AWS::Pipes::Pipe のドキュメントも参考にしながら進めた.

docs.aws.amazon.com

👾 sandbox-cdk-sqs-pipes-stepfunctions-stack.ts

実装を簡単にするため,AWS Step Functions ステートマシンは Succeed のみにしている💡

AWS Step Functions ステートマシン

import {
  Duration,
  Stack,
  StackProps,
  aws_iam,
  aws_pipes,
  aws_sqs,
  aws_stepfunctions,
} from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class SandboxCdkSqsPipesStepfunctionsStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const queue = new aws_sqs.Queue(this, 'SandboxCdkQueue', {
      queueName: 'sandbox-cdk-sqs-pipes-stepfunctions-queue',
      visibilityTimeout: Duration.seconds(30),
      receiveMessageWaitTime: Duration.seconds(20),
    });

    const definition = new aws_stepfunctions.Succeed(this, 'Success!');

    const stateMachine = new aws_stepfunctions.StateMachine(this, 'SandboxCdkStepfunctions', {
      stateMachineName: 'sandbox-cdk-sqs-pipes-stepfunctions-state-machine',
      definitionBody: aws_stepfunctions.DefinitionBody.fromChainable(definition),
    });

    const pipeRole = new aws_iam.Role(this, 'SandboxCdkPipesRole', {
      roleName: 'sandbox-cdk-sqs-pipes-stepfunctions-role',
      assumedBy: new aws_iam.ServicePrincipal('pipes.amazonaws.com')
    });

    queue.grantConsumeMessages(pipeRole)
    stateMachine.grantStartExecution(pipeRole)

    new aws_pipes.CfnPipe(this, 'SandboxCdkPipes', {
      name: 'sandbox-cdk-sqs-pipes-stepfunctions-pipes',
      roleArn: pipeRole.roleArn,
      source: queue.queueArn,
      target: stateMachine.stateMachineArn,
      targetParameters: {
        stepFunctionStateMachineParameters: {
          invocationType: 'FIRE_AND_FORGET',
        }
      }
    });
  }
}

結果

以下のように期待通り Amazon EventBridge Pipes を設定できた❗️また動作確認として Amazon SQS キューにメッセージを送信すると,最終的に AWS Step Functions ステートマシンが実行された👌

Amazon EventBridge Pipes 画面

ポイント(ソース・ターゲット)

Amazon SQS キューを Amazon EventBridge Pipes の「ソース」に設定する場合は source に ARN を設定する.細かくパラメータを設定する場合は SourceParameterssqsQueueParameters を使う.

docs.aws.amazon.com

AWS Step Functions ステートマシンを Amazon EventBridge Pipes の「ターゲット」に設定する場合は target に ARN を設定する.細かくパラメータを設定する場合は targetParametersstepFunctionStateMachineParameters を使う.標準ステートマシンを実行する場合は invocationTypeFIRE_AND_FORGET を設定すれば OK👌

docs.aws.amazon.com

ポイント(実行ロール)

Amazon EventBridge Pipes の実行ロールに Amazon SQS キューの読み取り権限・AWS Step Functions ステートマシンの実行権限を与える必要がある.最小権限を考えるとポリシーの設定が大変だけど grantConsumeMessages(grantee) / grantStartExecution(grantee) を使えば簡単に設定できる.AWS CDK の grant は本当に便利だ〜💡

docs.aws.amazon.com

docs.aws.amazon.com