ECS on Fargate でトレースを取得する

# 概要

AWS Distro for OpenTelemetry サイドカーを作成することで、Amazon ECS は、アプリケーションから AWS X-Ray にトレースをルーティングします。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/trace-data.html?icmpid=docs_ecs_hp-task-definition

https://aws.amazon.com/jp/blogs/opensource/simplifying-amazon-ecs-monitoring-set-up-with-aws-distro-for-opentelemetry/


# 設定

必要な設定は 2 つだけ

- タスクロールを作成する
- AWS Distro for OpenTelemetry サイドカーコンテナを追加する

## タスクロールを作成する

タスクが、AWS X-Ray にトレースをルーティングするための権限をタスクロールに追加してあげる必要があります。

※ `AWSXRayDaemonWriteAccess` 管理ポリシーをアタッチしてあげれば良いです。

```json:AWSDistroOpenTelemetryPolicyForXray
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "xray:PutTraceSegments",
                "xray:PutTelemetryRecords",
                "xray:GetSamplingRules",
                "xray:GetSamplingTargets",
                "xray:GetSamplingStatisticSummaries"
            ],
            "Resource": "*"
        }
    ]
}
```

```json:AmazonECS_OpenTelemetryXrayRole
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "ecs-tasks.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

## AWS Distro for OpenTelemetry サイドカーコンテナを追加する

コンソールからの場合は、モニタリング - オプションで、AWS Distro for OpenTelemetry サイドカーコンテナを簡単に作成できます。
![スクリーンショット 2024-02-10 19.02.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/9cfb8432-b169-752f-d2ec-1a3e028152cc.png)

コンソールを使用していない場合は、AWS OpenTelemetry Distro サイドカーコンテナ をタスク定義に追加します。

```json
{
	"family": "otel-using-xray",
	"taskRoleArn": "arn:aws:iam::111122223333:role/AmazonECS_OpenTelemetryXrayRole",
	"executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole",
	"containerDefinitions": [{
			"name": "aws-otel-emitter",
			"image": "application-image",
			"logConfiguration": {
				"logDriver": "awslogs",
				"options": {
					"awslogs-create-group": "true",
					"awslogs-group": "/ecs/aws-otel-emitter",
					"awslogs-region": "us-east-1",
					"awslogs-stream-prefix": "ecs"
				}
			},
			"dependsOn": [{
				"containerName": "aws-otel-collector",
				"condition": "START"
			}]
		},
		{
			"name": "aws-otel-collector",
			"image": "public.ecr.aws/aws-observability/aws-otel-collector:v0.30.0",
			"essential": true,
			"command": [
				"--config=/etc/ecs/otel-instance-metrics-config.yaml"
			],
			"logConfiguration": {
				"logDriver": "awslogs",
				"options": {
					"awslogs-create-group": "True",
					"awslogs-group": "/ecs/ecs-aws-otel-sidecar-collector",
					"awslogs-region": "us-east-1",
					"awslogs-stream-prefix": "ecs"
				}
			}
		}
	],
	"networkMode": "awsvpc",
	"requiresCompatibilities": [
		"FARGATE"
	],
	"cpu": "1024",
	"memory": "3072"
}
```

# 動作確認

次の通り、AWS Distro for OpenTelemetry サイドカーコンテナが追加されました。

![スクリーンショット 2024-02-12 18.20.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b89b7d17-a76b-7878-e191-44b48df83fbc.png)

なお、main-container は、AWS Open Source Blog に記載のあったイメージを使用させていただいております。

次の通りコンテナにリクエスします。

```
curl -v http://X.X.X.X:8080/outgoing-http-call
```

CloudWatch > トレースを確認し記録されていることを確認しましょう。

![スクリーンショット 2024-02-12 18.27.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a3fe028a-7095-3195-8466-0fb721ebcd09.png)