AWS X-Ray
開発者ガイド

X-Ray SDK for Node.js を使用して受信リクエストをトレースする

X-Ray SDK for Node.js を使用して、Amazon EC2、AWS Elastic Beanstalk、または Amazon ECS の EC2 インスタンスで Express アプリケーションおよび Restify アプリケーションが提供する受信 HTTP リクエストをトレースできます。

X-Ray SDK for Node.js は Express フレームワークおよび Restify フレームワークを使用するアプリケーションのミドルウェアを提供します。X-Ray ミドルウェアをアプリケーションに追加すると、X-Ray SDK for Node.js によってサンプリングされた各リクエストのセグメントが作成されます。このセグメントには、時間、メソッド、HTTP リクエストの処理などが含まれます。追加の計測により、このセグメントでサブセグメントが作成されます。

注記

AWS Lambda 関数の場合、Lambda はサンプリングされたリクエストごとにセグメントを作成します。詳細については、「AWS Lambda および AWS X-Ray」を参照してください。

Each segment has a name that identifies your application in the service map. The segment can be named statically, or you can configure the SDK to name it dynamically based on the host header in the incoming request. Dynamic naming lets you group traces based on the domain name in the request, and apply a default name if the name doesn't match an expected pattern (for example, if the host header is forged).

転送されたリクエスト

ロードバランサーなどを仲介してリクエストがアプリケーションに転送される場合、X-Ray では、IP パケットのソース IP からではなくリクエストの X-Forwarded-For ヘッダーからクライアント IP を取得します。転送されたリクエストに記録されているクライアント IP は偽造されている可能性があるため、信頼すべきではありません。

When a request is forwarded, the SDK sets an additional field in the segment to indicate this. If the segment contains the field x_forwarded_for set to true, the client IP was taken from the X-Forwarded-For header in the HTTP request.

メッセージハンドラーは、次の情報が含まれる http ブロックを使用して、各受信リクエスト用にセグメントを作成します。

  • HTTP メソッド – GET、POST、PUT、DELETE、その他。

  • クライアントアドレス – リクエストを送信するクライアントの IP アドレス。

  • レスポンスコード – 完了したリクエストの HTTP レスポンスコード。

  • タイミング – 開始時間 (リクエストが受信された時間) および終了時間 (レスポンスが送信された時間)。

  • ユーザーエージェント — リクエストから user-agent を取得します。

  • コンテンツの長さ — レスポンスからの content-length

Express を使用した受信リクエストのトレース

Express ミドルウェアを使用するには、SDK クライアントを初期化して、ルートを定義する前に express.openSegment 関数によって返されたミドルウェアを使用します。

例 app.js - Express

var app = express(); var AWSXRay = require('aws-xray-sdk'); app.use(AWSXRay.express.openSegment('MyApp')); app.get('/', function (req, res) { res.render('index'); }); app.use(AWSXRay.express.closeSegment());

ルートを定義した後、express.closeSegment の出力を図のように使用して X-Ray SDK for Node.js によって返されたエラーを処理します。

Restify を使用した受信リクエストのトレース

Restify ミドルウェアを使用するには、SDK クライアントを初期化し、enable を実行します。Restify サーバーおよびセグメント名を渡します。

例 app.js - Restify

var AWSXRay = require('aws-xray-sdk'); var AWSXRayRestify = require('aws-xray-sdk-restify'); var restify = require('restify'); var server = restify.createServer(); AWSXRayRestify.enable(server, 'MyApp')); server.get('/', function (req, res) { res.render('index'); });

セグメント命名ルールの設定

AWS X-Ray はサービス名を使用してアプリケーションを識別し、アプリケーションが使用する他のアプリケーション、データベース、外部 API、および AWS リソースからそのアプリケーションを区別します。X-Ray SDK が受信リクエストのセグメントを生成するときに、アプリケーションのサービス名をセグメントの name フィールドに記録します。

X-Ray SDK は HTTP リクエストヘッダーのホスト名に合わせてセグメントを命名できます。ただし、このヘッダーは偽造されている可能性があり、その場合はサービスマップで予期しないノードが発生することがあります。SDK が、偽造されたホストヘッダーを持つリクエストによりセグメントに正しくない名前を付けないようにするには、受信リクエストのデフォルト名を指定する必要があります。

アプリケーションが複数のドメインのリクエストに対応する場合、動的な命名ルールを使用してセグメント名にこれを反映するよう SDK を設定できます。動的な命名ルールにより、SDK は予期されるパターンに一致するリクエストにホスト名を使用し、一致しないリクエストにはデフォルト名を適用できます。

たとえば、3 つのサブドメイン (www.example.comapi.example.comstatic.example.com) へのリクエストに対応する 1 つのアプリケーションがあるとします。動的命名ルールとパターン *.example.com を使用して、異なる名前を持つ各サブドメインのセグメントを識別し、それによりサービスマップで 3 つのサービスノードが作成されます。アプリケーションが、パターンに一致しないホスト名のリクエストを受け取った場合は、指定したフォールバック名を持つ 4 番目のノードがサービスマップに表示されます。

すべてのリクエストセグメントに対して同じ名前を使用するには、前のセクションで示すとおり、ミドルウェアを初期化するときに、アプリケーションの名前を指定します。

注記

コードで定義したデフォルトのサービス名は、AWS_XRAY_TRACING_NAME 環境変数で上書きできます。

動的な命名戦略は、ホスト名と一致するようパターンを定義し、HTTP リクエストのホスト名がパターンと一致しない場合はデフォルトの名前を使用します。動的にセグメントに命名するには、AWSXRay.middleware.enableDynamicNaming を使用します。

例 app.js - 動的セグメントの名前

リクエストのホスト名がパターン *.example.com と一致する場合は、そのホスト名を使用します。それ以外の場合は、MyApp を使用します。

var app = express(); var AWSXRay = require('aws-xray-sdk'); app.use(AWSXRay.express.openSegment('MyApp')); AWSXRay.middleware.enableDynamicNaming('*.example.com'); app.get('/', function (req, res) { res.render('index'); }); app.use(AWSXRay.express.closeSegment());