私はすでにここの投稿を検索しました (つまり、すべての呼び出しが非同期であることを考えると、ラムダ内で順次 AWS サービス呼び出しをどのように構造化しますか? ) および他の場所で、私が乗り越えるのに役立つ少しの情報を見つけることができないようですこの悩ましい問題。ループを反復処理する Lambda 関数があり、そのループ内で s3.putObject() の呼び出しを行う場合、context.succeed()/context.fail を適切に処理しようとすると短絡の問題が発生します。 () または Lambda プロセスを閉じる古い context.done(null, 'msg') 方法。
IE 反復では、アップロードする現在のオブジェクトで s3.putObject() を呼び出す必要がありますが、正常にアップロードされたファイルを cloudwatch またはおそらく SQS/SNS に出力します。ただし、このタイプのクロージャーを関数に入れようとする私の試みはすべて、ファイル名を取得することもあれば、ファイル名の一部のみを取得することもあるなどのランダムな結果に遭遇します。
それを行う最良の方法は何ですか?私は Q と async を使用しようとしましたが、正直なところ、私はまだこれらすべてを学んでいます..
以下は、私がやろうとしていることの大まかな例です:
function output(s3Object){
s3.putObject(s3Object, function(err, data){
if (err) {
console.log('There was an issue with outputting the object.', err);
} else {
// how do you properly close this if you have x number of incoming calls??
// context.done(null, 'success');
}
// and later in the code where it actually calls the output function
// and NOTE: it should output all of the file names that the invocation uploads!
for (var a = 0; a < myRecords.length; a++){
output(myRecords[a]);
}
しかし、前に述べたように、これまでに行った試みはすべて、さまざまな結果をもたらします。
Successfully output object: myBucket/prefix/part_000000123432345.dat
Successfully output object: myBucket/prefix/part_000000123432346.dat
しかし、関数出力の別のテスト:
Successfully output object: myBucket/prefix/part_000000123432346.dat
ああ。