emahiro/b.log

Drastically Repeat Yourself !!!!

Lambda の同時実行数を制限する

Overview

タイトルの通りです。
久しぶりに Lambda on Serverless Framework を触っていて忘れていたので備忘録です。

Conclusion

Lambda の同時実行数を制限するには Reseved Concurrency の設定を 1 にします。
Serverless Framework は function の reservedConcurrency の設定で同時実行数を調べます。

www.serverless.com

Lambda の同時実行回数について

ReservedConcurrency と ProvisionedConcurrency について

以下のドキュメントにその答えが書いてあります。

docs.aws.amazon.com

Reserved concurrency – Reserved concurrency creates a pool of requests that can only be used by its function, and also prevents its function from using unreserved concurrency. Provisioned concurrency – Provisioned concurrency initializes a requested number of execution environments so that they are prepared to respond to your function's invocations.

Reserved concurrency は Lambda (の起動)で使用することができるリクエストのプールを作成し、予約されていない並行のから Lambda の起動を防ぐことできます(= Lambda の並行処理を制御できる )

対して、Provisioned concurrency はリクエストされた実行環境においてあらかじめて Lambda の発火に対応できるように環境を用意しておくことです。

同時実行回数については上記の説明から、reserved concurrency を利用すればいいことがわかりますが、さらに以下で詳細に説明されています。

To ensure that a function can always reach a certain level of concurrency, configure the function with reserved concurrency. When a function has reserved concurrency, no other function can use that concurrency. Reserved concurrency also limits the maximum concurrency for the function, and applies to the function as a whole, including versions and aliases.

並行性のレベル(程度)に達したいとき(= どれくらい並行で実行するのか制御したいとき)は reserved concurrency を利用します。関数は reserved concurrency が設定されてる時はその設定された並行数以上に発火することはありません。reserved concurrecy は最大並行実行数の上限であり、version やエイリアスに渡って全ての Lambda に適用されます。

まとめ

久しぶりに触って色々忘れてましたが、とりあえず迷ったら Serverless Framework の設定を見る前に Lambda の GUI の設定を見ろ でした。
もちろん生の Lambda の設定が Serverless Framework 上でどうマッピングされているのかは理解しないといけませんが、Serverless Framework は Lambda の設定を透過的に使えるものであって、いわばラッパーなので大元を見ないといけないですね(何を当たり前のことを...)

その他

全然本論と関係ないですが、SQS で Lambda を Trigger をするときに Lambda 側でエラーを返さない(=正常終了した)場合に限り、SQS に Queue は戻され成功する(or Queue の有効期限が切れる)までなども Lambda が実行されますが、その Worker で拾われる周期は Visibility Timeout が切れるまでです。
Visibility Timeout 以内であればエラーを起こしても Worker では拾われません。