複数のs3イベントをチェックして、すべてが満たされたときにラムダをトリガーしますか?
一連のラムダ関数を実行するステップ関数があります。3つの入力ファイルがすべて更新されたときにこれを毎日トリガーするラムダを設定したいと思います。
s3イベントからトリガーできることは知っていますが、3つすべてを更新する必要があるという要件をどのように取得できますか?つまり、3つのイベント(「または」条件)のいずれかでトリガーを起動したくないので、3つすべてが更新されたときにトリガーしたい(「および」条件)。
このようなトリガーイベントの設定にはどのようにアプローチしますか?
ありがとう
回答
「これらの3つのファイルがアップロードされた後にのみ実行する」というトリガーを定義する方法はありません。
このロジックは自分で実装する必要があります。
アップロードにより、AWSLambda関数がトリガーされます。この関数は、他の2つのファイルの存在を確認する必要があります。それらが存在する場合は、処理を続行する必要があります。それらが存在しない場合は、終了する必要があります。
今のように、そのような条件に基づいてラムダをティガーする直接的な方法はありません。ステップ関数をトリガーする別のラムダでロジックを記述する必要があります。
LambdaからStepFunctionをトリガーする方法についてはこちらを参照してください。
ここで、ファイルをチェックするLambdaのロジックについて説明します。ここでは、これら3つのファイルすべてを知っているか、少なくともファイルプレフィックスを知っていると思います。したがって、ファイルがS3にアップロードされるたびに、3つのファイルがあるかどうかをLambdaで確認できます。 3つのファイルがすべて見つかった場合は、Lambdaから直接ステートマシンをトリガーできます。それ以外の場合は、そこで停止できます。 Step Machinesの実行が完了したら、これら3つのファイルをクリーンアップするか、名前を別の名前に変更するか、これらのファイルを別の「フォルダー」に移動して、次回これら3つのファイルのいずれかをアップロードするときにラムダが実行するようにします。ステートマシンをトリガーしません。
私が考えることができる他のロジックは、これらすべてのファイルを一緒にアップロードすることですzip
。zipがS3にアップロードされると、ラムダは通知を受け取り、そのzipを処理して、3つのファイルすべてを抽出し、処理を実行して、処理されたデータでステートマシンをトリガーします。
これが私が使い終わった解決策です。ファイルごとにトリガーを持つ単一のラムダを使用しています。ラムダは、トリガーごとに、トリガーしたファイルの名前をs3に保存されているファイルに追加します。次に、続行するために必要なすべてのファイル名がファイルに含まれているかどうかを確認します。含まれている場合は、stepfunctionを開始し、リストをクリアします。lambda_function(event、context)を介してデフォルトで渡されるイベントオブジェクトからラムダをトリガーするファイルの名前をキャプチャしています。
したがって、特定の日に、同じラムダが複数回トリガーされ、すべてが収集されるまで毎回ファイル名が記録されます。