

# Amazon ECS 클러스터에 Prometheus 지표 수집과 함께 CloudWatch 에이전트 설치
<a name="ContainerInsights-Prometheus-install-ECS"></a>

이 단원에서는 Amazon ECS를 실행 중인 클러스터에서 Prometheus 모니터링이 포함된 CloudWatch 에이전트를 설정하는 방법을 설명합니다. 이렇게 에이전트를 설정하면 에이전트가 해당 클러스터에서 실행 중인 다음 워크로드에 대한 지표를 자동으로 스크레이프하고 가져옵니다.
+ AWS App Mesh
+ Java/JMX

추가 Prometheus 워크로드 및 소스에서 지표를 스크레이프하고 가져오도록 에이전트를 구성할 수도 있습니다.

## IAM 역할 설정
<a name="ContainerInsights-Prometheus-Setup-ECS-IAM"></a>

CloudWatch 에이전트 태스크 정의의 두 IAM 역할이 필요합니다. Container Insights가 이러한 역할을 자동으로 생성하도록 CloudFormation 스택에서 **CreateIAMRoles=True**를 지정하면 올바른 권한을 가진 역할이 생성됩니다. 역할을 직접 생성하거나 기존 역할을 사용하려는 경우 다음 역할 및 권한이 필요합니다.
+ **CloudWatch 에이전트 ECS 태스크 역할** - CloudWatch 에이전트 컨테이너는 이 역할을 사용합니다. 여기에는 **CloudWatchAgentServerPolicy** 정책 및 다음과 같은 읽기 전용 권한을 포함하는 고객 관리형 정책이 포함되어야 합니다.
  + `ec2:DescribeInstances`
  + `ecs:ListTasks`
  + `ecs:ListServices`
  + `ecs:DescribeContainerInstances`
  + `ecs:DescribeServices`
  + `ecs:DescribeTasks`
  + `ecs:DescribeTaskDefinition`
+ **CloudWatch 에이전트 ECS 태스크 실행 역할** - Amazon ECS가 컨테이너를 시작하고 실행하는 데 필요한 역할입니다. 태스크 실행 역할에 **AmazonSSMReadOnlyAccess**, **AmazonECSTaskExecutionRolePolicy** 및 **CloudWatchAgentServerPolicy** 정책이 연결되어 있는지 확인합니다. Amazon ECS에서 사용할 더 민감한 데이터를 저장하려는 경우 [민감한 데이터 지정](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html) 단원을 참조하세요.

## CloudFormation을 사용하여 Prometheus 모니터링이 포함된 CloudWatch 에이전트 설치
<a name="ContainerInsights-Prometheus-Setup-ECS-CFN"></a>

AWS CloudFormation을 사용하여 Amazon ECS 클러스터에 대해 Prometheus 모니터링이 포함된 CloudWatch 에이전트를 설치합니다. 다음 목록에는 CloudFormation 템플릿에서 사용할 파라미터가 나와 있습니다.
+ **ECSClusterName** - 대상 Amazon ECS 클러스터를 지정합니다.
+ **CreateIAMRoles** - Amazon ECS 태스크 역할 및 Amazon ECS 태스크 실행 역할의 새 역할을 생성하려면 **True**를 지정합니다. 기존 역할을 재사용하려면 **False**를 지정합니다.
+ **TaskRoleName** - **CreateIAMRoles**에서 **True**를 지정한 경우 이 파라미터는 새 Amazon ECS 태스크 역할에 사용할 이름을 지정합니다. **CreateIAMRoles**에서 **False**를 지정한 경우 이 파라미터는 Amazon ECS 태스크 역할로 사용할 기존 역할을 지정합니다.
+ **ExecutionRoleName** - **CreateIAMRoles**에서 **True**를 지정한 경우 이 파라미터는 새 Amazon ECS 태스크 실행 역할에 사용할 이름을 지정합니다. **CreateIAMRoles**에서 **False**를 지정한 경우 이 파라미터는 Amazon ECS 태스크 실행 역할로 사용할 기존 역할을 지정합니다.
+ **ECSNetworkMode** - EC2 시작 유형을 사용하는 경우 여기에서 네트워크 모드를 지정합니다. **bridge** 또는 **host**여야 합니다.
+ **ECSLaunchType** - **fargate** 또는 **EC2**를 지정합니다.
+ **SecurityGroupID** - **ECSNetworkMode**가 **awsvpc**인 경우 여기에서 보안 그룹 ID를 지정합니다.
+ **SubnetID** - **ECSNetworkMode**가 **awsvpc**인 경우 여기에서 서브넷 ID를 지정합니다.

### 샘플 명령
<a name="ContainerInsights-Prometheus-Setup-ECS-CFNcommands"></a>

이 단원에는 다양한 시나리오에서 Prometheus 모니터링과 함께 Container Insights를 설치하기 위한 샘플 CloudFormation 명령이 포함되어 있습니다.

**브리지 네트워크 모드에서 Amazon ECS 클러스터의 CloudFormation 스택 생성**

```
export AWS_PROFILE={{your_aws_config_profile_eg_default}}
export AWS_DEFAULT_REGION={{your_aws_region_eg_ap-southeast-1}}
export ECS_CLUSTER_NAME={{your_ec2_ecs_cluster_name}}
export ECS_NETWORK_MODE=bridge
export CREATE_IAM_ROLES=True
export ECS_TASK_ROLE_NAME={{your_selected_ecs_task_role_name}}
export ECS_EXECUTION_ROLE_NAME={{your_selected_ecs_execution_role_name}}

curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml

aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
    --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                 ParameterKey=CreateIAMRoles,ParameterValue=${CREATE_IAM_ROLES} \
                 ParameterKey=ECSNetworkMode,ParameterValue=${ECS_NETWORK_MODE} \
                 ParameterKey=TaskRoleName,ParameterValue=${ECS_TASK_ROLE_NAME} \
                 ParameterKey=ExecutionRoleName,ParameterValue=${ECS_EXECUTION_ROLE_NAME} \
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${AWS_DEFAULT_REGION} \
    --profile ${AWS_PROFILE}
```

**호스트 네트워크 모드에서 Amazon ECS 클러스터의 CloudFormation 스택 생성**

```
export AWS_PROFILE={{your_aws_config_profile_eg_default}}
export AWS_DEFAULT_REGION={{your_aws_region_eg_ap-southeast-1}}
export ECS_CLUSTER_NAME={{your_ec2_ecs_cluster_name}}
export ECS_NETWORK_MODE=host
export CREATE_IAM_ROLES=True
export ECS_TASK_ROLE_NAME={{your_selected_ecs_task_role_name}}
export ECS_EXECUTION_ROLE_NAME={{your_selected_ecs_execution_role_name}}


curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml

aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
    --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                 ParameterKey=CreateIAMRoles,ParameterValue=${CREATE_IAM_ROLES} \
                 ParameterKey=ECSNetworkMode,ParameterValue=${ECS_NETWORK_MODE} \
                 ParameterKey=TaskRoleName,ParameterValue=${ECS_TASK_ROLE_NAME} \
                 ParameterKey=ExecutionRoleName,ParameterValue=${ECS_EXECUTION_ROLE_NAME} \ 
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${AWS_DEFAULT_REGION} \
    --profile ${AWS_PROFILE}
```

**awsvpc 네트워크 모드에서 Amazon ECS 클러스터의 CloudFormation 스택 생성**

```
export AWS_PROFILE={{your_aws_config_profile_eg_default}}
export AWS_DEFAULT_REGION={{your_aws_region_eg_ap-southeast-1}}
export ECS_CLUSTER_NAME={{your_ec2_ecs_cluster_name}}
export ECS_LAUNCH_TYPE=EC2
export CREATE_IAM_ROLES=True
export ECS_CLUSTER_SECURITY_GROUP={{your_security_group_eg_sg-xxxxxxxxxx}}
export ECS_CLUSTER_SUBNET={{your_subnet_eg_subnet-xxxxxxxxxx}}
export ECS_TASK_ROLE_NAME={{your_selected_ecs_task_role_name}}
export ECS_EXECUTION_ROLE_NAME={{your_selected_ecs_execution_role_name}}

curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-awsvpc.yaml

aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-${ECS_LAUNCH_TYPE}-awsvpc \
    --template-body file://cwagent-ecs-prometheus-metric-for-awsvpc.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                 ParameterKey=CreateIAMRoles,ParameterValue=${CREATE_IAM_ROLES} \
                 ParameterKey=ECSLaunchType,ParameterValue=${ECS_LAUNCH_TYPE} \
                 ParameterKey=SecurityGroupID,ParameterValue=${ECS_CLUSTER_SECURITY_GROUP} \
                 ParameterKey=SubnetID,ParameterValue=${ECS_CLUSTER_SUBNET} \
                 ParameterKey=TaskRoleName,ParameterValue=${ECS_TASK_ROLE_NAME} \
                 ParameterKey=ExecutionRoleName,ParameterValue=${ECS_EXECUTION_ROLE_NAME} \
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${AWS_DEFAULT_REGION} \
    --profile ${AWS_PROFILE}
```

**awsvpc 네트워크 모드에서 Fargate 클러스터의 CloudFormation 스택 생성**

```
export AWS_PROFILE={{your_aws_config_profile_eg_default}}
export AWS_DEFAULT_REGION={{your_aws_region_eg_ap-southeast-1}}
export ECS_CLUSTER_NAME={{your_ec2_ecs_cluster_name}}
export ECS_LAUNCH_TYPE=FARGATE
export CREATE_IAM_ROLES=True
export ECS_CLUSTER_SECURITY_GROUP={{your_security_group_eg_sg-xxxxxxxxxx}}
export ECS_CLUSTER_SUBNET={{your_subnet_eg_subnet-xxxxxxxxxx}}
export ECS_TASK_ROLE_NAME={{your_selected_ecs_task_role_name}}
export ECS_EXECUTION_ROLE_NAME={{your_selected_ecs_execution_role_name}}            

curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-awsvpc.yaml

aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-${ECS_LAUNCH_TYPE}-awsvpc \
    --template-body file://cwagent-ecs-prometheus-metric-for-awsvpc.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                 ParameterKey=CreateIAMRoles,ParameterValue=${CREATE_IAM_ROLES} \
                 ParameterKey=ECSLaunchType,ParameterValue=${ECS_LAUNCH_TYPE} \
                 ParameterKey=SecurityGroupID,ParameterValue=${ECS_CLUSTER_SECURITY_GROUP} \
                 ParameterKey=SubnetID,ParameterValue=${ECS_CLUSTER_SUBNET} \
                 ParameterKey=TaskRoleName,ParameterValue=${ECS_TASK_ROLE_NAME} \
                 ParameterKey=ExecutionRoleName,ParameterValue=${ECS_EXECUTION_ROLE_NAME} \
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${AWS_DEFAULT_REGION} \
    --profile ${AWS_PROFILE}
```

### CloudFormation 스택에서 생성한 AWS 리소스
<a name="ContainerInsights-Prometheus-Setup-ECS-resources"></a>

다음 표에는 CloudFormation을 사용하여 Amazon ECS 클러스터에서 Prometheus 모니터링과 함께 Container Insights를 설정할 때 생성되는 AWS 리소스가 나와 있습니다.


| 리소스 유형 | 리소스 이름 | 설명 | 
| --- | --- | --- | 
| AWS::SSM::Parameter | AmazonCloudWatch-CWAgentConfig-${{ECS\_CLUSTER\_NAME}}-${{ECS\_LAUNCH\_TYPE}}-${{ECS\_NETWORK\_MODE}} | 이 리소스는 기본 App Mesh 및 Java/JMX 임베디드 지표 형식 정의가 있는 CloudWatch 에이전트입니다. | 
| AWS::SSM::Parameter | AmazonCloudWatch-PrometheusConfigName-${{ECS\_CLUSTER\_NAME}}-${{ECS\_LAUNCH\_TYPE}}-${{ECS\_NETWORK\_MODE}} | 이 리소스는 Prometheus 스크레이핑 구성입니다. | 
| AWS::IAM::Role | **$ECS\_TASK\_ROLE\_NAME**. | Amazon ECS 태스크 역할입니다. `CREATE_IAM_ROLES`에서 **True**를 지정한 경우에만 생성됩니다. | 
| AWS::IAM::Role | **${ECS\_EXECUTION\_ROLE\_NAME}**  | Amazon ECS 태스크 실행 역할입니다. `CREATE_IAM_ROLES`에서 **True**를 지정한 경우에만 생성됩니다. | 
| AWS::ECS::TaskDefinition | cwagent-prometheus-${{ECS\_CLUSTER\_NAME}}-${{ECS\_LAUNCH\_TYPE}}-${{ECS\_NETWORK\_MODE}}  |   | 
| AWS::ECS::Service | cwagent-prometheus-replica-service-${{ECS\_LAUNCH\_TYPE}}-${{ECS\_NETWORK\_MODE}} |   | 

### Prometheus 모니터링이 포함된 CloudWatch 에이전트의 CloudFormation 스택 삭제
<a name="ContainerInsights-Prometheus-ECS-delete"></a>

Amazon ECS 클러스터에서 CloudWatch 에이전트를 삭제하려면 다음 명령을 입력합니다.

```
export AWS_PROFILE={{your_aws_config_profile_eg_default}}
export AWS_DEFAULT_REGION={{your_aws_region_eg_ap-southeast-1}}
export CLOUDFORMATION_STACK_NAME={{your_cloudformation_stack_name}}

aws cloudformation delete-stack \
--stack-name ${CLOUDFORMATION_STACK_NAME} \
--region ${AWS_DEFAULT_REGION} \
--profile ${AWS_PROFILE}
```