AWS Lambda の Error Processor サンプルアプリケーション - AWS Lambda

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS Lambda の Error Processor サンプルアプリケーション

Error Processor サンプルアプリケーションは、 を使用して Amazon CloudWatch Logs サブスクリプション からのイベントAWS Lambdaを処理する方法を示しています。 CloudWatch Logs を使用すると、ログエントリがパターンに一致するときに Lambda 関数を呼び出すことができます。このアプリケーションのサブスクリプションは、ERROR という単語を含むエントリの関数のロググループをモニタリングします。レスポンスとして、プロセッサ Lambda 関数が呼び出されます。プロセッサ関数は、エラーの原因となったリクエストのフルログストリームとトレースデータを取得して、後に使用するためにそれらを保存します。

関数コードは、次のファイルで使用できます。

サンプルは、AWS CLI および AWS CloudFormation を使用して数分でデプロイできます。アカウントでダウンロード、設定、デプロイするには、README の指示に従ってください。

アーキテクチャとイベント構造

サンプルアプリケーションでは、次の AWS サービスを使用します。

  • AWS Lambda – 関数コードを実行し、ログを CloudWatch Logs に送信し、トレースデータを X-Ray に送信します。

  • Amazon CloudWatch Logs – ログを収集し、ログエントリがフィルターパターンに一致すると 関数を呼び出します。

  • AWS X-Ray - トレースデータの収集、トレースのインデックス作成 (検索用)、サービスマップの生成を行います。

  • Amazon Simple Storage Service (Amazon S3) — デプロイのアーティファクトとアプリケーションの出力を保存します。

各サービスには標準料金が適用されます。

アプリケーションの Lambda 関数でエラーをランダムに生成します。 CloudWatch Logs は、関数のログERRORで という単語を検出すると、処理のためにイベントをプロセッサ関数に送信します。

例 CloudWatch メッセージイベントをログに記録する
{ "awslogs": { "data": "H4sIAAAAAAAAAHWQT0/DMAzFv0vEkbLYcdJkt4qVXmCDteIAm1DbZKjS+kdpB0Jo350MhsQFyVLsZ+unl/fJWjeO5asrPgbH5..." } }

これがデコードされている場合、データにはログイベントに関する詳細が含まれます。関数ではこの詳細を使用してログストリームを識別し、ログメッセージを解析してエラーの原因となったリクエストの ID を取得します。

例 デコードされた CloudWatch Logs イベントデータ
{ "messageType": "DATA_MESSAGE", "owner": "123456789012", "logGroup": "/aws/lambda/lambda-error-processor-randomerror-1GD4SSDNACNP4", "logStream": "2019/04/04/[$LATEST]63311769a9d742f19cedf8d2e38995b9", "subscriptionFilters": [ "lambda-error-processor-subscription-15OPDVQ59CG07" ], "logEvents": [ { "id": "34664632210239891980253245280462376874059932423703429141", "timestamp": 1554415868243, "message": "2019-04-04T22:11:08.243Z\t1d2c1444-efd1-43ec-b16e-8fb2d37508b8\tERROR\n" } ] }

プロセッサ関数は、 CloudWatch Logs イベントの情報を使用して、エラーの原因となったリクエストの完全なログストリームと X-Ray トレースをダウンロードします。そしてこの両方を Amazon S3 バケットに格納します。ログストリームとトレース時間を終了できるように、この関数では、データにアクセスする前に短時間待機します。

AWS X-Ray での計測

アプリケーションは、AWS X-Rayを使用して、関数呼び出しと関数が AWS サービスに実行する呼び出しとをトレースします。X-Ray は、関数から受け取ったトレースデータを使用して、エラーの特定に役立つサービスマップを作成します。

2 つの Node.js 関数は、テンプレートでのアクティブトレース用に設定されており、コードで AWS X-Ray SDK for Node.js を使用して計測されています。アクティブトレースでは、Lambda タグは、受信リクエストにトレースヘッダーを追加し、タイミングの詳細を含むトレースを X-Ray に送信します。さらに、ランダムエラー関数は X-Ray SDK を使用して、リクエスト ID およびユーザー情報を注釈に記録します。この注釈はトレースにアタッチされ、これを使用して特定のリクエストを見つけることができます。

プロセッサ関数は CloudWatch Logs イベントからリクエスト ID を取得し、 を使用してそのリクエストを X-Ray でAWS SDK for JavaScript検索します。X-Ray SDK が搭載された AWS SDK クライアントを使用して、トレースとログストリームをダウンロードします。次に、それらを出力バケットに保存します。X-Ray SDK でこれらの呼び出しを記録します。これらの呼び出しは、トレースのサブセグメントとして表示されます。

AWS CloudFormation テンプレートと追加リソース

アプリケーションは、2 つの Node.js モジュールで実装され、AWS CloudFormation テンプレートとシェルスクリプトを使用してデプロイされます。このテンプレートでは、プロセッサ関数、ランダムエラー関数、および以下のサポートリソースを作成します。

  • 実行ロール - 他の AWS のサービスにアクセスするアクセス許可を関数に付与する IAM ロール。

  • Primer 関数 - ロググループを作成するためにランダムエラー関数を呼び出す追加の関数。

  • カスタムリソース - デプロイ中に primer 関数を呼び出して、ロググループが存在することを確認する AWS CloudFormation カスタムリソース。

  • CloudWatch Logs サブスクリプション – ERROR という単語がログに記録されたときにプロセッサ関数をトリガーするログストリームのサブスクリプション。

  • リソースベースのポリシー – CloudWatch Logs に呼び出しを許可するプロセッサ関数のアクセス許可ステートメント。

  • Amazon S3 バケット - プロセッサ関数からの出力の保存場所。

アプリケーションテンプレートを表示します GitHub。

Lambda の AWS CloudFormation との統合の制限を回避するには、デプロイ中に実行する追加の関数をテンプレートで作成します。すべての Lambda 関数には、関数実行からの出力を保存する CloudWatch Logs ロググループが付属しています。ただし、このロググループは、関数が初めて呼び出されるまで作成されません。

サブスクリプション (ロググループの有無によって異なる) を作成するには、アプリケーションを使用して 3 つめの Lambda 関数を使用してランダムエラー関数を呼び出します。このテンプレートには、プライマー関数インライン用のコードが含まれています。デプロイ中に AWS CloudFormation カスタムリソースでそのコードを呼び出します。DependsOn プロパティを使用して、ログストリームとリソースベースのポリシーがサブスクリプションの前に作成されるようにします。