🐦

Lambdaで予約された同時実行数を指定できず困った話

2024/05/29に公開

発生した事象

Lambda作成を行うCDKのコードで「予約された同時実行数」を指定してdeployしたとき、以下のようなエラーが発生しました。

Resource handler returned message: “Specified ReservedConcurrentExecuti
ons for function decreases account’s UnreservedConcurrentExecution belo
w its minimum value of [10]

このエラーは関数のReserved Concurrent Executions(予約済み同時実行数)を設定しようとした際、その値がアカウントのUnreserved Concurrent Executions(予約してない同時実行数)の最小値10を下回ってしまうことを示しているようです。

発生時の状況

予約された同時実行数を1にして、他のLambda関数では予約された同時実行数を指定していないことも確認したのにも関わらず、1すらも設定できないのはおかしいと思いました。ちなみにCDKのコード自体は以下のように書いていました。

    const xxxxxxHandler = new lambda.DockerImageFunction(
      this,
      "XXXXXXHandler",
      {
        functionName: "xxxxxxHandler",
        code: lambda.DockerImageCode.fromEcr(lambdaRepository, {
          tagOrDigest: lambdaEcrTag,
        }),
        role: lambdaIamRole,
        vpc,
        vpcSubnets: vpc.selectSubnets({ subnetGroupName: privateSubnetName }),
        securityGroups: [lambdaSecurityGroup],
        timeout: cdk.Duration.seconds(120),
        memorySize: 256,
        reservedConcurrentExecutions: 1, // ここで同時実行数を1にしたい
      },
    );

原因特定

AWSのService QuotasでLambdaの状態を確認したところ Concurrent exectionsのアカウントレベルのクォータが10になっていたことが原因でした。

Service Quotas Lambdaの画像

予約してない同時実行数 - 同時実行数の制限数 が10以上になる必要があり、
予約してない同時実行数が10の状態では、
予約してない同時実行数(10) - 予約済み同時実行数(1) = 9 < 10 
になり実行数制限ができなくなっていたという背景です。

解決方法

AWSのService QuotasでLambdaのConcurrent exectionsのアカウントレベルのクォータが10から一旦100に申請しました。

リクエストしてからどのくらいで上限引き上げが起こったかは確認できませんでしたが、少なくとも金曜の夜にリクエストして月曜の朝には100になっていたのであまり時間はかからないと思います。

予約してない同時実行数が100になったおかげで、
予約してない同時実行数(100) - 予約済み同時実行数(1) = 99 > 10 
となり、cdkのデプロイもうまくいくようになりました。

最後に

Lambdaは自分でquotaを設定しなくても1000件は同時実行できるはずという固定概念があったため気づくのが遅れましたが無事解決できてよかったです。
この記事が多くの人の役に立てるかは怪しいですが、もし同じような状況になった人がすぐに問題解決できるように記事として記録しておきます。

ファンタラクティブテックブログ

Discussion