X-rayでサービスの数珠つなぎをやってみる：実践編

# TL;DR
AWSの分散トレーシングと言えば「X-ray」です。
API Gateway - Lambda - DynamoDB といったサーバレスアーキテクチャの分散トレーシングの方法は簡単に見つかります。
しかし、EC2間だったり、コンテナ間の分散トレーシングの方法はなかなか見つからなかったので、書きました。

# サンプルコード
こちらに置いています
[asahi0301/python-flask-xray](https://github.com/asahi0301/python-flask-xray)

# 中身
## 概要
コンテナが4つ起動します。
flask(python)コンテナが3つ、xrayコンテナが1つです。
クライアント ->  API1 -> API2 -> API3 の順でアクセスします。
それぞれのAPI1,2,3がxrayコンテナに対して、トレーシング結果を送信します。
xrayコンテナが、xrayサービスへデータを送信します。


# 実行してみる
## 環境
* dockerインストール済み
* docker composeインストール済み
* ローカル環境には適切なIAMを設定済み
    * xrayコンテナが、xrayサービスへデータを送信するので、xrayへのput権限が必要です

## コンテナ起動

```sh
git clone https://github.com/asahi0301/python-flask-xray.git
cd python-flask-xray
docker-compose up
```

```sh

(コンテナがbuildされて起動します)                                                                                               
Starting python-flask-xray_xray_1 ... done
Starting python-flask-xray_api3_1 ... done
Starting python-flask-xray_api2_1 ... done
Starting python-flask-xray_api1_1 ... done
Attaching to python-flask-xray_xray_1, python-flask-xray_api3_1, python-flask-xray_api2_1, python-flask-xray_api1_1
xray_1  | 2019-04-22T13:57:11Z [Info] Initializing AWS X-Ray daemon 3.0.0
xray_1  | 2019-04-22T13:57:11Z [Info] Using buffer memory limit of 79 MB
xray_1  | 2019-04-22T13:57:11Z [Info] 1264 segment buffers allocated
xray_1  | 2019-04-22T13:57:11Z [Info] Using region: us-east-1
xray_1  | 2019-04-22T13:57:11Z [Info] Starting proxy http server on 0.0.0.0:2000
api3_1  |  * Serving Flask app "api3" (lazy loading)
api3_1  |  * Environment: production
api3_1  |    WARNING: Do not use the development server in a production environment.
api3_1  |    Use a production WSGI server instead.
api3_1  |  * Debug mode: on
api3_1  |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
api3_1  |  * Restarting with stat
api3_1  |  * Debugger is active!
api3_1  |  * Debugger PIN: 206-986-208
api2_1  |  * Serving Flask app "api2" (lazy loading)
api2_1  |  * Environment: production
api2_1  |    WARNING: Do not use the development server in a production environment.
api2_1  |    Use a production WSGI server instead.
api2_1  |  * Debug mode: on
api2_1  |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
api2_1  |  * Restarting with stat
api2_1  |  * Debugger is active!
api2_1  |  * Debugger PIN: 297-814-508
api1_1  |  * Serving Flask app "api1" (lazy loading)
api1_1  |  * Environment: production
api1_1  |    WARNING: Do not use the development server in a production environment.
api1_1  |    Use a production WSGI server instead.
api1_1  |  * Debug mode: on
api1_1  |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
api1_1  |  * Restarting with stat
api1_1  |  * Debugger is active!
```

## ローカルからリクエストを送信

```sh
curl localhost

{
  "api1": "ok", 
  "api2": "ok", 
  "api3": "ok"
}
```

```
何度かcurlを繰り返し実行して、以下のようなログがdocker-composeに表示されると成功です
xray_1  | 2019-04-22T13:59:55Z [Info] Successfully sent batch of 3 segments (0.058 seconds)
```


## 確認
デフォルトでは、us-east-1(バージニア北部リージョン)のx-rayにデータを送信するようになっているので、マネジメントコンソールより確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107953/989a8c74-e908-0696-e36a-deff5ed9b06c.png)

こんな感じで
クライアント - API1 - API2 - API3 がつながっていることが確認できます。

# まとめ
シンプルな実装ですが、マイクロサービスの数が増えたりすると、かなり重宝するのではないでしょうか？


# Next
ソースコードの説明を行う予定です