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) – デプロイメントアーティファクトとアプリケーション出力を保存します。

  • AWS CloudFormation – アプリケーションリソースを作成し、関数コードをデプロイします。

アプリケーションの 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 は、関数から受け取ったトレースデータを使用して、エラーの特定に役立つサービスマップを作成します。次のサービスマップでは、一部のリクエストでランダムエラー関数によって生成されるエラーを示しています。また、X-Ray、CloudWatch Logs、Amazon S3 を呼び出すプロセッサ関数も示しています。

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 テンプレートと追加リソース

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

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

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

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

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

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

  • Amazon S3 バケット – プロセッサ関数からの出力のストレージ場所。

GitHub で error-processor.yaml テンプレートを表示します。

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

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