S3に特定の2ファイルをアップロードするイベントパターンの構築

0

S3に、ファイルA、ファイルBの2つのファイル両方が、同日中に、アップロードされたことを契機に、Lambdaを実行したいと考えています。 特定の1ファイルがアップロードされた場合のLambda実行は下記のイベントパターンで、実装できました。 ※片方だけだった場合には発火されない仕様としたいです。 ※S3へのファイルアップロードは日に1回、それぞれ別のタイミングでアップロードされます。

下記 "key" を 複数指定すればよいのかとも考えましたが、うまくいっておりません。 実現可否、可能なら方法についてご回答いただけますと幸いです。

Amazon EventBridgeイベントパターン

 {
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["s3-trigger-test"]
    },
    "object": {
      "key": [{
        "prefix": "trigger/test.txt"
      }]
    }
  }
}

以上です、よろしくお願いいたします。

1回答
1
承認された回答

Tsumitaと申します。

実際には試していないのですが、AWS公式ドキュメントに記載のある $orを利用することで実現できると考えております(日本語ドキュメントには該当の記載がないので英語のドキュメントを参考にしていただけると幸いです) AWS 公式ドキュメント: Complex example with $or matching

参考JSON(実際に試していないので間違っていたらすみません)

 {
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["s3-trigger-test"]
    },
    "object": {
      "$or": [
        { "key": [ { "prefix":  "trigger/test1.txt"} ] },
        { "key": [ { "prefix":  "trigger/test2.txt"} ] }
        ]
    }
  }
}

ご参考になれば幸いです。

profile picture
Tsumita
回答済み 2年前
  • Tsumitaさん ご回答ありがとうございます。 頂戴した情報で、同時にファイルABをアップロードした際のLambda実行を確認できました。

    ただ私が質問時の情報を不足させていたのですが、S3へのファイルアップロードは日に1回、それぞれ別のタイミングでアップロードされるため、同時アップロードという状況は想定しておりませんでした。 申し訳ありません。

    もし何か追加での情報をお持ちでしたら、ご協力いただけますと幸いです。 よろしくお願いいたします。

  • 補足ありがとうございます。

    S3へのファイルアップロードは日に1回、それぞれ別のタイミングでアップロードされる

    こちらの条件ですと、おそらくEventBridge単体では実現できないと思います。
    両ファイルアップロードのタイミングでの発火が必須でなければ1日1回Lambdaを実行し、前日アップロードされたファイルを処理すれば良いと思います。

    もし、両ファイルがアップロードされたタイミングでの発火(処理)が必須であれば、Lambda内で同日中の"ファイルA and ファイルB"がアップロードされていることを確認後にLambdaで質問者様が想定する処理を行えば良いと思います。
    例1: ファイルAアップロード時に発火。ファイルBが未アップロードだったため、後続処理をせずに終了。
    例2: ファイルBアップロード時に発火。ファイルAがアップロード済だったため、後続処理をして終了。

    補足

    • ファイルAとファイルBのアップロードタイミング両方で発火するため、Lambdaが1日2回実行されてしまうのが受け入れられないのであれば、StepFunctionsにてイベントを待ち受てS3:ListObjectsChoiceを駆使することでLambdaを1日1回の発火にすることは可能かと思いますが複雑になります。
    • エラー処理や再実行は要考慮かと思います。
  • 情報のご提供ありがとうございます。 やはりEventBridge単体では出来ないと結論づけてよさそうですね。

    ご提案の通り、Lambda、StepFunction側での制御を検討してみようと思います。 細かなご回答誠にありがとうございました。

ログインしていません。 ログイン 回答を投稿する。

優れた回答とは、質問に明確に答え、建設的なフィードバックを提供し、質問者の専門分野におけるスキルの向上を促すものです。

質問に答えるためのガイドライン

関連するコンテンツ