AWS X-Rayのまとめ(AWS DVA対策)

AWS DVA

AWS Certified Developer – Associate(DVA) を勉強中です。

先日、AWS X-Rayのチュートリアルをやってみて、なんとなくではありますが、できる事がわかりました。
今回はAWS DVA対策として、AWS X-Rayを理解するためのキーワードを自分なりにまとめました。

サービスマップ(トレースマップ)

AWS X-Rayといえばこれだと思います。

以下の図がサービスマップですが、クライアントからのリクエストをECSで受け付けて、そこから更にECSがDynamoDBのAPIを実行していることがわかります。

以下のように表示を切り替えることで、平均レイテンシ、平均リクエスト数などもわかります。◯の大きさはリクエストの多さを表しており丸の赤色は障害(5XX)の発生を表しているようです。

ちなみに、キャプチャ画面にはTrace Mapと書いていますが、サービスマップはTrace Mapに統合されたようです。X-Ray トレースマップの使用 – AWS X-Ray

セグメント

セグメントは、以下の図のようにECS などのサービスが X-Ray に送信する“処理の記録”です。

例として、下のキャプチャは ECS がクライアントからリクエストを受け取ったときに作られたセグメントです。

このセグメントには、以下の情報が含まれます。

  1. リクエストの開始と終了の時間、リクエストの所要時間
  2. リクエストのURL、メソッド、結果のステータスコード
  3. エラーと障害の情報(あれば)
  4. [リソース]タブ:このセグメントを送ってきた環境の情報が表示されます。
    今回でいうとEC2で動いているコンテナの情報です。なんのための情報かというと、例えば、「エラーが発生したセグメントが、どのEC2で動いていたか」がすぐに分かります。

後述しますが、セグメントにはX-Ray SDKを使って、注釈(Annotation)やメタデータなどの情報も付与することができます。

サブセグメント

サブセグメントは、セグメントをさらに細かく分けて『何をやったか』を記録したものです。

例えば先ほどのセグメントは『ECS がクライアントからリクエストを受け取ってレスポンスを返した』という全体の処理を表しています。

その中でレスポンスを返すまでには、

  • DynamoDB からデータを取得・登録する
  • Amazon SNS に通知を送る

といった処理が行われています。

このように、クライアントからリクエストを受けてレスポンスを返すまでの間に ECS が実際にどんな処理をしたのかを詳しく記録しているのがサブセグメントです。

このサブセグメントには以下の情報が含まれます。(セグメントとほぼ同じです)

  1. 処理の開始と終了の時間、処理の所要時間
  2. リクエストのURL、メソッド、結果のステータスコード
  3. エラーと障害の情報(あれば)

[リソース]タブ:キャプチャはDynamoDBの例ですが、テーブルネーム、操作(GetItem)、Consistent read(強力な整合性のある読み込みかどうか)の情報があります。ここに示される情報はサービスによって違います。

トレース

トレースは1つのリクエストで生成されたセグメントの全てのことを言います。
今回の例ではクライアントがECSにリクエストをして、ECSがDynamoDBのAPIを実行したということなのでトレースはECSのセグメントだけです。(DynamoDBはセグメントを送らないようです)
例えば、API Gateway→Lambda→API Gateway→Fargate→S3のような構成でのリクエストの流れでは、トレースに含まれるセグメントは4つです。

AWS-Black-Belt_2023_AWS-X-Ray_0228_v1.pdfより

サンプリング

サンプリングはトレースを取得する頻度やルールを決めるものです。デフォルトでは1秒毎に最低1つはリクエストをサンプリングし、その後はリクエストの5%が取得されます。
このサンプリングを設定する理由は、コストのためだけではなく、効率的にアプリケーションの代表的なリクエストをトレースする目的もあります。

サンプリングのルールの例として、

  • POSTメソッドは1秒毎に最低10のリクエストを取得し、その後は10%を取得する
  • PUTメソッドはpathが/history/*のリクエストは全て取得する

のように、複数の設定ができます。

フィルタ式

フィルタ式は、条件に合致するトレースを大量のトレースの中から検索するための式です。

X-Rayでは大量のトレースが取得されるので、フィルタ式を使用して特定のパスやユーザーのトレースを見つけることができます。

以下は、フィルタ式の構文です。

keyword operator value

例えば以下のキャプチャでは、responsetime (応答時間)が0.1秒以上のトレースを検索し、結果として7件のトレースがヒットしていることが分かります。

※右ペインの「クエリ」を選択すると、サンプルクエリを確認することができます。

また、以下の例はリクエストURLに“/api/game/”を含むトレースをフィルタします。

http.url CONTAINS "/api/game/"

他にも様々なkeywordや演算子がありますので、気になる方は公式ドキュメントを確認してみてください。

フィルター式の使用 – AWS X-Ray

Keywordの例

keyword意味
duration所要時間
http.statusレスポンスステータスコード
http.urlリクエストURL
http.methodリクエストメソッド

注釈(Annotation)とメタデータ

どちらもセグメントに追加するデータですが、明確に違いがあります。

注釈(Annotation)

  • インデックス化されたキーと値のペア
  • インデックス化されている = フィルタ式で検索できる

→検索用

メタデータ

  • オブジェクトとリストを含む、任意のタイプの値を持つことができるキーと値のペア
  • インデックスは作成されない = フィルタ式での検索はできない

→ セグメントに追加のデータを保存してデバッグ用に使う

X-Rayにセグメントを送る方法

ここからは、「どうやってX-Rayによる計測を開始するのか?」を確認したいと思います。

EC2で動作するアプリケーションの場合

EC2で動作するアプリケーションを計測するために必要な作業は以下です

  • X-Ray SDKを使ってアプリケーションコードに計測するためのコードを組み込む。
    →X-Ray SDKは6つの言語(Go,Java,Node.js, Python, .NET, Ruby)で用意されています。
  • EC2にX-Rayデーモンをインストールする
  • インスタンスプロファイルを使用して、X-RayデーモンがセグメントデータをX-Ray APIにアップロードするためのアクセス権限を付与する

以上の設定により、X-Rayによる計測を行うことができます。

X-Rayデーモンとは

X-RayデーモンはUDPポート2,000をリッスンし、未加工のセグメントデータをX-Ray APIに送信するアプリケーションソフトウェアです。
なぜ、X-Rayデーモンを経由してX-Ray APIにセグメントを送るのかというと、計測するアプリケーションの負荷を最低限にするためです。

ECSで操作するアプリケーションの場合

ECSの場合は、X-Rayデーモンプロセスを実行するコンテナをsidecarとしてデプロイします
このときも、タスクロールに管理ポリシーを追加して、X-RayデーモンがセグメントデータをX-Ray APIにアップロードするためのアクセス権限を付与する必要があります。

AWS Lambdaの場合

Lambda関数の設定から有効化できるようです。

AWS-Black-Belt_2023_AWS-X-Ray_0228_v1.pdfより

その他

API Gateway、App Runner、SNSなどのAWSサービスも設定画面から有効化できるようです。

X-Rayが利用できるその他のAWSサービスは、他の AWS X-Ray との統合 AWS のサービス – AWS X-Rayをご確認ください。

最後に

AWSのX-Rayのドキュメントに以下の注記がありました。

End-of-support通知 – 2027 年 2 月 25 日、 AWS X-Ray は AWS X-Ray SDKs とデーモンのサポートを終了します。2027 年 2 月 25 日以降、更新やリリースは配信されなくなります。サポートタイムラインの詳細については、「」を参照してくださいX-Ray SDK とデーモンのサポート終了タイムライン。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「X-Ray 計測から OpenTelemetry 計測への移行」を参照してください。
X-Ray の使用開始 – AWS X-Ray

ということで、AWS Certified Developer – Associate(DVA)の試験バージョンが変わるときには、X-Rayではなく、OpenTelemetryが試験範囲になるかもしれませんね。
また勉強し直さないと。

以上です。
この記事がどなたかのお役に立てれば幸いです。
もし間違いを見つけた場合は、コメントで教えていただけると助かります。

コメント