🤝

Amazon EventBridge Pipesを使って、ECS Taskを起動するAWS CDKスタックを作ってみた

2023/12/21に公開

この記事はAWS Community Builders Advent Calendar 202321日目の記事です。


1年遅れでAmazon EventBridge Pipesを触ってみて、
Amazon EventBridge Pipesを使って、ECS Taskを起動させるという検証がてら作ったので、とりあえずアウトプットです。

なお、めちゃくちゃECS初心者なので、ちゃんと作るのこれ初めてだったりします。(いやマジで)

きっかけ

普段はAWS Lambdaで色々作ってしまう人なんですが、
業務で、これはどうみてもコンテナの出番だろう・・・というようなちょっと重ための処理(バッチですよ。はい)を作ることになりました。

どうやって、ECS Taskを起動するか?

ローカルでアプリの開発が終わって、さて、どういう構成にするかな?と検討を開始したところ、
ECS Taskを起動させる方法が問題になりました。
方法としては、

  • SQS から AWS Lambda 呼び出して ECS Task起動
  • Step Functions で ECS Task起動

処理的にはSQSトリガーでいいかな?となり、
となると、SQS から AWS Lambda 呼び出して ECS Task起動 かな?
と思ったんですが、起動のためだけにLambdaかますのはうーん・・・ってなって(一番好きなAWSサービスはAWS Lambdaです!)、
調べたところ、Amazon EventBridge Pipes でECS Task起動できんじゃんって今更ながらに知り(1年遅れでごめんなさい)、これだな。と言うことになりました。
ついでにAWS CDK v2で構築してみることにもしたわけです。

Amazon EventBridge Pipes について

Amazon EventBridge Pipesについてはこちら。

https://aws.amazon.com/jp/eventbridge/pipes/

作ったもの

以下で公開しています。

https://github.com/Kenichiro-Wada/cdk-eventbridge-pipes-ecs-tasks

必要なもの等も記載しています。
なお、CDKの動作は2023/12/21現在のCloud9で確認しています。

architecture

構築に当たっては、以下サイトを参考にしています。

https://zenn.dev/ma2shita/articles/8a138d53e4ef9a

https://dev.classmethod.jp/articles/cdk-ecs-ecr/

この場を借りて感謝申し上げます!ありがとうございます。

もし実行してみる場合の注意点的なもの

サンプルのコード、2箇所ほど書き換える必要があるので、チェックアウト後に変更をお願いします。

VPCについて

今回の要件では、既存のVPCを使う要件があるので、サンプルでも既存VPCのID等を指定し、Publicなサブネットの情報をインポートして使っています。(要件上はPublicなSubnetはNGだけど、サンプルはPublicにしてます)
VPCのIDは環境に合わせて変更をお願いします。

新たにVPCを一緒に作って・・・という場合は、公式を参考に作ってみてください。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html

名前とCIDRを指定すれば作れますが、NAT GatewayをAZ毎に作ってくれるので、その辺は注意は必要です。
コンテナ自体をPrivateなSubnetで起動させる場合は、NAT Gateway(NATインスタンス)もしくはVPC エンドポイントが必要です。
https://zenn.dev/yoshinori_satoh/articles/ecs-fargate-vpc-endpoint

Pipesのログを Cloudwatch Logsに書き出すときの注意点

2023年11月のアップデートで、Cloudwatch Logs等へのログ出力をサポートするアップデートがあったので、それも含めています。

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-eventbridge-logging-improved-observability/

最初作ったら、エラーになって、え?対応していない?と、とち狂ってissue投げてみましたが、何のことはない、
Typoとaws-cdk-libののバージョンが古い環境でやっていました。Typoと混在注意です。そしてほんとすみません。

解決したところで、設定していますが、
PipeLogConfigurationPropertyでOptionalになっている level ですが、指定しなくても、cdk diffではエラーになりませんが、実行時にエラーになります。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_pipes.CfnPipe.PipeLogConfigurationProperty.html

サンプルコード上は指定済みなので、エラーにはならないはずです。

L2の時に未設定でもこの辺うまく設定するようになってくれないかなぁ・・・と思って、とりあえずPipesがL2対応がされることを待っております。

まとめ

2023年初めから、やってみなきゃ!って思っていたサービスをようやくやってみました。
EventBridge Pipes、なかなか便利ですね、フィルター、強化は今回は試してみませんでしたが、機会を作ってやってみたいですし。
他の処理も繋げてみたいと思います。

コンテナについては、引き継いだもの以外は初めてちゃんと触っているので、
なかなか楽しい反面。まだまだわからんこと多いので、引き続き勉強していきたいと思います。

とりあえず検証結果をもとに、業務で必要なバッチ(ええ、バッチですよ)の構築が終わって、絶賛テスト中です。きっといける。

Special Thanks

  • AWSコンテナ設計・構築[本格]入門

https://amzn.asia/d/eRUufiv

  • SQSからCloudWatch Logsに記録するAmazon EventBridge Pipesを構築するAWS CDK スタック(2度目)

https://zenn.dev/ma2shita/articles/8a138d53e4ef9a

  • ECSとECRのコンテナ構成をCDKで実装してみた(2度目)

https://dev.classmethod.jp/articles/cdk-ecs-ecr/

  • EventBridge Pipes で Tweet をあれこれする - あなたと「|」したい...後記 -

https://track3jyo.com/2022/12/pipes-with-you/

  • [CDK] Vpc.fromLookup()でエラー 「Cannot retrieve value from context provider vpc-provider since account/region are not specified at the stack level」が出る

https://akamist.com/blog/archives/5332

Discussion