

# 애플리케이션 지표를 사용하여 Amazon ECS 애플리케이션 성능 상호 연관
<a name="metrics-data"></a>

Fargate의 Amazon ECS는 Fargate에서 실행되는 애플리케이션에서 지표를 수집하고 이를 Amazon CloudWatch 또는 Amazon Managed Service for Prometheus로 내보내는 것을 지원합니다.

수집된 메타데이터를 사용하여 애플리케이션 성능 데이터를 기본 인프라 데이터와 상호 연관시켜 문제 해결에 걸리는 평균 시간을 줄일 수 있습니다.

Amazon ECS는 AWS Distro for OpenTelemetry사이드카 컨테이너를 사용하여 애플리케이션 지표를 수집하고 대상으로 라우팅합니다. 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에 사용자 정의 지표로 내보내기를 지원합니다. 이는 태스크 정의에 AWS Distro for OpenTelemetry 사이드카 컨테이너를 추가하는 방식으로 수행됩니다. 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>

Amazon CloudWatch에 애플리케이션 지표를 전송하기 위해 Fargate의 Amazon ECS와 AWS Distro for OpenTelemetry 통합을 사용할 때 다음 사항을 고려해야 합니다.
+ 이 통합은 사용자 지정 애플리케이션 지표만 CloudWatch로 전송합니다. 작업 수준 지표를 원하는 경우 Amazon ECS 클러스터 구성에서 컨테이너 인사이트를 켭니다. 자세한 내용은 [관찰성이 향상된 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)을 참조하세요.

## AWS Distro for OpenTelemetry와 Amazon CloudWatch 통합에 필요한 IAM 권한
<a name="application-metrics-cloudwatch-iam"></a>

Amazon ECS와 AWS Distro for OpenTelemetry를 통합하려면 태스크 IAM 역할을 생성하고 태스크 정의에서 역할을 지정해야 합니다. AWS Distro for OpenTelemetry 사이드카도 컨테이너 로그를 CloudWatch Logs로 라우팅하도록 구성하는 것이 좋습니다. 이 경우 태스크 실행 IAM 역할도 생성하고 태스크 정의에 지정해야 합니다. Amazon ECS 콘솔은 사용자를 대신하여 작업 실행 IAM 역할을 처리하지만 작업 IAM 역할은 수동으로 생성하고 작업 정의에 추가해야 합니다. 태스크 실행 IAM 역할에 대한 자세한 정보는 [Amazon ECS 태스크 실행 IAM 역할](task_execution_IAM_role.md) 섹션을 참조하세요.

**중요**  
AWS Distro for OpenTelemetry 통합을 사용하여 애플리케이션 추적 데이터도 수집하는 경우 태스크 IAM 역할에 해당 통합에 필요한 권한도 포함되어 있는지 확인합니다. 자세한 내용은 [애플리케이션 추적 데이터를 사용하여 Amazon ECS 최적화 기회 식별](trace-data.md) 섹션을 참조하세요.  
애플리케이션에 추가 권한이 필요한 경우 이 정책에 추가해야 합니다. 각 태스크 정의는 하나의 태스크 IAM 역할만 지정할 수 있습니다. 예를 들어 Systems Manager에 저장된 사용자 정의 구성 파일을 사용하는 경우 이 IAM 정책에 `ssm:GetParameters` 권한을 추가해야 합니다.

**Elastic Container Service에 대한 서비스 역할을 생성하는 방법(IAM 콘솔)**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. IAM 콘솔의 탐색 창에서 **역할**을 선택하고 **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 엔터티 유형**에서 **AWS 서비스**를 선택합니다.

1. **서비스 또는 사용 사례**의 경우 **Elastic Container Service**를 선택하고 **Elastic Container Service 작업** 사용 사례를 선택합니다.

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. 역할을 검토한 다음 **역할 생성**을 선택합니다.

## 태스크 정의에서 AWS Distro for OpenTelemetry 사이드카 지정
<a name="application-metrics-cloudwatch-containerdefinitions"></a>

Amazon ECS 콘솔은 **지표 수집 사용** 옵션으로 AWS Distro for OpenTelemetry 사이드카 컨테이너 생성 환경을 단순화합니다. 자세한 내용은 [콘솔을 사용하여 Amazon ECS 작업 정의 생성](create-task-definition.md) 섹션을 참조하세요.

Amazon ECS 콘솔을 사용하지 않는 경우 태스크 정의에 AWS Distro for OpenTelemetry 사이드카 컨테이너를 수동으로 추가할 수 있습니다. 다음 태스크 정의 예는 Amazon CloudWatch 통합을 위한 AWS Distro for OpenTelemetry 사이드카를 추가하기 위한 컨테이너 정의를 보여줍니다.

```
{
	"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로 내보내기를 지원합니다. 이는 태스크 정의에 AWS Distro for OpenTelemetry 사이드카 컨테이너를 추가하는 방식으로 수행됩니다. 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>

Amazon Managed Service for Prometheus에 애플리케이션 지표를 전송하기 위해 Fargate의 Amazon ECS와 AWS Distro for OpenTelemetry 통합을 사용하는 경우 다음 사항을 고려해야 합니다.
+ AWS Distro for OpenTelemetry 통합은 Fargate에서 호스팅되는 Amazon ECS 워크로드 및 Amazon EC2 인스턴스에서 호스팅되는 Amazon ECS 워크로드에 대해 지원됩니다. 외부 인스턴스는 현재 지원되지 않습니다.
+ 기본적으로 AWS Distro for OpenTelemetry에는 Amazon Managed Service for Prometheus로 내보낼 때 애플리케이션 지표에 사용 가능한 모든 태스크 수준 차원이 포함됩니다. 애플리케이션을 계측하여 차원을 추가할 수도 있습니다. 자세한 정보는 AWS Distro for OpenTelemetry 설명서의 [Amazon Managed Service for Prometheus용 Prometheus Remote Write Exporter 시작하기(Getting Started with Prometheus Remote Write Exporter for Amazon Managed Service for Prometheus)](https://aws-otel.github.io/docs/getting-started/prometheus-remote-write-exporter)를 참조하세요.

## AWS Distro for OpenTelemetry와 Amazon Managed Service for Prometheus 통합에 필요한 IAM 권한
<a name="application-metrics-prometheus-iam"></a>

AWS Distro for OpenTelemetry 사이드카를 사용하여 Amazon ECS와 Amazon Managed Service for Prometheus를 통합하려면 태스크 IAM 역할을 생성하고 태스크 정의에서 역할을 지정해야 합니다. 이 태스크 IAM 역할은 태스크 정의를 등록하기 전에 수동으로 생성해야 합니다. 태스크 역할 생성에 대한 자세한 내용은 [Amazon ECS 작업 IAM 역할](task-iam-roles.md) 섹션을 참조하세요.

AWS Distro for OpenTelemetry 사이드카도 컨테이너 로그를 CloudWatch Logs로 라우팅하도록 구성하는 것이 좋습니다. 이 경우 태스크 실행 IAM 역할도 생성하고 태스크 정의에 지정해야 합니다. Amazon ECS 콘솔은 사용자를 대신하여 작업 실행 IAM 역할을 처리하지만 태스크 IAM 역할은 수동으로 생성해야 합니다. 태스크 실행 IAM 역할 생성에 대한 자세한 정보는 [Amazon ECS 태스크 실행 IAM 역할](task_execution_IAM_role.md) 섹션을 참조하세요.

**중요**  
AWS Distro for OpenTelemetry 통합을 사용하여 애플리케이션 추적 데이터도 수집하는 경우 태스크 IAM 역할에 해당 통합에 필요한 권한도 포함되어 있는지 확인합니다. 자세한 내용은 [애플리케이션 추적 데이터를 사용하여 Amazon ECS 최적화 기회 식별](trace-data.md) 섹션을 참조하세요.

다음 권한은 Amazon Managed Service for Prometheus와 AWS Distro for OpenTelemetry의 통합에 필요합니다.
+ logs:PutLogEvents
+ logs:CreateLogGroup
+ logs:CreateLogStream
+ logs:DescribeLogStreams
+ logs:DescribeLogGroups
+ cloudwatch:PutMetricData

## 태스크 정의에서 AWS Distro for OpenTelemetry 사이드카 지정
<a name="application-metrics-prometheus-containerdefinitions"></a>

Amazon ECS 콘솔은 **지표 수집 사용** 옵션으로 AWS Distro for OpenTelemetry 사이드카 컨테이너 생성 환경을 단순화합니다. 자세한 내용은 [콘솔을 사용하여 Amazon ECS 작업 정의 생성](create-task-definition.md) 섹션을 참조하세요.

Amazon ECS 콘솔을 사용하지 않는 경우 태스크 정의에 AWS Distro for OpenTelemetry 사이드카 컨테이너를 수동으로 추가할 수 있습니다. 다음 태스크 정의 예는 Amazon Managed Service for Prometheus 통합을 위한 AWS Distro for OpenTelemetry 사이드카를 추가하기 위한 컨테이너 정의를 보여줍니다.

```
{
	"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"
}
```