API Gateway と Lambda 関数を統合したときに表示されるエラーを解決するにはどうすればよいですか?

最終更新日: 2021 年 4 月 6 日

Amazon API Gateway と AWS Lambda 関数を統合したときに表示されるエラーを解決したいと考えています。

解決方法

API とステージのログ記録を有効にする

1.    API Gateway コンソールで、API の Stage Editor を見つけます。

2.    [Stage Editor] (ステージエディター) ペインで [Logs/Tracing] (ログ/トレース) タブを選択します。

3.     [Logs/Tracing] (ログ/トレース) タブの [CloudWatch Settings] (CloudWatch 設定) で、以下を実行してログ記録を有効にします。
[Enable CloudWatch Logs] (CloudWatch ログを有効化) チェックボックスにチェックを入れます。
[Log level] (ログレベル) で、すべてのリクエストのログを生成するために [INFO] を選択します。または、[ERROR] を選択して、エラーになった API へのリクエストのみのログを生成します。
REST API の場合は、[Log full requests/responses data] (リクエスト/レスポンスデータ全体をログ記録) チェックボックスにチェックを入れます。または、WebSocket API の場合は、[Log full message data] (メッセージデータをすべてログに記録する) チェックボックスにチェックを入れます。

4.    [Custom Access Logging] (カスタムアクセスのログ記録) で、以下を実行してアクセスログを有効にします。
[Enable Access Logging] (アクセスログ記録の有効化) チェックボックスにチェックを入れます。
[Access Log Destination ARN] (アクセスログの宛先 ARN) に、CloudWatch ロググループまたは Amazon Kinesis Data Firehose ストリームのAmazon リソースネーム (ARN) を入力します。
[Log Format] (ログの形式) を入力します。ガイダンスについては、その形式の例を確認するには、[CLF]、[JSON]、[XML]、または [CSV] を選択します。

5.    [Save Changes] (変更を保存) を選択します。
注: コンソールは設定が保存されたことを確認しません。

詳細については、API Gateway コンソールを使用して CloudWatch API ログ記録をセットアップするをご参照ください。

6.    ログで特定したエラーの種類に基づいて、次のいずれかを選択します。

次のエラーが表示された場合は、同時実行の問題を解決するのセクションの手順を完了します。

(XXXXX) Lambda invocation failed with status: 429. Lambda request id: XXXXXXXXXX
(XXXXX) Execution failed due to configuration error: Rate Exceeded.
(XXXXX) Method completed with status: 500

次のいずれかのエラーが表示された場合は、タイムアウトの問題を解決するのセクションの手順を完了します。

Lambda カスタム統合の場合:

< 29 sec:
(XXXXX) Method response body after transformations: {"errorMessage":"2019-08-14T02:45:14.133Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

Lambda プロキシ統合の場合:

< 29 sec:
(XXXXX) Endpoint response body before transformations: {"errorMessage":"2019-08-14T02:50:25.865Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

次のエラーが表示される場合は、関数エラーを解決するのセクションの手順を実行します。

(XXXXX) Execution failed due to configuration error: Malformed Lambda proxy response
(XXXXX) Method response body after transformations: {"errorMessage": "Syntax error in module 'lambda_function'"}

同時実行の問題を解決する

API Gateway からの追加のリクエストが Lambda 関数でスケールできる速度よりも高速になると、429 のスロットリングエラーまたは 500 エラーが表示されます。

これらのエラーを解決するには、CloudWatch で Count (API Gateway)、Throttles (Lambda)、および ConcurrentExecutions (Lambda) メトリクスを分析します。以下の点を考慮してください。

  • Count (API Gateway) は、特定の期間における API リクエストの総数です。
  • Throttles (Lambda) は、スロットルされる呼び出しリクエストの数です。すべての関数インスタンスがリクエストを処理していて、スケールアップできる同時実行がない場合、Lambda は、追加のリクエストを拒否して TooManyRequestsException エラーを表示します。スロットルされたリクエストやその他の呼び出しエラーは、呼び出しまたはエラーとしてカウントされません。
  • ConcurrentExecutions (Lambda) は、イベントを処理している関数インスタンスの数です。この数が AWS リージョンの同時実行クォータ、または関数で設定した、予約された同時実行の制限に達すると、追加の呼び出しリクエストがスロットルされます。

注: 詳細については、API Gateway メトリクスおよびAWS Lambda 関数メトリクスの使用をご参照ください。

Lambda 関数で予約同時実行を設定する場合、Lambda 関数についてより高い予約同時実行の値を設定します。または、Lambda 関数からリバース同時実行の値を削除します。その後、この関数は、予約されていない同時実行のプールからドローします。

Lambda 関数で予約同時実行を設定しない場合は、ConcurrentExecutions メトリクスで使用状況を確認します。詳細については、Lambda のクォータをご参照ください。

タイムアウトの問題を解決する

すべての API Gateway 統合で、統合タイムアウトは 29 秒 (ハード制限) です。Lambda 統合で API Gateway API を構築すると、2 つのシナリオが発生する可能性があります。それらのシナリオとは、タイムアウトが 29 秒未満の場合と 29 秒より大きい場合です。

Lambda 関数のタイムアウトが 29 秒未満の場合は、Lambda ログを確認してこの問題を調査してください。Lambda 関数が 29 秒後に実行されなければならない場合は、Lambda 関数を非同期的に呼び出すことを検討してください。

Lambda カスタム統合の場合は、次の手順を実行します。

1.    API Gateway Console にログインします。

2.    ナビゲーションペインで [APIs] (API) を選択し、API を選択します。

3.    [Resources] (リソース)、方法の順に選択します。

4.    [Integration Request] (統合リクエスト) を選択します。

5.    [Method Request] (メソッドリクエスト) を選択します。

6.    [HTTP Request Headers] (HTTP リクエストヘッダー) を展開します。

7.    [Add header] (ヘッダーの追加) を選択します。

8.    [Name] (名前) で、ヘッダーの名前を入力します。例: X-Amz-Invocation-Type

重要: 'Event' からヘッダーをマッピングする必要があります (一重引用符が必要です)。

Lambda プロキシ統合の場合:

2 つの Lambda 関数 (関数 A と関数 B) を使用します。API Gateway は、まず関数 A を同期的に呼び出します。その後、関数 A は関数 B を非同期的に呼び出します。関数 A は、関数 B の応答を考慮せず、関数 B が非同期的に呼び出されたときに API Gateway に正常な応答を返すことができます。

Lambda プロキシ統合を使用している場合は、カスタム統合に変更することを検討してください。ただし、リクエスト/応答を目的の形式に変換するようにマッピングテンプレートを設定する必要があります。詳細については、バックエンド Lambda 関数の非同期呼び出しを設定するをご参照ください。

注: 非同期の Lambda 関数はバックグラウンドで実行されるため、クライアントは Lambda 関数から直接データを受け取ることはできません。永続データを格納するには、中間データベースが必要です。

関数エラーを解決する

API を呼び出す際に、関数エラーが表示される場合があります。このエラーは、Lambda 関数の構文エラーによって発生する場合があります。このエラーは、API Gateway がプロキシ統合のために想定する有効な JSON オブジェクトを Lambda 関数が返さない場合にも表示されます。

このエラーを解決するには、API とステージのログ記録を有効にするのセクションの手順を実行します。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?