Amazon ECS의 Prometheus 지표 문제 해결
이 단원에서는 Amazon ECS 클러스터에서 Prometheus 지표 설정 문제를 해결하기 위한 도움말을 제공합니다.
CloudWatch Logs에 전송된 Prometheus 지표가 표시되지 않음
Prometheus 지표는 로그 그룹 /aws/ecs/containerinsights/cluster-name/Prometheus의 로그 이벤트로 수집됩니다. 로그 그룹이 생성되지 않았거나 Prometheus 지표가 로그 그룹에 전송되지 않은 경우 먼저, CloudWatch 에이전트가 Prometheus 대상을 성공적으로 검색했는지 여부를 확인해야 합니다. 그런 다음, CloudWatch 에이전트의 보안 그룹 및 권한 설정을 확인합니다. 다음 단계에서는 디버깅 수행을 안내합니다.
1단계: CloudWatch 에이전트 디버깅 모드 사용 설정
먼저 AWS CloudFormation 템플릿 파일 cwagent-ecs-prometheus-metric-for-bridge-host.yaml
또는 cwagent-ecs-prometheus-metric-for-awsvpc.yaml
에 다음과 같이 굵게 표시된 줄을 추가하여 CloudWatch 에이전트를 디버그 모드로 변경합니다. 그런 다음 파일을 저장합니다.
cwagentconfig.json: | { "agent": { "debug": true }, "logs": { "metrics_collected": {
기존 스택에 대해 새 AWS CloudFormation 변경 세트를 생성합니다. 변경 세트의 다른 파라미터를 기존 AWS CloudFormation 스택과 동일한 값으로 설정합니다. 다음은 EC2 시작 유형 및 브리지 네트워크 모드를 사용하는 Amazon ECS 클러스터에 설치된 CloudWatch 에이전트를 위한 예입니다.
ECS_NETWORK_MODE=bridge CREATE_IAM_ROLES=True ECS_TASK_ROLE_NAME=
your_selected_ecs_task_role_name
ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
NEW_CHANGESET_NAME=your_selected_ecs_execution_role_name
aws cloudformation create-change-set --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_REGION \ --change-set-name $NEW_CHANGESET_NAME
AWS CloudFormation 콘솔로 이동하여 새 변경 세트인 $NEW_CHANGESET_NAME
을 검토합니다. CWAgentConfigSSMParameter 리소스에 적용된 변경 사항 하나가 있어야 합니다. 변경 세트를 실행하고 다음 명령을 입력하여 CloudWatch 에이전트 태스크를 다시 시작합니다.
aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 0 \ --service
your_service_name_here
\ --region $AWS_REGION
10초 정도 기다린 후 다음 명령을 입력합니다.
aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 1 \ --service
your_service_name_here
\ --region $AWS_REGION
2단계: ECS 서비스 검색 로그 확인
CloudWatch 에이전트의 ECS 태스크 정의는 아래 섹션에서 기본적으로 로그를 사용 설정합니다. 로그는 CloudWatch Logs의 로그 그룹 /ecs/ecs-cwagent-prometheus에 전송됩니다.
LogConfiguration: LogDriver: awslogs Options: awslogs-create-group: 'True' awslogs-group: "/ecs/ecs-cwagent-prometheus" awslogs-region: !Ref AWS::Region awslogs-stream-prefix: !Sub 'ecs-${ECSLaunchType}-awsvpc'
다음 예와 같이 ECS_SD_Stats
문자열로 로그를 필터링하여 ECS 서비스 검색과 관련된 지표를 가져옵니다.
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeContainerInstances: 1 2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeInstancesRequest: 1 2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeTaskDefinition: 2 2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeTasks: 1 2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_ListTasks: 1 2020-09-1T01:53:14Z D! ECS_SD_Stats: Exporter_DiscoveredTargetCount: 1 2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Get_EC2MetaData: 1 2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Get_TaskDefinition: 2 2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Size_ContainerInstance: 1 2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Size_TaskDefinition: 2 2020-09-1T01:53:14Z D! ECS_SD_Stats: Latency: 43.399783ms
특정 ECS 서비스 검색 주기에 대한 각 지표의 의미는 다음과 같습니다.
-
AWSCLI_DescribeContainerInstances – 수행된
ECS::DescribeContainerInstances
API 호출의 수입니다. -
AWSCLI_DescribeInstancesRequest – 수행된
ECS::DescribeInstancesRequest
API 호출의 수입니다. -
AWSCLI_DescribeTaskDefinition – 수행된
ECS::DescribeTaskDefinition
API 호출의 수입니다. -
AWSCLI_DescribeTasks – 수행된
ECS::DescribeTasks
API 호출의 수입니다. -
AWSCLI_ListTasks - 수행된
ECS::ListTasks
API 호출의 수입니다. -
ExporterDiscoveredTargetCount – 검색되어 컨테이너 내의 대상 결과 파일로 내보낸 Prometheus 대상의 수입니다.
-
LRUCache_Get_EC2MetaData – 컨테이너 인스턴스 메타데이터가 캐시에서 검색된 횟수입니다.
-
LRUCache_Get_TaskDefinition – ECS 태스크 정의 메타데이터가 캐시에서 검색된 횟수입니다.
-
LRUCache_Size_ContainerInstance – 메모리에 캐시된 고유 컨테이너 인스턴스의 메타데이터 수입니다.
-
LRUCache_Size_TaskDefinition – 메모리에 캐시된 고유 ECS 태스크 정의의 수입니다.
-
Latency – 서비스 검색 주기에 걸리는 시간입니다.
ExporterDiscoveredTargetCount
값을 확인하여 검색된 Prometheus 대상이 예상과 일치하는지 확인하세요. 그렇지 않은 경우 가능한 이유는 다음과 같습니다.
-
ECS 서비스 검색의 구성이 애플리케이션의 설정과 일치하지 않을 수 있습니다. Docker 레이블 기반 서비스 검색의 경우 대상 컨테이너에서 자동 검색에 필요한 Docker 레이블이 CloudWatch 에이전트에 구성되어 있지 않을 수 있습니다. ECS 태스크 정의 ARN 정규 표현식 기반 서비스 검색의 경우 CloudWatch 에이전트의 regex 설정이 애플리케이션의 태스크 정의와 일치하지 않을 수 있습니다.
-
CloudWatch 에이전트의 ECS 태스크 역할에 ECS 태스크의 메타데이터를 검색할 권한이 없을 수 있습니다. CloudWatch 에이전트에 다음과 같은 읽기 전용 권한이 부여되어 있는지 확인합니다.
-
ec2:DescribeInstances
-
ecs:ListTasks
-
ecs:DescribeContainerInstances
-
ecs:DescribeTasks
-
ecs:DescribeTaskDefinition
-
3단계: 네트워크 연결 및 ECS 태스크 역할 정책 확인
Exporter_DiscoveredTargetCount
값이 검색된 Prometheus 대상이 있음을 나타내는데도 여전히 대상 CloudWatch Logs 로그 그룹에 전송된 로그 이벤트가 없다면 이는 다음 중 하나로 인해 발생했을 수 있습니다.
-
CloudWatch 에이전트가 Prometheus 대상 포트에 연결하지 못할 수 있습니다. CloudWatch 에이전트 뒤에 있는 보안 그룹 설정을 확인합니다. 프라이빗 IP는 CloudWatch 에이전트가 Prometheus Exporter 포트에 연결할 수 있도록 허용해야 합니다.
-
CloudWatch 에이전트의 ECS 태스크 역할에 CloudWatchAgentServerPolicy 관리형 정책이 없을 수 있습니다. Prometheus 지표를 로그 이벤트로 전송할 수 있으려면 CloudWatch 에이전트의 ECS 태스크 역할에 이 정책이 있어야 합니다. 샘플 AWS CloudFormation 템플릿을 사용하여 IAM 역할을 자동으로 생성했다면 ECS 태스크 역할과 ECS 실행 역할에 모두 Prometheus 모니터링을 수행할 수 있는 최소 권한이 부여됩니다.