

# アプリケーションメトリクスを使用して Amazon ECS アプリケーションのパフォーマンスを相関させる
<a name="metrics-data"></a>

Fargate の Amazon ECS は、Fargate で実行されているアプリケーションからメトリクスを収集してそれを Amazon CloudWatch または Amazon Managed Service for Prometheus のいずれかにエクスポートすることをサポートしています。

収集したメタデータを使用すると、アプリケーションパフォーマンスデータを基礎となるインフラストラクチャデータと相関させることができるため、問題解決までの平均時間を短縮できます。

Amazon ECS は、OpenTelemetry サイドカーコンテナ用 AWS Distro を使用して、アプリケーションメトリクスを収集して宛先にルーティングします。Amazon ECS コンソールエクスペリエンスでは、タスク定義の作成時にこの統合を追加するプロセスが簡素化されます。

**Topics**
+ [アプリケーションメトリクスを Amazon CloudWatch にエクスポートする](application-metrics-cloudwatch.md)
+ [アプリケーションメトリクスを Amazon Managed Service for Prometheus にエクスポートする](application-metrics-prometheus.md)

# アプリケーションメトリクスを Amazon CloudWatch にエクスポートする
<a name="application-metrics-cloudwatch"></a>

Fargate の Amazon ECS は、カスタムメトリクスとして、Amazon CloudWatch にカスタムアプリケーションメトリクスをエクスポートすることをサポートしています。これは、OpenTelemetry サイドカーコンテナ用 AWS Distro をタスク定義に追加することによって実行します。Amazon ECS コンソールでは、新しいタスク定義の作成時に **[メトリクス収集の使用]** オプションを追加することでこのプロセスが簡素化されます。詳細については、「[コンソールを使用した Amazon ECS タスク定義の作成](create-task-definition.md)」を参照してください。

アプリケーションメトリクスは、ロググループ名 `/aws/ecs/application/metrics` を使用して CloudWatch Logs にエクスポートされ、メトリクスは `ECS/AWSOTel/Application` ネームスペースで表示できます。アプリケーションは、OpenTelemetry SDK を使用して計測する必要があります。詳細については、「AWS Distro for OpenTelemetry ドキュメント」の「[AWS Distro for OpenTelemetry の概要](https://aws-otel.github.io/docs/introduction)」を参照してください。

## 考慮事項
<a name="application-metrics-cloudwatch-considerations"></a>

OpenTelemetry 用 AWS Distro と Fargate 統合に Amazon ECS を使用して Amazon CloudWatch にアプリケーションメトリクスを送信する場合、次のことを考慮する必要があります。
+ この統合では、カスタムアプリケーションメトリクスのみを CloudWatch に送信します。タスクレベルのメトリクスが必要な場合は、Amazon ECS クラスター設定で Container Insights を有効にします。詳細については、「[オブザーバビリティが強化された Container Insights を使用し、Amazon ECS コンテナを監視する](cloudwatch-container-insights.md)」を参照してください。
+ AWS Distro for OpenTelemetry の統合は、Fargate でホストされている Amazon ECS ワークロード、および、Amazon EC2 インスタンスでホストされている Amazon ECS ワークロード用としてサポートされています。現在、外部インスタンスはサポートされていません。
+ CloudWatch は、メトリクスごとに最大 30 個のディメンションをサポートします。デフォルトの Amazon ECS は `TaskARN`、`ClusterARN`、`LaunchType`、`TaskDefinitionFamily`、`TaskDefinitionRevision` ディメンションをメトリクスに含めることが既定となります。残りの 25 個のディメンションは、アプリケーションで定義できます。30 個以上のディメンションが設定されている場合、CloudWatch はそれらを表示できません。この場合、アプリケーションメトリクスは `ECS/AWSOTel/Application` CloudWatch のメトリクス名前空間に表示されますが、ディメンションは表示されません。アプリケーションを計測して、さらにディメンションを追加できます。詳細については、「AWS Distro for OpenTelemetry ドキュメント」の「[AWS Distro for OpenTelemetry で CloudWatch のメトリクスを使用する](https://aws-otel.github.io/docs/getting-started/cloudwatch-metrics)」を参照してください。

## OpenTelemetry 用 AWS Distro と Amazon CloudWatch の統合に必要な IAM 許可
<a name="application-metrics-cloudwatch-iam"></a>

Amazon ECS と OpenTelemetry 用 AWS Distro の統合には、タスク用 IAM ロールを作成し、タスク定義でロールを指定する必要があります。OpenTelemetry サイドカー用 AWS Distro サイドカーを、CloudWatch ログに対するルートコンテナログにも構成することをお勧めします。これには、タスク実行 IAM ロールを作成して、タスク定義でも指定する必要があります。Amazon ECS コンソールは、ユーザーに代わってタスク実行 IAM ロールを処理しますが、タスク IAM ロールは手動で作成してタスク定義に追加する必要があります。タスクの実行 IAM ロールの詳細については、「[Amazon ECS タスク実行IAM ロール](task_execution_IAM_role.md)」を参照してください。

**重要**  
OpenTelemetry 用 AWS Distro 統合を使用してアプリケーションのトレースデータも収集する場合、タスク IAM ロールもその統合に必要な許可が含まれていることを確認します。詳細については、「[アプリケーショントレースデータを使用して Amazon ECS 最適化の機会を特定する](trace-data.md)」を参照してください。  
アプリケーションに権限が追加で必要な場合は、それらの権限をこのポリシーに追加する必要があります。各タスク定義では、タスク用の IAM ロールを 1 個のみ指定できます。例えば、Systems Manager に保存されているカスタム設定ファイルを使用する場合、この IAM ポリシーに `ssm:GetParameters` 権限を追加する必要があります。

**Elastic Container Service のサービスロールを作成するには (IAM コンソール)**

1. AWS マネジメントコンソール にサインインして、IAM コンソール [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開きます。

1. IAM コンソールのナビゲーションペインで、**[ロール]**、**[ロールを作成]** を選択します。

1. **信頼できるエンティティタイプ** で、**AWS のサービス** を選択します。

1. **[サービスまたはユースケース]** で **[エラスティックコンテナサービス]** を選択し、次に **[エラスティックコンテナのサービスタスク]** を選択します。

1. [**次へ**] を選択します。

1. **[アクセス許可を追加]** セクションで **[AWSDistroOpenTelemetryPolicyForXray]** を検索し、そのポリシーを選択します。

1. (オプション) [アクセス許可の境界](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)を設定します。このアドバンスド機能は、サービスロールで使用できますが、サービスにリンクされたロールではありません。

   1. **[アクセス許可の境界の設定]** セクションを開き、**[アクセス許可の境界を使用してロールのアクセス許可の上限を設定する]** を選択します。

      IAM には、アカウント内の AWS 管理ポリシーとカスタマー管理ポリシーのリストがあります。

   1. アクセス許可の境界として使用するポリシーを選択します。

1. [**次へ**] を選択します。

1. このロールの目的を識別しやすいロール名またはロール名サフィックスを入力します。
**重要**  
ロールに名前を付けるときは、次のことに注意してください。  
ロール名は AWS アカウント内で一意である必要があります。ただし、大文字と小文字は区別されません。  
例えば、**PRODROLE** と **prodrole** の両方の名前でロールを作成することはできません。ロール名がポリシーまたは ARN の一部として使用される場合、ロール名は大文字と小文字が区別されます。ただし、サインインプロセスなど、コンソールにロール名がユーザーに表示される場合、ロール名は大文字と小文字が区別されません。
他のエンティティがロールを参照する可能性があるため、ロールを作成した後にロール名を編集することはできません。

1. (オプション) **[説明]** にロールの説明を入力します。

1. (オプション) ロールのユースケースとアクセス許可を編集するには、**[ステップ 1: 信頼されたエンティティを選択]** または **[ステップ 2: アクセス権限を追加]** のセクションで **[編集]** を選択します。

1. (オプション) ロールの識別、整理、検索を簡単にするには、キーと値のペアとしてタグを追加します。IAM でのタグの使用の詳細については、「*IAM ユーザーガイド*」の「[AWS Identity and Access Management リソースのタグ](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)」を参照してください。

1. ロールを確認したら、**[ロールを作成]** を選択します。

## タスク定義の OpenTelemetry サイドカー用 AWS Distro を指定
<a name="application-metrics-cloudwatch-containerdefinitions"></a>

Amazon ECS コンソールでは、**[メトリクス収集の使用]** オプションを使用することで、OpenTelemetry サイドカーコンテナ用の AWS Distro を作成するエクスペリエンスが簡素化されます。詳細については、「[コンソールを使用した Amazon ECS タスク定義の作成](create-task-definition.md)」を参照してください。

Amazon ECS コンソールを使用していない場合、OpenTelemetry サイドカーコンテナ用 AWS Distro を手動でタスク定義に追加できます。次のタスク定義の例は、Amazon CloudWatch 統合に OpenTelemetry サイドカー用 AWS Distro を追加するためのコンテナの定義を示しています。

```
{
	"family": "otel-using-cloudwatch",
	"taskRoleArn": "arn:aws:iam::111122223333:role/AmazonECS_OpenTelemetryCloudWatchRole",
	"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/ecs-cloudwatch.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"
}
```

# アプリケーションメトリクスを Amazon Managed Service for Prometheus にエクスポートする
<a name="application-metrics-prometheus"></a>

Amazon ECS は、タスクレベル CPU、メモリ、ネットワーク、ストレージメトリクス、カスタムアプリケーションメトリクスを Amazon Managed Service for Prometheus へエクスポートすることをサポートしています。これは、OpenTelemetry サイドカーコンテナ用 AWS Distro をタスク定義に追加することによって実行します。Amazon ECS コンソールでは、新しいタスク定義の作成時に **[メトリクス収集の使用]** オプションを追加することでこのプロセスが簡素化されます。詳細については、「[コンソールを使用した Amazon ECS タスク定義の作成](create-task-definition.md)」を参照してください。

メトリクスは Amazon Managed Service for Prometheus にエクスポートされ、Amazon Managed Grafana ダッシュボードを使用して閲覧できます。アプリケーションは、Prometheus ライブラリまたは OpenTelemetry SDK のいずれかとインストルメント化する必要があります。OpenTelemetry SDK を使用したアプリケーションの計測の詳細については、AWS Distro for OpenTelemetry ドキュメントの「[AWS Distro for OpenTelemetry の概要](https://aws-otel.github.io/docs/introduction)」を参照してください。

Prometheus ライブラリを使用する場合は、アプリケーションがメトリクスデータのスクレイプに使用する `/metrics` のエンドポイントを公開する必要があります。Prometheus ライブラリを使用してアプリケーションを計測する詳細については、「Prometheus ドキュメント」の「[Prometheus クライアントライブラリ](https://prometheus.io/docs/instrumenting/clientlibs/)」を参照してください。

## 考慮事項
<a name="application-metrics-prometheus-considerations"></a>

AWS Distro for OpenTelemetry での Fargate 統合で Amazon ECS を使用し、 Amazon Managed Service for Prometheus にアプリケーションメトリクスを送信する場合には、次のことを考慮する必要があります。
+ AWS Distro for OpenTelemetry の統合は、Fargate でホストされている Amazon ECS ワークロード、および、Amazon EC2 インスタンスでホストされている Amazon ECS ワークロード用としてサポートされています。現在、外部インスタンスはサポートされていません。
+ デフォルトの OpenElementry 用 AWS Distro には、Amazon Managed Service for Prometheus へエクスポートするとき、アプリケーションメトリクス用にタスクレベルのディメンションがすべて含まれています。アプリケーションをインストルメント化して、ディメンションを追加することもできます。詳細については、「AWS Distro for OpenTelemetry ドキュメント」の「[Amazon Managed Service for Prometheus のリモート書き込みの使用開始](https://aws-otel.github.io/docs/getting-started/prometheus-remote-write-exporter)」を参照してください。

## OpenTelemetry 用 AWS Distro と Amazon Managed Service for Prometheus の統合に必要な IAM 許可
<a name="application-metrics-prometheus-iam"></a>

OpenTelemetry サイドカー用 AWS Distro を使用して Amazon ECS と Amazon Managed Service for Prometheus の統合には、タスク IAM ロールを作成してタスク定義でロールを指定する必要があります。このタスク用の IAM ロールは、タスク定義を登録する前に、手動で作成する必要があります。タスクロールの作成に関する詳細については、「[Amazon ECS タスクの IAM ロール](task-iam-roles.md)」を参照してください。

OpenTelemetry サイドカー用 AWS Distro サイドカーを、CloudWatch ログに対するルートコンテナログにも構成することをお勧めします。これには、タスク実行 IAM ロールを作成して、タスク定義でも指定する必要があります。Amazon ECS コンソールは、ユーザーに代わってタスク実行 IAM ロールを処理しますが、タスク IAM ロールは手動で作成する必要があります。タスク実行用の IAM ロールを作成する方法の詳細については、「[Amazon ECS タスク実行IAM ロール](task_execution_IAM_role.md)」を参照してください。

**重要**  
OpenTelemetry 用 AWS Distro 統合を使用してアプリケーションのトレースデータも収集する場合、タスク IAM ロールもその統合に必要な許可が含まれていることを確認します。詳細については、「[アプリケーショントレースデータを使用して Amazon ECS 最適化の機会を特定する](trace-data.md)」を参照してください。

AWS Distro for OpenTelemetry と Amazon Managed Service for Prometheus の統合には、次のアクセス許可が必要です。
+ logs:PutLogEvents
+ logs:CreateLogGroup
+ logs:CreateLogStream
+ logs:DescribeLogStreams
+ logs:DescribeLogGroups
+ cloudwatch:PutMetricData

## タスク定義の OpenTelemetry サイドカー用 AWS Distro を指定
<a name="application-metrics-prometheus-containerdefinitions"></a>

Amazon ECS コンソールでは、**[メトリクス収集の使用]** オプションを使用することで、OpenTelemetry サイドカーコンテナ用の AWS Distro を作成するエクスペリエンスが簡素化されます。詳細については、「[コンソールを使用した Amazon ECS タスク定義の作成](create-task-definition.md)」を参照してください。

Amazon ECS コンソールを使用していない場合、OpenTelemetry サイドカーコンテナ用 AWS Distro を手動でタスク定義に追加できます。次のタスク定義の例は、Amazon Managed Service for Prometheus 統合向けに OpenTelemetry サイドカー用 AWS Distro を追加するためのコンテナの定義を示しています。

```
{
	"family": "otel-using-cloudwatch",
	"taskRoleArn": "arn:aws:iam::111122223333:role/AmazonECS_OpenTelemetryCloudWatchRole",
	"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": "aws-region",
					"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/ecs-amp.yaml"
			],
			"environment": [{
				"name": "AWS_PROMETHEUS_ENDPOINT",
				"value": "https://aps-workspaces.aws-region.amazonaws.com/workspaces/ws-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111/api/v1/remote_write"
			}],
			"logConfiguration": {
				"logDriver": "awslogs",
				"options": {
					"awslogs-create-group": "True",
					"awslogs-group": "/ecs/ecs-aws-otel-sidecar-collector",
					"awslogs-region": "aws-region",
					"awslogs-stream-prefix": "ecs"
				}
			}
		}
	],
	"networkMode": "awsvpc",
	"requiresCompatibilities": [
		"FARGATE"
	],
	"cpu": "1024",
	"memory": "3072"
}
```