2016-01-14 24 views
5

プリセットS3バケットにオブジェクトがアップロードされたときにメールを送信するために、AWSラムダ関数(Pythonで書かれています)を使用しています。オブジェクトはAWS PHP SDKを介してS3バケットにアップロードされ、マルチパートアップロードを使用しています。私が(ラムダコードエディタのページ内で)自分のコードをテストすると、うまくいくように見え、私はただ一つの電子メールを得るだけです。AWSラムダ関数の2回の呼び出し

しかし、オブジェクトがPHP SDKを介してアップロードされると、ラムダ関数は2回実行され、メッセージIDが異なる2つの電子メールが送信されます。私は別の電子メールアドレスを試しましたが、各アドレスは2つの重複した電子メールを受信します。

私が間違ってどこに行けるか教えてくれる人は誰ですか?私は電子メールを送信するためにサンプルPythonコードでインポートされたboto3ライブラリを使用しています。

+0

まず、2回アップロードしていないことを確認できますか? PutObjectはラムダをトリガーしていますか?重複した電子メールの時間差は何ですか? – helloV

+0

@helloVオブジェクトはS3バケットに一度アップロードされます。 PutObjectは、電子メールが正しく送受信されるとラムダをトリガーします。 2つの電子メールは正確に2秒間隔で受信されます。 –

答えて

7

はい、これもあり、電子メールにはリンクされていません.S3が複数のイベントを1回アップロードするとリンクしています。多くのメッセージングシステムと同様に、AmazonはS3からのイベント通知の "一度だけの配信"を保証しないので、ラムダ関数はこれを処理する必要があります。

最大ではありませんが、実行可能です。

特定のイベントメッセージを処理したかどうかを確認できるように、以前のいくつかのリクエストの詳細を含むキャッシュ形式。

+0

ラムダ関数の中でどのようにキャッシュするのですか? – idbehold

+0

おそらくRedisやDynamoDBのようなものを使用しています。キャッシュはラムダ呼び出しの間に存続する必要があるため、ラムダ関数の外にある必要があります。 – smcstewart

1

私は同じバグに直面しています.3バケットのすべてのPUTイベントでラムダがトリガーしなければならない場合、同じaws_request_idaws_lambda_arnで2回トリガーします。

これを修正するには、aws_request_id(このIDは各ラムダイベントごとに一意になります)のどこかに記録し、ハンドラをチェックしてください。同じaws_request_idが存在する場合は何もしないでください。それ以外の場合は通常通り処理してください。

+0

複数の発火を防ぐためにx-amz-request-idの値をどのように格納すれば、2番目のトリガーは比較する変数がない新しいラムダを起動します。リクエストIDをRDSインスタンスに格納する必要があることを示唆している場合を除きます。 – Shek

関連する問題