AWS Lambda
開発者ガイド

同時実行数の管理

AWS Lambda のスケーリング単位は同時実行数です (詳細については「スケーリング動作について」を参照)。ただし、すべてのシナリオで無期限にスケーリングすることは望ましくありません。たとえば、同時実行数をコスト上の理由や、イベントのバッチの処理にかかる時間や、ダウンストリームリソースに合わせて制御できます。そのために、Lambda にはアカウントレベルと機能レベルの両方で同時実行数の制限を制御する機能が用意されています。

アカウントレベルの同時実行数の制限

デフォルトでは、AWS Lambda は特定のリージョン内のすべての関数にわたり、合計の同時実行数を 1000 に制限します。アカウントレベルの設定は、GetAccountSettings API を使用して AccountLimit オブジェクトを表示することで見ることができます。この制限は、以下に説明しているように引き上げることができます。

同時実行数の制限の引き上げをリクエストするには

  1. AWS Support Center ページを開き、必要に応じてサインインし、[Create case] を選択します。

  2. [Regarding] で、[Service Limit Increase] を選択します。

  3. [Limit Type] で [Lambda] を選択し、フォームにある必須フィールドを入力して、希望する連絡方法のページの下部にあるボタンを選択します。

関数レベルの同時実行数の制限

デフォルトでは、同時実行数の制限は、すべての関数の同時実行数の合計に対して適用されます。共有同時実行数のプールは、予約されていない同時実行数の割り当てと呼ばれます。関数レベルの同時実行数の制限を設定していない場合、予約されていない同時実行数の制限は、アカウントレベルの同時実行数の制限と同じになります。アカウントレベルの同時実行数の制限を超えると、予約されていない同時実行数の制限がそれに応じて引き上げられます。GetAccountSettingsAPI を使用するか、AWS Lambda コンソールを使用して、関数の予約されていない同時実行数の割り当てを表示できます。共有同時実行数のプールを割り当てられた関数は、GetFunctionConfiguration API を使用して照会されたときに同時実行数値を返しません。

オプションで、関数の同時実行数の制限を設定できます。このような制限を設定するのには、いくつかの理由があります。

  • デフォルトの動作では、ある関数で同時実行数が急増すると、実行制限で隔離した機能がスロットリングされることを回避します。ある関数に対して同時実行数の制限を設定することで、指定した同時実行数値がその関数用に予約されます。

  • 関数は受信リクエスト率に基づいて自動的にスケーリングされますが、アーキテクチャ内のすべてリソースがスケーリング可能とは限りません。たとえば、リレーショナルデータベースでは、扱える同時接続数に制限があります。そのダウンストリームリソースがサポートする値に合わせて関数の同時実行数の制限を設定できます。

  • 関数が VPC ベースのリソースに接続する場合、サブネットに、関数の ENI スケーリング要件をサポートするために適切な対応キャパシティーがあることを確認します。次の式を使用すると、おおよその ENI キャパシティーを予測できます。

    Concurrent executions * (Memory in GB / 3 GB)

    各パラメーターの意味は次のとおりです。

    • Concurrent execution – これは、ワークロードの予測同時実行数です。「スケーリング動作について」のこの情報を使用して、この値を決定します。

    • Memory in GB – Lambda 関数用に設定したメモリの容量。

関数の同時実行数の制限を、サブネットのサイズ制限に合わせて設定できます。

注記

関数が呼び出しを処理しないようにする必要がある場合は、同時実行数を 0 に設定し、すべての受信実行をスロットリングできます。

関数の同時実行数の制限を設定することで、Lambda では、残りの関数を処理するトラフィックの量に関係なく、割り当てた同時実行数がその関数に適用されるようになります。その制限を超えると、関数がスロットリングされます。スロットリング時の関数の動作は、イベントソースによって異なります。詳細については、「スロットリング動作」を参照してください。

注記

同時実行数の制限は、個々のバージョンではなく、関数レベルでのみ設定できます。指定した関数のすべてのバージョンとエイリアスのすべての呼び出しは、関数の同時実行数の制限に達するまで行われます。

予約されている同時実行数の制限と予約されていない同時実行数の制限

関数の同時実行数の制限を設定している場合、その値は予約されていない同時実行数のプールから差し引かれます。たとえば、アカウントの同時実行数の制限が 1,000 で、関数が 10 個ある場合は、ある関数の同時実行数の制限を 200 を指定し、別の関数の同時実行数の制限を 100 に指定できます。残りの 700 は、他の 8 つの関数の間で共有されます。

注記

AWS Lambda は、予約されていない同時実行数のプールを 100 以上に保持するため、特定の制限が設定されていない関数は引き続きリクエストを処理できます。したがって実際には、アカウントの同時実行数の制限が 1,000 の場合、個々の関数に割り当てられる同時実行数は 900 に制限されます。

関数あたりの同時実行数の制限の設定 (コンソール)

Lambda コンソールを使用して、Lambda 関数の同時実行数の制限を設定するには、以下の操作を行います。

  1. AWS マネジメントコンソール にサインインして、AWS Lambda コンソールを開きます。

  2. 新しい Lambda 関数を作成する場合でも、既存の関数を更新する場合でも、同時実行数の制限を設定するプロセスは同じです。Lambda を初めて使用する場合や、関数の作成に慣れていない場合は、「シンプルな Lambda 関数を作成する」を参照してください。

  3. [Configuration] タブで、[Concurrency] を選択します。[Reserve concurrency] で、その関数用に予約する最大同時実行数の値を設定します。この値を設定すると、[予約されていないアカウントの同時実行] の値が自動的に更新されて、アカウントの他のすべての関数に使用可能な同時実行数の残りが表示されます。また、この関数の呼び出しをブロックする場合は、この値を 0 に設定します。このアカウント専用に割り当てた同時実行数の値を削除するには、[Use unreserved account concurrency] を選択します。

関数あたりの同時実行数の制限の設定 (CLI)

AWS CLI を使用して、Lambda 関数の同時実行数の制限を設定するには、以下の操作を行います。

  • PutFunctionConcurrency オペレーションを使用して、その関数の名前と割り当てる同時実行数の制限を渡します。

    aws lambda put-function-concurrency --function-name function-name --reserved-concurrent-executions limit value

AWS CLI を使用して、Lambda 関数の同時実行数の制限を削除するには、以下の操作を行います。

  • DeleteFunctionConcurrency オペレーションを使用して、その関数の名前を渡します。

    aws lambda delete-function-concurrency --function-name function-name

AWS CLI を使用して、Lambda 関数の同時実行数の制限を表示するには、以下の操作を行います。

  • GetFunction オペレーションを使用して、その関数の名前を渡します。

    aws lambda get-function --function-name function-name

注記

関数あたりの同時実行数を設定すると、他の関数で使用できる同時実行数のプールに影響を与えることがあります。PutFunctionConcurrency API および DeleteFunctionConcurrency API に対するアクセス権限を管理ユーザーに制限して、これらの変更を行うことができるユーザーの数が制限されるようにすることをお勧めします。

スロットリング動作

関数に関連付けられた同時実行数の制限に達すると、その関数へのそれ以上の呼び出しリクエストはスロットリングされます。つまり、呼び出しによって関数は実行されません。呼び出しがスロットルされるごとに、その関数の Amazon CloudWatch Throttles メトリクスが増加します。AWS Lambda は、ソースに応じて、スロットリングされた呼び出しリクエストを別々に扱います。

  • ストリームベースでないイベントソース - これらのイベントソースの一部は Lambda 関数を同期的に呼び出します。それ以外は非同期呼び出しです。処理はそれぞれ異なります。

    • 同期呼び出し: 関数が同期的に呼び出され、スロットリングされた場合、Lambda は 429 エラーを返し、呼び出し元のサービスで再試行が必要になります。ThrottledReason エラーコードは、関数レベルのスロットリング (指定されている場合) が行われたか、アカウントレベルのスロットリング (以下を参照) が行われたかを示します。各サービスには独自の再試行ポリシーが設定されている場合があります。イベントソースとその呼び出しタイプのリストについては、「サポートされているイベントソース」を参照してください。

      注記

      RequestResponse 呼び出しモードで AWS SDK を使用して関数を直接呼び出した場合、クライアントでは 429 エラーが表示され、呼び出しを再試行できます。

    • 非同期呼び出し: Lambda 関数が非同期的に呼び出され、スロットリングされた場合は、AWS Lambda はスロットリングされたイベントを最大 6 時間自動的に再試行します (再試行間には遅延があります)。たとえば、CloudWatch Logs では、失敗したバッチが最大 5 回再試行されます (再試行間には遅延があります)。ただし、非同期イベントは、Lambda 関数の呼び出しに使用されるまでキューに入ります。デッドレターキュー (DLQ) を設定でき、関数がスロットルされた理由を調べることができます。詳細については、「デッドレターキュー」を参照してください。

  • ストリームベースでもあるポーリングベースのイベントソース: Amazon KinesisAmazon DynamoDB などの場合、AWS Lambda はストリームをポーリングして、Lambda 関数を呼び出します。Lambda 関数がスロットリングされた場合、Lambda はデータの有効期限が切れるまで、レコードのスロットリングされたバッチの処理を試みます。この期間は、Amazon Kinesis の場合 7 日間です。スロットルされたリクエストはシャードごとにブロックとして扱われ、スロットルされたレコードのバッチの有効期限が切れるか処理が成功するまで、Lambda ではシャードから新しいレコードの読み込みが行われません。ストリームに複数のシャードがある場合、Lambda はスロットリングされていないシャードで呼び出しを成功するまで続けます。

  • ストリームベースでないポーリングベースのイベントソース: Amazon Simple Queue Service などの場合、AWS Lambda はキューをポーリングして、Lambda 関数を呼び出します。Lambda 関数がスロットリングされた場合、正常に呼び出されるまで (この場合、呼び出されたメッセージはキューから自動的に削除されます)、またはキューの期限に MessageRetentionPeriod が設定されるまで、Lambda はレコードのスロットリングされたバッチの処理を試みます。

同時実行数の使用状況のモニタリング

同時実行数の使用状況を把握するために、AWS Lambda には以下のメトリクスが用意されています。

  • ConcurrentExecutions: これは、アカウントレベルでの同時実行数と、カスタムの同時実行数の制限が適用される関数の同時実行数を示します。

  • UnreservedConcurrentExecutions: デフォルトの "予約されていない" 同時実行数のプールを割り当てられた関数の同時実行数の合計を示します。

これらのメトリクスとそのアクセス方法については、「Amazon CloudWatch の使用」を参照してください。