X-Ray のコンセプトとアーキテクチャ

AWS のモニタリングとトラブルシューティング

John Q. Martin

Principal Consultant

分散システムの課題

 

モノリシックアプリケーション

  • 1つのプロセス内で完結する線形フロー
  • デバッグが比較的容易

 

分散アプリケーション

  • 1つのリクエストが複数のサービス・DB・外部 API を経由する
  • 障害発生時、原因となったサービスを特定しにくい

多数の色糸が複雑に絡み合った大きな結び目。分散システムで1つのリクエストを追跡することの難しさを表している

AWS のモニタリングとトラブルシューティング

AWS X-Ray とは?

 

X-Ray は分散トレーシングサービスです:

  • サービスをまたいだリクエストをエンドツーエンドで追跡
  • 各ステップのレイテンシ計測とエラー検出
  • サービスマップとしてアプリケーション構成を可視化

 

リクエストパスの例:

  分散トレースにおける複数サービスを流れるリクエストパスの図

AWS のモニタリングとトラブルシューティング

5つのコア機能

 

X-Ray の5つのコア機能:リクエストトレーシング、パフォーマンス分析、エラー検出、サービスマップ、インサイト

AWS のモニタリングとトラブルシューティング

トレーシングの仕組み

 

分散トレーシングフロー:リクエストがサービス A に到達し、サービス B・サービス C を順に呼び出す。各サービスは HTTP ヘッダーにトレース ID を付与して引き継ぎ、同一のトレース ID を持つセグメントを X-Ray デーモンに送信する。デーモンはそれらを X-Ray に転送し、1つの完全なトレースとして組み立てられる

AWS のモニタリングとトラブルシューティング

トレース ID とヘッダーの伝播

 

トレース ID のフォーマット:

バージョン番号・16進数の Unix タイムスタンプ・一意識別子で構成される X-Ray トレース ID のフォーマット

 

HTTP ヘッダー:

X-Amzn-Trace-Id:
  Root=1-5e8c1234-...;
  Parent=abc123;
  Sampled=1
  • Root:すべてのサービスで共通のトレース ID
  • Parent:上流セグメントの ID
  • Sampled:0 または 1(トレース対象か否か)
AWS のモニタリングとトラブルシューティング

X-Ray デーモン

 

機能:

  • UDP ポート 2000 でリッスン
  • アプリケーションからセグメントデータを受信
  • バッファリング・バッチ処理し、X-Ray API に転送
  • アプリと X-Ray サービスを疎結合に保つ

 

環境別のデプロイ方法:

X-Ray デーモンの環境別デプロイ:Lambda では自動、EC2 ではサービス、ECS ではサイドカーとして動作

AWS のモニタリングとトラブルシューティング

サンプリング

 

デフォルトルール:

  • 毎秒最初のリクエスト — 必ずトレース
  • それ以降のリクエストの 5% — サンプリング

カスタムルールのフィールド:

  • fixed_target — 毎秒必ずトレースするリクエスト数
  • rate — 追加リクエストのサンプリング割合
  • priority — 数値が小さいほど優先度が高い

 

設定例:

Rule 1 (priority 1):
  5xx errors -> 100% sampling

Rule 2 (priority 10):
  Normal traffic -> 5% sampling
AWS のモニタリングとトラブルシューティング

セグメント

 

セグメントに記録される内容:

  • サービス名
  • 開始・終了時刻
  • トレース ID
  • HTTP リクエストとレスポンスの詳細
  • AWS アカウントとリージョン

 

セグメントの状態:

X-Ray の5つのセグメント状態:in_progress、ok、error、fault、throttle

AWS のモニタリングとトラブルシューティング

サブセグメント

 

タイムライン比較:サブセグメントなしでは合計 800ms の1本のバー。サブセグメントありでは同じ 800ms が DynamoDB 50ms、PaymentService 400ms(ボトルネックとしてハイライト)、InventoryService 300ms に分割される

サブセグメントの役割:

  • セグメントの詳細なタイミングを提供
  • ダウンストリームの呼び出しを追跡
  • 合計 800ms を以下に分解
    • DynamoDB.PutItem:50ms
    • PaymentService 呼び出し:400ms
    • InventoryService 呼び出し:300ms

 

名前空間:

3つのサブセグメント名前空間:AWS 呼び出し用の aws、外部 HTTP 用の remote、カスタムコード用の local

AWS のモニタリングとトラブルシューティング

アノテーション

 

主な特徴:

  • インデックス付きキーバリューペア — 検索・フィルタリング可能
  • 上限:トレースあたり 50 件
  • 型:文字列、数値、ブール値

用途:

  • user_id、order_id、環境名
  • バージョン、機能フラグ、エラーコード

 

フィルター構文:

annotation.user_id = "user-123"
annotation.environment = "production"
AND annotation.version = "1.2.3"
AWS のモニタリングとトラブルシューティング

メタデータ

 

主な特徴:

  • インデックスなし — 検索・フィルタリング不可
  • サイズ制限なし
  • 任意の JSON 構造をサポート

用途:

  • リクエスト・レスポンスの全データ
  • エラーメッセージとスタックトレース
  • ビジネスコンテキスト(注文明細、住所など)

 

アノテーションとメタデータの比較:

アノテーション(インデックスあり・検索可能)とメタデータ(詳細・インデックスなし)の比較表

AWS のモニタリングとトラブルシューティング

完全なトレース構造

 

4つのセグメントと最も遅い処理である外部決済 API を含む完全なトレース構造

AWS のモニタリングとトラブルシューティング

レッスンのまとめ

 

  • X-Ray — サービスをまたいだエンドツーエンドの可視性を提供する分散トレーシングサービス
  • トレーシングの仕組み — HTTP ヘッダーによるトレース ID 伝播、デーモンによるセグメント収集、設定可能なサンプリングルール
  • トレースの構成要素:
    • セグメント — サービスレベルの処理記録
    • サブセグメント — ダウンストリーム操作の詳細なタイミング
    • アノテーション — フィルタリング・検索用のインデックス付きキーバリューペア
    • メタデータ — インデックスなしの詳細なコンテキスト情報
AWS のモニタリングとトラブルシューティング

練習しましょう!

AWS のモニタリングとトラブルシューティング

Preparing Video For Download...