本連載では、以下に示すようなマイクロサービスアーキテクチャのアプリケーション環境を構築しています。

構成図

前回までに、バックエンドのマイクロサービスからユーザーの情報を取得し、フロントエンドのWebアプリケーションで認証/認可を行う処理を実装しました。このようにリクエストの呼び出しが複数のアプリケーションやマイクロサービスにまたがって多段に及ぶ場合、通信時に問題が生じる可能性があるため、呼び出し状況の可視化が重要になります。確認するべき項目は、サービス呼び出しのレスポンスタイム遅延やエラー発生状況、その際のリクエスト呼び出し状況のトレーシングログなどです。

今回からは、アプリケーションの分析/デバッグサービスである「AWS X-Ray」を用いて、マイクロサービスの呼び出し状況の可視化を行い、リクエストの呼び出し結果をDynamoDBに保存するようにアプリケーションを修正していきましょう。

AWS X-Rayの概要

AWS X-Rayはアプリケーションのメトリクス収集/可視化/分析ができるサービスです。アプリケーション内に処理開始/終了時間などのメトリクスを収集する環境を設定しておくと、以下の図のように、別のアプリケーションサービスやS3やRDS、DynamoDB、SQSといったAWSリソースの呼び出し状況を可視化することができます。

サービスマップ

AWS X-Rayのサービスマップ

X-Rayには、呼び出し関係やリクエスト処理の成功/失敗状況を可視化できる上述のサービスマップのほか、アプリケーションの処理状況をセグメント/サブセグメントと呼ばれる単位で実行時間を詳細化して可視化できるトレースリスト、応答時間の分布や期間分布を解析するアナリティクスツールの計3種類の機能があります。

トレースリスト

AWS X-Rayのトレースリスト

アナリティクスツール

AWS X-Rayのアナリティクスツール

X-Rayではメトリクス収集のためのSDKライブラリがさまざまな言語で提供されており、JavaやNode.js、Python、#C、Ruby、Go言語で利用可能です。アプリケーションの処理のなかでX-RayのSDKライブラリのAPIを呼び出すことでトレースデータを収集し、アプリケーションを実行しているサーバやコンテナ環境で動くX-Rayデーモンが定期的にAWS側へデータを送信します。

X-Rayデーモンの実行環境は、EC2やECSをはじめ、AppMesh、AWS Lambda、API GatewayなどさまざまなAWSリソースでサポートされています。収集したデータはCloudWatchとも統合されているので、実行ログを手動で細かく解析することも可能です。

ローカル環境で動かすAWS X-Rayの環境設定

では、実際にX-Rayを使ってアプリケーションのメトリクスを収集できる環境を構築していきましょう。まず、ローカルの端末でX-Rayの実行環境を構築してみます。

なお、本連載で実際に作成するアプリケーションはGitHub上にコミットしています。以降に記載するソースコードでは、import文など本質的でない記述を省略している部分があるので、実行コードを作成する際は、必要に応じて適宜GitHubにあるソースコードも参照してください。

前節でも解説した通り、X-Rayを実行するにはメトリクス情報を送信するためのX-Rayデーモンを実行し、アプリケーションからSDKのライブラリを呼び出してトレースデータを収集する必要があります。X-RayデーモンはAWS公式サイトのページAWS X-Ray デーモン」に従って、ダウンロード/インストールすればよいのですが、本連載では、同ページにある「DockerコンテナでX-Rayデーモンを実行する」に記載の手順に沿って、ローカル端末にインストールされたDocker上で、X-Rayデーモンが実行されたAmazonLinuxマシンイメージを実行してみます。

事前準備

本稿では詳細な説明は割愛しますが、事前にDockerをインストールし、AWSコンソールのIAMメニューでアプリケーション用のユーザーを作成しておく必要があります。AWS公式ページ「設定ファイルと認証情報ファイル」を参考にユーザーホームフォルダに.awsディレクトリを作成し、「credential」というファイルを作成して、CSV形式の認証キーに記載しているユーザー認証情報を、以下の形式で保存してください。

[default]
aws_access_key_id=XXXXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYYYY

また、上記のクレデンシャルを持つユーザーはX-Rayへの接続権限を持つ必要があります。以下のように、AWSコンソールで「IAM」サービスメニューから、ユーザーにX-Rayのアクセス権限を付与しておいてください。

アクセス権限を付与

デーモン実行環境の構築

それでは、デーモン実行環境を構築していきましょう。Dockerがインストールされた端末で、以下のようなDockerfileを作成します。

common/src/main/docker/xray-daemon/Dockerfile
FROM amazonlinux
RUN yum install -y unzip
RUN curl -o daemon.zip https://s3.us-east-2.amazonaws.com/aws-xray-assets.us-east-2/xray-daemon/aws-xray-daemon-linux-3.x.zip
RUN unzip daemon.zip && cp xray /usr/bin/xray
ENTRYPOINT ["/usr/bin/xray", "-t", "0.0.0.0:2000", "-b", "0.0.0.0:2000"]
EXPOSE 2000/udp
EXPOSE 2000/tcp

作成したら、Dockerイメージをビルドして実行します。実行する際は、vオプションを使って、ローカル端末にある~/.aws配下のクレデンシャル情報をDockerイメージ内の/root/.awsへマウントするように設定し、リージョン情報を環境変数で設定します。2000番ポートをオープンして、Dockerイメージを実行してください。以下の通り、プロキシが立ち上がればOKです。

$ docker build -t test/xray-daemon common/src/main/docker/xray-daemon

// omit

$ docker run --attach STDOUT -v ~/.aws/:/root/.aws/ --net=host -e AWS_REGION=ap-northeast-1 --name xray-daemon -p 2000:2000/udp test/xray-daemon:latest -o

WARNING: Published ports are discarded when using host network mode
2020-09-05T23:08:58Z [Info] Initializing AWS X-Ray daemon 3.2.0
2020-09-05T23:08:58Z [Info] Using buffer memory limit of 160 MB
2020-09-05T23:08:58Z [Info] 2560 segment buffers allocated
2020-09-05T23:08:58Z [Info] Using region: ap-northeast-1
2020-09-05T23:08:58Z [Info] HTTP Proxy server using X-Ray Endpoint : https://xray.ap-northeast-1.amazonaws.com
2020-09-05T23:08:58Z [Info] Starting proxy http server on 0.0.0.0:2000

今回はAWS X-Rayの概要を説明し、実行に必要なX-RayデーモンのDockerイメージを作成/実行しました。次回はX-Rayのトレースデータを収集するための設定を実装していきます。

著者紹介


川畑 光平(KAWABATA Kohei) - NTTデータ

金融機関システム業務アプリケーション開発・システム基盤担当、ソフトウェア開発自動化関連の研究開発を経て、デジタル技術関連の研究開発・推進に従事。

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなど様々な開発プロジェクト支援にも携わる。AWS Top Engineers & Ambassadors選出。

本連載の内容に対するご意見・ご質問は Facebook まで。