🤖

EventBridge+S3のsuffix(preffix)条件付きイベント検知をでCDKで構築する

2023/03/06に公開

目的

  • S3に特定のsuffix(".txt"とか)のオブジェクト追加を検知してLambdaを起動させたい
  • その仕組みをCDKで構築する

参考にした記事やブログ

https://zenn.dev/nmemoto/articles/s3-eventnotification-with-eventbridge

https://dev.classmethod.jp/articles/amazon-eventbridge-enhanced-filtering-capabilities/

https://github.com/aws/aws-cdk/issues/6184

※該当しているっぽいissueは直接的な実装参考とはなりませんでした。

内容、CDKでの実装方法

S3バケットを作成する際にeventBridgeEnabledをtrueに設定する

    // Bucket の作成
    const bucket = new s3.Bucket(this, `Sample-EventBridge-S3-Bucket`, {
      eventBridgeEnabled: true,
      bucketName: 'XXX'
    });

v2.20.0以降のバージョンでは、class Bucket (construct)にあるように、この設定だけでEventBridgeに通知を送ることができるようになる。

とのことです。

EventBridgeルールを生成する

    // EventBridge Rule作成
    const rule = new events.Rule(this, `Sample-EventBridge-S3-Rule`, {
      ruleName: `Sample-EventBridge-S3-Rule`,
      eventPattern: {
        source: [
          "aws.s3"
        ],
        detailType: ["Object Created"],
        resources: [bucket.bucketArn],
        detail: {
          "object": {
            "key": [{
              "suffix": ".txt"
            }]
          }
        }
      },
      targets: [new LambdaFunction(fn)],
    });

ここで、detailの中に、object > key > suffix を設定することで実現したいFilteringを構築できました。この内容は参考にしたブログ内もある実際にsuffixを設定する場合に設定されるJSONと同じになります。targetsでLambdaを設定していますが、Lambdaの定義は省略しています。

※もっと良いやり方があれば教えてください。

ソースコード

こちらにコードを置いてあります。
https://github.com/kodai305/eventbridge-s3-cdk-sample

まとめ

ほぼ自分の備忘録目的の記事になりますが、suffixの設定に少し手こずったので、同様のことをしたい人の参考になれば幸いです。

Discussion