S3バケットへのPUTによってトリガーされるLambda関数があります。
このLambda関数を制限して、一度に1つのインスタンスのみを実行するようにします。2つのインスタンスを同時に実行することは望ましくありません。
Lambdaの設定とドキュメントを確認しましたが、明らかなものは見当たりません。独自のロックシステムを作成することもできますが、これが既に解決済みの問題である場合はいいでしょう。
ラムダの同時呼び出しの数を制限するにはどうすればよいですか?
AWS Lambdaは、個々の関数の同時実行制限をサポートするようになりました: https://aws.Amazon.com/about-aws/whats-new/2017/11/set-concurrency-limits-on-individual-aws-lambda- functions /
Kinesis Streams (またはDynamoDB + DynamoDB Streams、基本的に同じ動作をする)を使用することをお勧めします。
Kinesis Streamsをqueueとして表示できます。良い点は、Kinesis StreamをTriggerとしてLambda関数として使用できることです。したがって、このqueueに挿入されるものはすべて、順番に関数に自動的に渡されます。したがって、それらを処理できますS3 events one、by Lambda execution after other(一度に1つのインスタンス)。
そのためには、S3 Eventsを取得してKinesis Streamに入れるという単純な目的でLambda関数を作成する必要があります。 =。次に、Kinesis StreamをLambda Triggerとして設定します。
Kinesis StreamをLambda Triggerとして設定する場合、次の設定を使用することをお勧めします。
AWS May Webinar Series-Amazon KinesisとAWS Lambdaを使用したストリーミングデータ処理 の詳細情報。
これが同様の問題を抱えている人に役立つことを願っています。
追伸Kinesis Streamsには独自の 価格設定 があることに注意してください。 DynamoDB + DynamoDB Streamsを使用すると、より安価になる可能性があります(または、期限が切れないために無料になることもあります Free Tier DynamoDBの場合)。
いいえ、これはLambdaのサポートを期待したいことの1つですが、現在のところそうではありません。問題の1つは、S3 PUT操作が多数発生した場合、AWSは何らかの形ですべてのLambda呼び出しをキューに入れる必要があり、現在はサポートされていないことです。
Lambda関数にロックメカニズムを組み込んだ場合、ロックのために処理しないリクエストをどうしますか?これらのS3通知を破棄しますか?
ほとんどの人が推奨する解決策は、S3から通知をSQSキューに送信し、Lambda関数を1分に1回など定期的に実行するようにスケジュールし、処理する必要のあるアイテムがキューにあるかどうかを確認することです。
あるいは、S3からSQSに通知を送信し、シングルスレッドサービスがキューをポーリングするt2.nano EC2インスタンスのみを持つようにします。
(ラムダ関数を使用する代わりに)S3の「Putイベント」によってメッセージがキューに配置されるようにします。メッセージには、S3オブジェクトへの参照が含まれている必要があります。次に、ラムダを「キュー全体をポーリングする」ようにスケジュールします。
PS:S3イベントはKinesisストリームをトリガーできません... SQS、SMS、Lambdaのみ( http://docs.awsを参照) .Amazon.com/AmazonS3/latest/dev/NotificationHowTo.html#supported-notification-destinations )。 Kinesis Streamは高価であり、リアルタイムのイベント処理に使用されます。