Lambdaの予約済同時実行数とクォータ
発生したエラー
普段使わないリージョンで、CloudFormationを使って予約済同時実行数を指定したLambda関数をデプロイしようとしたらこんなエラーに遭遇しました。
Resource handler returned message: "Specified ReservedConcurrentExecutions for function decreases account's UnreservedConcurrentExecution below its minimum value of [10].
Service Quotasを確認すると、Lambdaの同時実行数のクォータ値は10のようです。
CFnテンプレートでの予約済み同時実行数の指定は次の通りで、非予約済同時実行のための同時実行数が9(=10-1)と10未満になってしまうからエラーってことだと思います。
ReservedConcurrentExecutions: 1
こんなにクォータって小さかったっけ?と思いつつ、公式ドキュメントの予約済同時実行数の設定を見ると、
You can reserve up to the Unreserved account concurrency value minus 100. The remaining 100 units of concurrency are for functions that aren't using reserved concurrency.
って書いてあるんですよね。非予約済同時実行のための同時実行数が100以上必要なように読める(当然クォータは100以上)のですが、どこかで10に変更されたのでしょうか?ざっと調べた限りでは、それらしい情報は見つけられませんでした。
ちなみに、同様のエラーに遭遇した人の記事があって、その人は100未満になるためにエラーが発生していたようです。エラーメッセージも最小値は10ではなく100と表示されていたようです。なお、エラー発生時のクォータは10とのことでした。
Resource handler returned message: "Specified ReservedConcurrentExecutions for function decreases account's UnreservedConcurrentExecution below its minimum value of [100].
解決法
Service Quotasから引き上げ申請を行いましょう。
非予約済同時実行のために必要な同時実行数の最小値が10なのか100なのかはっきりしないので、とりあえず100で上限緩和を申請してみて、非予約済同時実行に割り当てられる同時実行数が99だとエラーになるか試してみようと思います。
まとめ
Lambdaの同時実行数のクォータ値が小さすぎて、予約済同時実行数を1指定しただけで非予約済同時実行のために必要な同時実行数の最小値を下回ってしまったようです。対策はクォータの引き上げをするだけですが、非予約済同時実行のために必要な同時実行数の最小値が100なのか10なのかはっきりしないので、この後実験して確認しようと思います。
→ その後の検証から100ではないと思われます。初期のクォータが10であり、予約済同時実行が0の場合はLambda関数の作成ができていたこと、公式ドキュメントや他の方のブログ等から、10に変更されたのではないかと推測します。
個人アカウントでサポートプランがBasicなこともあり、この記事を書きながら2時間くらい待ってますが、まだ担当者のアサイン待ちですね。AWSのデフォルトのクォータ値が1000なので、100くらいなら自動で即引き上げしてくれてもいいのに。
今回は検証のために普段使わないリージョンを使おうとしてクォータにヒットしちゃいましたが、複数リージョンで緩和申請が必要な場合は、Service Quotasのリクエストテンプレートを検討するとよいかもしれません。
Discussion