私たちは、特定のタスクを可変周波数のスケジュールで実行する必要がある真のラムダベースのアプリケーションを開発しようとしています。彼らは実際にデータをポーリングしており、1日の特定の時間帯には、このポーリングは1時間に1回のように遅くなる可能性がありますが、それ以外の場合は1秒に1回でなければなりません。スケジュールのオプションを確認しました(例: スケジュールされたイベントでAWS Lambdaを使用する および AWS re:Invent 2015 |(CMP407)Lambda as Cron:AWS Lambdaでの呼び出しのスケジュール )しかし、EC2インスタンスまたは長時間実行されるラムダを起動する以外に、1分未満の頻度でラムダを起動する組み込みの方法はないようです。ラムダレート式には秒単位の場所がありません。 EC2インスタンスや長時間実行されるラムダなしでこれを行う方法はありますか?理想的には、スケジューリングに追加のコストをかけずに実行できるものです。
現在、ラムダ関数は、Cloudwatchスケジュールイベントから少なくとも1分ごとに呼び出されます。
うまくいくかもしれない解決策は次のようになります:
EC2インスタンスをセットアップし、バックグラウンドジョブとして実行するプログラムから、awssdkを使用してラムダ関数を呼び出します。例:
while True:
invoke lambda function via aws sdk
sleep for x seconds
理論的には、CloudWatchイベントによって実行される AWSステップ関数 を使用して、EC2インスタンスまたは長時間実行ラムダなしで高周波タスクトリガーを接続できますスケジュールされたイベント(例についてはEmanuele Mengaの ブログ投稿 を参照)が、私の現在のところによると、そのアプローチは実際には他の2つのオプションよりも高価です (2019年5月現在)見積もり:
(1年=31536000秒と仮定)
Wait
、Task
)+ 1分あたり少なくとも1つ(セットアップ/構成用)31536000 * (2 + 1/60) * 0.0250 / 1000
=$ 1589.94/年、または最低$ 65.70/年(低頻度トリガーの場合)(1分あたり2ティック)31536000 * 0.000000208 * 10
=$ 65.595488/年t3a.nano
は $ 0.0047 オンデマンドで1時間あたり、またはスポットインスタンスを使用すると $ 0.0014したがって、いくつかのスケジューリングコストが発生しますが、ご覧のとおり、コストはそれほど高くありません。
この時点で、AWS Lambdaでは、関数を5分ごとに実行するようにスケジュールでき、最大実行時間は5分です。
つまり、EC2を使用せずに5分ごと未満の間隔でAWS Lambda関数を実行する場合は、2段階のアプローチを取ることができます。 5分ごとに実行するAWSLambda関数を作成し、実際に5分間実行して、適切な時間間隔で他のAWSLambda関数を非同期に呼び出します。
このアプローチでは、5分間実行される最初のAWS Lambda関数が基本的に継続的に実行されるため、コストが高くなりますが、最小量のRAMを割り当てることで、コストを削減できます。
[〜#〜]更新[〜#〜]
CloudWatchイベントでは、1分の頻度でスケジュールを設定できるようになりました。つまり、Lambda関数を毎分実行するようにスケジュールし、最大1分間実行して、1分未満の精度を実現できるようになりました。スケジュールされたイベントは毎分の開始時に発生しないため、正確な1分未満のタイミングを達成するのはまだ少し注意が必要です。
ラムダでポーリングしないでください。作業を実行するよりもポーリングに多くの時間を費やすことが予想される場合は、EC2を使用することをお勧めします。ラムダは実行時間とポーリングによって課金され、コストがかかります。
Lambdaを使用したイベント駆動型システムが本当に必要です。いつポーリングするかは何によって決まりますか?