2017-05-09 36 views
2

このラムダ関数をNodeから作成して、APIから30日分の情報を取得しようとしていますが、情報量のために一度に1日しか実行できません。これを実行する現在の試みは、ラムダの新しいインスタンスをラムダ自体から何度も繰り返し呼び出して、HOW_MANY_DAYS_AGO> 0まで実行されるたびに日付から1日を引く関数を持つことです。この情報をRDSにアップロードします結果を計算してWebページに投稿するSQL文を実行します。ラムダを10日かそれ以下で動かせば、完璧に動作します。 30日間実行しようとすると、実行するたびに11日目または12日目にこのエラーが発生します。あまりにも速く発砲していると仮定しているため、コード全体のさまざまな箇所で遅延を設定しようとしました。60秒の遅延対60秒の遅延aws-lambda/RDSエラーメッセージ?

18:27:53 
2017-05-09T18:27:53.505Z e720be2f-34e4-11e7-90ca-3f2ffa915b81 { StatusCode: 
200, FunctionError: 'Unhandled', Payload: '{"errorMessage":"RequestId: 
3243f8d3-34e5-11e7-b0a2-df429a0d6565 Process exited before completing 
request"}' } 
2017-05-09T18:27:53.505Z e720be2f-34e4-11e7-90ca-3f2ffa915b81 { StatusCode: 
200, 
FunctionError: 'Unhandled', 
Payload: '{"errorMessage":"RequestId: 3243f8d3-34e5-11e7-b0a2-df429a0d6565 
Process exited before completing request"}' } 

我々はまた、時々、それは11日、情報の12日に到達したときにも起こるデータ変数が定義されていないと言う、我々はAPIから情報を引き戻すエリア内CloudWatchの中のラムダ・エラー・メッセージを、取得しますまだ10歳未満のときに動作します。これにより、使用しているAPIのオーバーロードが発生しているとも考えられました。

上記のエラーのペイロードは、私がevent.variableのラムダに渡すものです。私たちは約30日間の情報のためにそれを実行しようとするたびに、およそ11-12日目にこのエラーが発生します。このエラーメッセージは、RDSデータベースに接続した直後に表示されます。私はまだ基​​本的にこのようなもののほとんどは初心者ですので、この "未処理のペイロード"がラムダ、またはrdsに関連しているかどうかはわかりませんでしたが、RDSに関係していると思うように傾いています。私はこれまでにこのエラーを見たことがないし、それを研究するときかなり広いエラーであるようだ。

RDSの場合、このエラーの原因となる可能性があります。どうすれば回避できますか?私のデータベースが負荷を処理するには弱すぎますか?狂ったことは、次のラムダの呼び出しの間に60秒の遅延を設定したとしても、私はまだこのエラーが発生します。しかし、ラムダをコンソール内で60秒のトリガーに設定し、30分後に手動でオン/オフすると、完璧に動作します。私は、ラムダの新しいインスタンスを呼び出すために私のコードで60秒の遅延を設定し、60秒ごとにラムダの新しいインスタンスを両方とも起動しているときに、コンソールを通して60秒のトリガを設定するという違いを理解していません。なぜなら、1つの違いが私のコードで60秒ごとに呼び出され、もう1つがAWSラムダコンソールを通して60秒ごとに呼び出されるということだけです。

目標は、フォームの1つからラムダへの情報を運ぶ、API-Gatewayのhttpエンドポイントを介してWebページのフォーム提出時にラムダをトリガーさせることです。 api-gatewayからのトリガが動作し、ラムダがポイントまで動作するので、エンドポイントに60秒トリガを有効にして1800秒または30分後にオフにすることができれば、100%の事実はわかります完全に機能する。しかし、ラムダを呼び出す方法が本質的に同じことをしているときに、そのエラーメッセージの原因を見つけることができないということがなぜうまくいかないのか分からないということが私に襲ってきました。

答えて

0

私はこの問題の原因を発見しており、AWS-λ関数を再帰的にループしようとすると60秒の遅延が働かないことは確かです。それを説明する私の最高の試みから、あなたがプログラムでラムダを呼び出すとき、デフォルトでは、それは "同期モード"に設定されます。 2つのAWS-Lambda関数があるとします。あなたはラムダ1からラムダ2を呼び出します。ラムダ1は、ラムダ2が終了するまでそれ自身を終了したとは考えません。ラムダ2が3番目のラムダを呼び出すと、それは失敗する運命のチェーンを開始します。それに加えて、呼び出されたラムダが2分の時点で終了していなければ、それは再び2分後に3回目の実行を試みます。

私はそれを実行していたので、基本的に連鎖反応を起こしていました。それがさらに進むにつれて、チェーンが長くなったため、より多くのラムダが2、4分のマークに当たって、同じ日のエントリーがデータベースに複数回アップロードされ、RDSへの接続が氾濫しましたAPIが使用していたので、最終的にすべてのラムダが5分のタイムアウトに遭遇しました。

私たちが見つけた解決策は、AWS API-Gatewayを介してhttpエンドポイントから呼び出すことでした。それはラムダを呼び出し、続行します。これを試してみると、カウントダウンが機能し、30日分の情報が数分で完成しました。

もう1つの注意点として、プログラムで呼び出されたラムダを「非同期モード」で設定する方法があることはもう知っています。私はそれを一度も使用していませんし、私が当初考えていたと思ったように、関数を呼び出すかどうかわかりません。同期モードと同じように待機していれば、それが終了したとみなされる前に。

関連する問題