2016-11-14 23 views
0

同じラムダ関数をsetInterval関数を使用して連続的に呼び出すと、問題が発生していました。awsラムダ関数でのsetIntervalの使用方法

ラムダ関数私は私のMongoDB内のドキュメントのいくつかを更新しようとしています

var MongoClient = require('mongodb').MongoClient 
 
    , format = require('util').format; 
 

 
function funUpdateCommand(event,context,callback){ 
 

 
var mongoUrl='mongodb://**.**.**.**:*****/DBname'; 
 
// var mongoUrl='mongodb://127.0.0.1:27017/DBname'; 
 

 
MongoClient.connect(mongoUrl, function(err, db) { 
 
    
 
    if(err) throw err; 
 

 
var collection = db.collection('device'); 
 

 
var interval = setInterval(function() { 
 
\t collection.find({"deviceCommand.command":"getAudio","deviceCommand.timestamp":{ $lte: new Date((new Date)*1 - 60000*2)}}).toArray(function(err, results) {   
 
\t \t   if(err){ 
 
\t \t   \t console.log(err); 
 
\t \t   }else{ 
 
\t \t \t   for(var i=0;i<results.length;i++){ 
 
\t \t \t \t   collection.update({_id:results[i]._id},{$set:{"deviceCommand.command":" "}},function(err, results) { 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t }); \t 
 
\t \t \t  } \t 
 
\t \t  } 
 
\t  }); 
 
    }, 5000); 
 
}); 
 

 
context.succeed("Successfully uploaded"); 
 

 
} 
 

 
exports.handler=funUpdateCommand;

は、私は、連続的なバックグラウンドジョブとしてAWSのラムダ関数を実行する必要がありますが、のsetIntervalを使用した場合タイムアウトエラーを返します。

どうすれば私のawsラムダ関数をsetIntervalを使って連続的に実行できますか?

答えて

3

ラムダを永遠に実行することはできません。ラムダ機能の寿命は300秒に制限され、300秒後に機能が消滅します。 CloudWatch Eventsを使用して、同じラムダ関数をcron式で呼び出すことができます。

ラムダ制限の詳細については、hereをご覧ください。

+0

aws lambda関数を起動するためにCloudWatch Eventsを使用していましたが、今は1分ごとに呼び出していますが、30秒ごとにスケジュールする必要があります。それは可能ですか?もしそうなら、どのように? – Sabreena

+0

残念ながら、CloudWatchイベントは第2レベルの精度をサポートしていません。 – taskiner

+0

OK、ありがとうございました:-) – Sabreena

2

他の潜在的な接続の問題やタイムアウトを除外することなく、ラムダ機能は長時間にわたって実行することを意図していません。 Amazonは、オンデマンドで呼び出されるプラットフォームを設計し、マイクロサービスのように実行したり、長期間生き続けることはできません。

あなたは馬の口hereからそれを読むことができます:

Q:どのくらいのAWSラムダ関数を実行することができますか?

AWSラムダへのすべての呼び出しは、300秒以内に実行を完了する必要があります。デフォルトのタイムアウトは3秒ですが、タイムアウトを1〜300秒の任意の値に設定できます。

定期的に実行、接続、作業、切断するように機能をスケジュールすることができます。

-1

awsの仕組みはわかりませんが、cronで試してみましたか? 例えば、これは

new CronJob("0 0 * * * *", YOURFUNCTION, null, true, 'America/Los_Angeles'); 

https://www.npmjs.com/package/cron

+0

これはAWS Lambdaでは機能しません。 –

0

@taskinerが正しいかを参照してください、YOURFUNCTIONに各時間を起動します。 CloudWatchは1分に1回より頻繁にトリガーをサポートしておらず、ランバーはラン長が300秒に制限されています。あなたががカップルのオプションを持っています:

のsetTimeout: あなたはしかし、毎分あなたのラムダをトリガするCloudWatchの設定ができ、その後、あなたは、時間の使用setTimeoutに基づいて、次の30秒間隔でコードを実行することができ、一度それを繰り返してから終了してください。私の頭の上オフ

var THRITY_SECONDS = 30000; 

module.exports.handler = function(context, event, callback) { 
    scheduleNext(runTask, function(){ 
      scheduleNext(runTask, callback); 
    }); 
}; 

function scheduleNext(task, callback) { 
    var now = new Date().getTime(); 
    var nextInterval = Math.ceil((new Date().getTime()/THIRTY_SECONDS) * THRITY_SECONDS); 
    var delay - nextInterval - now; 
    setTimeout(function() { 
      task(callback); 
    , delay); 
} 

function runTask(callback) { 
    // your code executes here 

    callback(); 
} 

ジャスト機能は40秒間実行されている場合(1時01分30秒と1でrunTask実行し、1時01分20秒PMに開始することをお勧めします。 02:00)、30秒の計算時間が請求されます。コスト分析を自分で行い、それをt2.microインスタンスの実行コストなどと比較する必要があります(スポットインスタンスはコスト削減に役立ちます)。

外部のcron:あなたは彼らがあなたが定義したスケジュールにあなたの機能をトリガするためにAWS CLIを使用してcronジョブを実行する可能性があり安定していた別の場所にサーバリソースを持っていた場合 別のオプションは次のようになります。

もちろん、これを実行している場合は、単にそのサーバーでタスクを実行しないでください。

イベントトリガー ラムダは、イベントのトリガで実行し、データが(S3バケット/オブジェクトの変更、DynamoDBの変更、など)が利用可能になったとき、あなたのラムダをトリガーするいくつかのサポートサービスがあります。あなたのユースケースに応じて(新しいデータを処理するためにmongodbを照会しているように見えます)、DynamoDBにイベントを書き込み、ラムダをテーブルのストリームに接続するか、オーディオファイルをs3に保存してラムダ新しいファイルを待ち受けます。これはラムダを使用することのコストメリットを見る場所です。ラムダは作業があるときにのみ実行されるためです。

関連する問題