AWS X-Rayの学習(AWS認定Developer asociate対策)

## はじめに

* AWS認定ソリューションアーキテクト-アソシエイト、AWS認定SysOpsアドミニストレータ-アソシエイトの資格取得を行いましたので、アソシエイトレベルの資格のラストとしてAWS認定デベロッパー-アソシエイトにチャレンジしたいと思います 
* AWS認定デベロッパーではソリューションアーキテクトやSysOpsアドミニストレータと比べて、実際のサービスを使ってシステムを構築する知識が必要となります
* そのため、試験対象範囲に含まれるAWSサービスについて少し掘り下げて学習していこうと思います
* 各サービスの基本や用語などのポイントを個人メモとして残していきます

## AWS X-Rayとは

* アプリケーションが処理するリクエストに関するデータを収集するサービス
* 本番環境や分散アプリケーション (マイクロサービスアーキテクチャを使用して構築されたアプリケーションなど) を分析およびデバッグできる
* アプリケーション内で転送されるリクエストがエンドツーエンドで表示され、アプリケーションの基盤となるコンポーネントのマップも表示される
* なぜX-Rayが必要か
  * 分散アプリケーションを構築して実行する際、アプリケーションを構成するさまざまなコンポーネントを経由するリクエストを追跡するには、サービスごと、またはリソースごとのプロセスに頼る必要がある
  * 各種のデータ要素を関連付け、エンドユーザーやサービスの下でリクエストが発生してからアプリケーションによってレスポンスが返されるまでの全体像を把握することが難しくなっている
  * X-Rayでは、サービスやリソース中心ではない、ユーザーを中心としたモデルを通して、アプリケーションに対するリクエストに関連したデータが収集され、このモデルにより、ユーザーを中心とした視点で、サービスやリソースを経由するリクエストを把握することができる

## X-Rayを使用するメリット

### リクエスト実行状況の確認ができる

* アプリケーションを構成する個々のサービスやリソースの実行結果のステータスを集計し、アプリケーションの実行状況をエンドツーエンドで確認可能

### アプリケーションの問題検出ができる

* アプリケーションの実行状況について関連する情報を収集し、問題の根本原因を調査可能

### アプリケーションのパフォーマンスを向上できる

* サービスやリソースの関係をリアルタイムで表示し、レイテンシの増加やパフォーマンス低下などのボトルネックを特定可能

### さまざまなアプリケーション向けに使用できる

* 非同期のシンプルなイベント呼び出し、３層のWebアプリケーション、数千のサービスから構成される複雑なマイクロサービスも分析可能

### AWSサービスとの連携ができる

* EC2/ECS/Lambda/Beanstalkと連携可能
* BeanstalkとLambdaは設定変更で有効化される
* EC2/ECSは手動でインストールする必要がある

## X-Rayで出来ること

### サービスマップの作成

* アプリケーションに対するリクエストが追跡され、アプリケーションによって使用されるサービスマップが作成される
* アプリケーション内のサービス間のつながりを把握でき、依存性ツリーの作成、複数の AWS アベイラビリティゾーンまたはリージョン間で発生するレイテンシーやエラーの検出、正常に実行されていないサービスの把握などを行える

### エラーとバグの特定

* アプリケーションに対する各リクエストの応答コードが分析され、アプリケーション内のバグやエラーが自動的に検出される
* そのため、バグやエラーを再現することなく、アプリケーションコードを簡単にデバッグできる

### 独自の分析と可視化アプリケーションの作成

* X-Ray で用意されたクエリ API のセットを使用して、X-Ray で記録されたデータに基づく独自の分析や可視化のためのアプリケーションを構築できる

## X-Rayの概念

### 基本概念

* X-Rayは、サービスから「セグメント形式」でデータを受け取る
* トレースへの共通リクエストを含むセグメントをグループ化する
* トレースを処理して、アプリケーションのビジュアル表現を提供するサービスグラフを生成する

### トレース

* 単一のリクエストに関するサービスをまたいだエンドツーエンドのデータ
* 同じ一意のトレースIDを持つデータポイントの集合体
* アプリケーション内のサービスからX-Rayに送信される各情報はセグメントであり、トレースはセグメントの集合体となる

### セグメント

* トレースの構成要素であり、個々のサービスに対応する
* 分散アプリケーションの 1 つのコンポーネント (認証サービスなど) に関するすべてのデータポイントをカプセル化したもの
  * システム定義のデータとユーザー定義のデータがアノテーションの形式で含まれている
  * サービスからのリモートコールを表す 1 つ以上のサブセグメントで構成されている

### サブセグメント

* セグメントの構成要素であり、個々のリモートコールやローカル処理に対応する
* たとえば、リクエストに応じてアプリケーションからデータベースが呼び出されると、そのリクエストに対して、データベース呼び出しとその結果を表すサブセグメントを伴うセグメントが作成される。サブセグメントには、クエリ、使用されたテーブル、タイムスタンプ、エラーステータスなどのデータが含まれる

### アノテーション

* トレースをフィルタする際に利用可能なビジネスデータ
  * セグメントに関連付けられたシステム定義のデータまたはユーザー定義のデータ
  * １つのセグメントに複数のアノテーションが含まれる場合もある
* システム定義のアノテーション
  * AWS のサービスによってセグメントに追加されたデータ
* ユーザ定義のアノテーション
  * 開発者がセグメントに追加したメタデータ

### メタデータ

* トレースにユーザが追加可能なビジネスデータ（Key-Value形式）
* ただし、トレースのフィルタには使用できない

### エラー

* X-Ray のエラーは、エラーが返された呼び出しのあるセグメントに関連付けられたシステムアノテーション
* ソースファイルと関連付けるためのエラーメッセージ、スタックトレースやその他の追加情報 (バージョンやコミット ID など) が含まれる

### サンプリング

* トレースを取得するリクエストを絞ること、また、その取得割合
* パフォーマンスやコスト効率の観点からすべてを取得している訳ではない
* X-Ray ではデータの完全性が保証されないため、監査やコンプライアンスのツールとして使用することはできない

### X-Rayエージェント

* データをログファイルから収集し、X-Ray サービスに送信するためのエージェント
* API を使って直接送信するよりも簡単にデータを X-Ray サービスに送信することができる
* Amazon Linux AMI、Red Hat Enterprise Linux (RHEL)、Windows Server 2012 R2 以降のオペレーティングシステムで使用できる

### X-Ray SDK

* 以下の呼び出しに対するメタデータを自動でキャプチャするフィルタ機能を提供する
  * AWS SDKを使ったAWSサービスの呼び出し
  * HTTP/HTTPSによるAWS以外のサービスの呼び出し
  * DBアクセス（MySQL,PostghreSQL,Amazon DynamoDB）
  * キュー（Amazon SQS）
* 単純なX-Ray APIへの操作
* SDKを使えばリクエストに関するメタデータを記録するためのコードを手動で実装する必要はない

### X-Rayデーモン

* UDPでX-Ray SDKからのトラフィックを受信し、未加工のセグメントデータを収集する
* 受信したデータを一定時間バッファしたのち、AWS X-Ray APIに送信する
* Linux,OS X,Windows,AWS Lambdaでサポートされている