AWS Lambda の Error Processor サンプルアプリケーション
エラープロセッサのサンプルアプリケーションは、Amazon CloudWatch Logs サブスクリプションのイベントを処理する AWS Lambda の使用方法をデモンストレーションします。CloudWatch Logs を使うと、ログエントリがパターンと一致したときに Lambda 関数を呼び出すことができます。このアプリケーションのサブスクリプションは、ERROR
という単語を含むエントリの関数のロググループをモニタリングします。レスポンスとして、プロセッサ Lambda 関数が呼び出されます。プロセッサ関数は、エラーの原因となったリクエストのフルログストリームとトレースデータを取得して、後に使用するためにそれらを保存します。
関数コードは、次のファイルで使用できます。
-
ランダムエラー - random-error/index.js
-
プロセッサ - processor/index.js
サンプルは、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 Logs メッセージイベント
{ "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 を取得し、AWS SDK for JavaScript を使用して X-Ray でそのリクエストを検索します。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
プロパティを使用して、ログストリームとリソースベースのポリシーがサブスクリプションの前に作成されるようにします。