2016-06-01 15 views
3

私は、1つのトピックからSNSイベントを処理するようにAWSラムダ機能を設定しました。関数が実行されると、いくつかの他の通知を送信し、context.succeedまたはcontext.failを呼び出す可能性があります。 問題は、同じSNSイベントがラムダを複数回呼び出すように見えることです。私は最終的にはすぐにLambdaは同じSNSイベントを複数回処理していますか?

START RequestId: cd7afdf8-2816-11e6-bca2-6f2e3027c5e1 Version: $LATEST

まったく同じRequestIDの開始により、同じログに続く

END RequestId: cd7afdf8-2816-11e6-bca2-6f2e3027c5e1 REPORT RequestId: cd7afdf8-2816-11e6-bca2-6f2e3027c5e1 ...

を終了

START RequestId: cd7afdf8-2816-11e6-bca2-6f2e3027c5e1 Version: $LATEST

を参照してくださいCloudWatchのログを見てみます

トピックを送信してCloudWatchを見る彼のSNSイベントは、私が予想していたとしても、ただ1つしか公開されていないようだから、それはラムダ側の問題だと思われる。誰かが何らかの理由でイベントが私のラムダをこのように何度も引き起こしているかもしれないことを知っていますか?

編集:私はラムダが失敗を受け取ったときに起こっているように見えました。私はラムダで何らかの再試行設定を見ることはなく、デフォルトでこのように動作するとは期待していません。

答えて

4

Q

https://aws.amazon.com/lambda/faqs/ アマゾンラムダのFAQのページから:私のラムダ関数は、イベントの処理中に障害が発生した場合はどうなりますか?

失敗した場合、同期して呼び出されるラムダ関数は例外で応答します。非同期に呼び出されるラムダ関数は、少なくとも3回で再試行され、その後イベントが拒否される可能性があります。 Amazon KinesisストリームとAmazon DynamoDBストリームのイベントは、Lambda関数が成功するかデータが失効するまで再試行されます。 KinesisおよびDynamoDBストリームは24時間データを保持します。

+1

ホープのために再試行をトリガー直接適用可能と思われる。ラムダ関数は、HTTPを使用せずに、SNSによって直接呼び出すことができます。 –

+0

ありがとうございます。それは起こっているように見えます。残念なことに、私が行っていた報告を混乱させてしまったので、メッセージの失敗と見なしても呼び出しを成功させるだけで済むかもしれません。 – Squirrel

+0

このディテールを追跡することが非常に感謝しています - イベントルール(cronスタイル)が3回トリガされています...最初のタイムアウトが発生し、次の2つが成功します。 「少なくとも3回再試行した」とは、「少なくとも3回は試した」という意味です。 – keen

0

私はラムダクロンジョブ機能で同様の問題がありました。

exports.handler = (event, context, callback) => { 
// TODO implement 

var https = require("https"); 
token = "xxxxxxxx"; 

var options = { 
    host: "api.xxxxx.com", 
    path: "/manage/cronjob/video", 
    method: "GET", 
    headers: { 
     "Content-Type": "application/json", 
     "Authorization": "Bearer "+token 
    } 
}; 

var req = https.request(options); 
req.write(""); 
req.end(); 

//add timeout for context.done() 
setTimeout(function(){ 
    context.done(); 
    callback(null, 'Hello from Lambda'); 
},1000); //This timeout should be lower than the lambda's timeout }; 

で:私は私の修正は、以下のようなものだったので、それは、最初のバイト/応答(応答処理は必要ありません)を返すことができます前に、数秒間実行されるサービス/ APIにリクエストを送信するために必要なこれは一例で関数がタイムアウトエラー&を取得する前に、我々は、ラムダ出口を強制的に明示的なコールバックを持っている別の2回

は、この答えは技術的に正しいですが、ない、それは

関連する問題