AWS Distro for OpenTelemetryの検証環境をTerraformとecspressoで手軽に構築する
お疲れさまです。とーちです。
最近、OpenTelemetryの検証をする機会があり、AWS Distro for OpenTelemetry(ADOT)のサンプルコードを動かすための環境が必要になりました。検証用途なので、サクッと環境を用意して、使わないときはコスト最小化できる構成が理想的です。
そこで今回は、TerraformとecspressoでADOTのサンプルアプリケーションを動かすための環境を構築してみました。この記事では、その構築方法と使い方について解説します。
構築する環境の要件
今回構築する環境には、以下の要件を満たしたいと考えました:
- ALB + ECS Fargate構成でOpenTelemetryサンプルアプリケーションを動かせること
- 必要に応じてサンプルアプリケーションを変更し、デプロイできること
- 使わないときは最小限の課金にできること
- Observability バックエンドとしてはとりあえずAWS X-Rayを使用すること
構築する環境のアーキテクチャ
今回構築する環境のアーキテクチャは以下のようになります:
基本的なALB + ECS Fargateの構成で、ECS上でADOTのサンプルアプリケーションを動かします。パブリックサブネットにALBを配置し、プライベートサブネットにECS Fargateを配置する一般的なアーキテクチャです。
サンプルアプリケーションは、AWS Distro for OpenTelemetryが提供するGo言語のサンプルコードを使用します。このサンプルアプリケーションは、OpenTelemetry SDKを使用してトレース情報を生成し、サイドカーとして動作するADOT Collectorを経由してAWS X-Rayにトレース情報を送信します。
なお、コードは以下のリポジトリに公開していますので、ぜひご活用ください:
コードの説明
リポジトリの主要なファイルとディレクトリ構成について説明します。
envs/dev/main.tf
このファイルでは、VPCとNATインスタンス、ALBとECSクラスター、およびECSで使用する関連リソースを作成するコードが含まれています。main.tf
から各種モジュールを呼び出して必要なリソースを作成する形になっています。
通常はNAT Gatewayをプライベートサブネットのインターネットアクセス用に使うことが多いですが、今回はNATインスタンスを使用しています。これは検証用途なので、使わないときに気軽にインスタンスを停止できるようにするためです
appディレクトリ
このディレクトリにはecspresso関連のファイルが入っています。ecspressoは、ECSのデプロイを簡単に行うためのツールで、タスク定義やサービス定義をYAMLで管理し、ECSへのデプロイを自動化できます。
envs/dev/main.tf
で作成したtfstateファイルを読み込むことで、Terraform側で作成したリソースのARNなどの情報を取得する仕組みになっています。これにより、Terraformで作成したリソースとecspressoで管理するECSリソースを連携させることができます。
環境構築の手順
それでは実際に環境を構築していきましょう。
1. リポジトリのクローン
まず、GitHubリポジトリをクローンします。サブモジュールも一緒に取得するために、--recurse-submodules
オプションを使用します。
git clone --recurse-submodules https://github.com/ice1203/blog-otel-ecs.git
cd blog-otel-ecs
2. 必要なツールのインストール
必要なツールをインストールします。リポジトリではaquaを使用していますので、以下のコマンドでインストールできます。aquaはツールバージョン管理ツールで、aqua i
コマンドを実行することで、リポジトリで定義されている必要なツール(Terraformやecspressoなど)を自動的にインストールします。
aqua i
3. Terraformによるインフラ構築
まず、Terraformの設定ファイルがあるディレクトリに移動します。
cd envs/dev
環境変数の設定
Terraformで使用する環境変数を設定します。direnvなどを使うと便利です。
export TF_VAR_env="dev"
export TF_VAR_system="test"
export TF_VAR_ec2_key_pair_name="<適当なEC2キーペア名>"
backend.tfの修正
backend.tf
のバケット名の部分を自分の環境に合わせて修正します。このS3バケットはTerraformの状態ファイルを保存するために使用します。
terraform {
backend "s3" {
bucket = "<s3バケット名>"
key = "blog-otel-ecs/environments/dev/terraform.tfstate"
region = "ap-northeast-1"
}
}
Terraformの実行
Terraformを実行してインフラを構築します。
terraform plan
terraform apply -auto-approve
4. コンテナイメージのビルドとECSへのデプロイ
次に、サンプルアプリケーションがあるディレクトリに移動します。
cd ../../app/aws-otel-community/sample-apps/go-sample-app/
ECRへのコンテナイメージのプッシュ
ECRにコンテナイメージをプッシュします。以下のコマンドでは、AWS Distro for OpenTelemetryのサンプルアプリケーションをビルドし、Amazon ECRにプッシュしています。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
docker build -t test-dev-repo ./
docker tag test-dev-repo:latest <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/test-dev-repo:latest
docker push <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/test-dev-repo:latest
環境変数の設定
ecspressoで使用する環境変数を設定します。これらの環境変数は、ecspressoがTerraform状態ファイルから情報を取得するために必要です。
export TFSTATE_BUCKET=<tfstateを保存しているS3バケット名>
export TFSTATE_BUCKET_PATH=blog-otel-ecs/environments/dev
export IMAGE_TAG=latest
ecspressoによるECSへのデプロイ
ecspressoを使用してECSにデプロイします。verify
コマンドでデプロイ前の検証を行い、問題がなければdeploy
コマンドでデプロイを実行します。
ecspresso verify
ecspresso deploy
動作確認
サービスがデプロイできたら、以下のURLからアクセスできます。
http://<ALBのDNS名>/
何度かアクセスすると、マネジメントコンソールの「CloudWatch」→「X-Rayトレース」→「トレース」から、以下のようなトレース情報が確認できます。
これにより、OpenTelemetryを使ったトレース情報がAWS X-Rayに正常に送信され、可視化されていることが確認できます。
環境の削除手順
検証が終わったら、以下の手順で環境を削除できます。
1. ECSサービスの削除
まず、サンプルアプリのディレクトリに移動していることを確認します。移動していない場合は以下のコマンドで移動します。
cd /path/to/blog-otel-ecs/app
先ほど設定した環境変数が有効な状態で、以下のコマンドを実行します。まずタスク数を0にスケールダウンしてから、サービスを削除します。
ecspresso scale --tasks 0 && ecspresso delete --force
2. Terraformリソースの削除
次に、Terraformのディレクトリに移動します。
cd ../envs/dev
Terraform用の環境変数が有効な状態で以下のコマンドを実行します。これにより、作成したすべてのAWSリソースが削除されます。
terraform destroy --auto-approve
まとめ
今回は、AWS Distro for OpenTelemetryのサンプルコードを動かすための環境をTerraformとecspressoで構築する方法を紹介しました。この環境を使えば、OpenTelemetryの検証をサクッと始めることができます。
OpenTelemetryを使った可観測性基盤の検証をしたいけど、環境構築に時間をかけたくないという方は、ぜひこのリポジトリを活用してみてください。
以上、とーちでした。