API Gateway と Lambda 関数を統合したときに表示されるエラーを解決するにはどうすればよいですか?
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 ログ記録をセットアップするをご参照ください。
インテグレーションタイプの特定、エラーの検証、次のステップの実行
1. Lambda プロキシインテグレーションと Lambda カスタムインテグレーションのどちらが API Gateway で設定されているかを確認します。統合タイプを確認するには、Lambda 関数の出力を確認するか、get-integration コマンドを実行します。
2. API Gateway のエラーが Lambda のエラーに対応していることを確認します。以下の CloudWatch Logs Insights クエリを実行して、指定された期間中のエラーステータスコードを検索します。
parse @message '(*) *' as reqId, message | filter message like /Method completed with status: \d\d\d/ | parse message 'Method completed with status: *' as status | filter status != 200 | sort @timestamp asc | limit 50
次に、次の CloudWatch Logs Insights クエリを実行して、同じ時間枠内の Lambda エラーログを検索します。
fields @timestamp, @message | filter @message like /(?i)(Exception|error|fail)/ | sort @timestamp desc | limit 20
3. ログで特定したエラーの種類に基づいて、次のいずれかを選択します。
次のエラーが表示された場合は、同時実行の問題を解決するのセクションの手順を完了します。
(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 のメトリクス」および「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 が非同期的に呼び出されたときに API Gateway に成功した応答を返すことができます。
Lambda プロキシ統合を使用している場合は、カスタム統合に変更することを検討してください。ただし、リクエスト/応答を目的の形式に変換するようにマッピングテンプレートを設定する必要があります。詳細については、バックエンド Lambda 関数の非同期呼び出しを設定するをご参照ください。
注: 非同期の Lambda 関数はバックグラウンドで実行されるため、クライアントは Lambda 関数から直接データを受け取ることはできません。永続データを格納するには、中間データベースが必要です。
関数エラーを解決する
API を呼び出したときに関数エラーが表示された場合は、Lambda 関数に構文エラーがないか確認してください。このエラーは、API Gateway がプロキシ統合のために想定する有効な JSON オブジェクトを Lambda 関数が返さない場合にも表示されます。
このエラーを解決するには、「API とステージのログ記録を有効にする」のセクションのステップを実行します。
関連情報

関連するコンテンツ
- 質問済み 4ヶ月前lg...
- 質問済み 5ヶ月前lg...
- 質問済み 4ヶ月前lg...
- 質問済み 4日前lg...
- 質問済み 5年前lg...