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

所要時間3分
0

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 とステージのログ記録を有効にする」のセクションのステップを実行します。


関連情報

API Gateway で標準の Lambda エラーを処理する

API Gateway でカスタム Lambda エラーを処理する

コメントはありません

関連するコンテンツ