Amazon OSS Fargate의 Redis Prometheus 지표 스크레이핑 자습서 - Amazon CloudWatch

Amazon OSS Fargate의 Redis Prometheus 지표 스크레이핑 자습서

이 자습서에서는 Amazon ECS Fargate 클러스터에서 샘플 Redis OSS 애플리케이션의 Prometheus 지표를 스크레이핑하는 실습 입문을 제공합니다. CloudWatch 에이전트는 컨테이너의 Docker 레이블을 기반으로 하는 Prometheus 지표 지원을 통해 Redis OSS Prometheus 내보내기 도구 대상을 자동 검색합니다.

Redis OSS(https://redis.io/)는 데이터베이스, 캐시 및 메시지 브로커로 사용되는 오픈 소스(BSD 라이선스), 인메모리 구조 데이터 스토어입니다. 자세한 내용은 redis를 참조하세요.

redis_exporter(MIT License 라이선스)는 지정된 포트(기본값: 0.0.0.0:9121)에서 Redis OSS Prometheus 지표를 노출하는 데 사용됩니다. 자세한 내용은 redis_exporter를 참조하세요.

이 튜토리얼에서는 다음과 같은 두 Docker Hub 리포지토리의 Docker 이미지를 사용합니다.

사전 조건

Amazon ECS의 Prometheus 워크로드 샘플에서 지표를 수집하려면 클러스터에서 Container Insights를 실행 중이어야 합니다. Container Insights 설치에 대한 자세한 내용은 Amazon ECS에서 Container Insights 설정 단원을 참조하세요.

Amazon ECS Fargate 클러스터 환경 변수 설정

Amazon ECS Fargate 클러스터 환경 변수를 설정하려면
  1. 아직 설치하지 않은 경우 Amazon ECS CLI를 설치합니다. 자세한 내용은 Amazon ECS CLI 설치 단원을 참조하세요.

  2. 새 Amazon ECS 클러스터 이름 및 리전을 설정합니다. 예시:

    ECS_CLUSTER_NAME=ecs-fargate-redis-tutorial AWS_DEFAULT_REGION=ca-central-1
  3. (선택 사항) 샘플 Redis OSS 워크로드 및 CloudWatch 에이전트를 설치하려는 Amazon ECS Fargate 클러스터가 아직 없는 경우 다음 명령을 입력하여 클러스터를 생성할 수 있습니다.

    ecs-cli up --capability-iam \ --cluster $ECS_CLUSTER_NAME \ --launch-type FARGATE \ --region $AWS_DEFAULT_REGION

    이 명령의 예상 결과는 다음과 같습니다.

    INFO[0000] Created cluster cluster=ecs-fargate-redis-tutorial region=ca-central-1 INFO[0001] Waiting for your cluster resources to be created... INFO[0001] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS VPC created: vpc-xxxxxxxxxxxxxxxxx Subnet created: subnet-xxxxxxxxxxxxxxxxx Subnet created: subnet-xxxxxxxxxxxxxxxxx Cluster creation succeeded.

Amazon ECS Fargate 클러스터의 네트워크 환경 변수 설정

Amazon ECS Fargate 클러스터의 네트워크 환경 변수를 설정하려면
  1. Amazon ECS 클러스터의 VPC 및 서브넷 ID를 설정합니다. 이전 절차에서 새 클러스터를 생성한 경우 마지막 명령의 결과에 다음과 같은 값이 표시됩니다. 그렇지 않으면 Redis와 함께 사용할 기존 클러스터의 ID를 사용합니다.

    ECS_CLUSTER_VPC=vpc-xxxxxxxxxxxxxxxxx ECS_CLUSTER_SUBNET_1=subnet-xxxxxxxxxxxxxxxxx ECS_CLUSTER_SUBNET_2=subnet-xxxxxxxxxxxxxxxxx
  2. 이 자습서에서는 Amazon ECS 클러스터 VPC의 기본 보안 그룹에 Redis OSS 애플리케이션 및 CloudWatch 에이전트를 설치합니다. 기본 보안 그룹은 동일한 보안 그룹 내의 모든 네트워크 연결을 허용하므로 CloudWatch 에이전트가 Redis OSS 컨테이너에 노출된 Prometheus 지표를 스크레이링할 수 있습니다. 실제 프로덕션 환경에서는 Redis OSS 애플리케이션 및 CloudWatch 에이전트의 전용 보안 그룹을 생성하고 이에 대한 사용자 지정 권한을 설정할 수 있습니다.

    다음 명령을 입력하여 기본 보안 그룹 ID를 가져옵니다.

    aws ec2 describe-security-groups \ --filters Name=vpc-id,Values=$ECS_CLUSTER_VPC \ --region $AWS_DEFAULT_REGION

    그다음에는 다음 명령을 입력하여 Fargate 클러스터 기본 보안 그룹 변수를 설정하고 my-default-security-group을 이전의 명령에서 찾은 값으로 바꿉니다.

    ECS_CLUSTER_SECURITY_GROUP=my-default-security-group

샘플 Redis OSS 워크로드 설치

Prometheus 지표를 노출하는 샘플 Redis OSS 워크로드를 설치하는 방법
  1. 다음 명령을 입력하여 Redis OSS AWS CloudFormation 템플릿을 다운로드합니다.

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/sample_traffic/redis/redis-traffic-sample.yaml
  2. 다음 명령을 입력하여 Redis OSS 용으로 생성할 IAM 역할 이름을 설정합니다.

    REDIS_ECS_TASK_ROLE_NAME=redis-prometheus-demo-ecs-task-role-name REDIS_ECS_EXECUTION_ROLE_NAME=redis-prometheus-demo-ecs-execution-role-name
  3. 다음 명령을 입력하여 샘플 Redis OSS 워크로드를 설치합니다.

    aws cloudformation create-stack --stack-name Redis-Prometheus-Demo-ECS-$ECS_CLUSTER_NAME-fargate-awsvpc \ --template-body file://redis-traffic-sample.yaml \ --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \ ParameterKey=SecurityGroupID,ParameterValue=$ECS_CLUSTER_SECURITY_GROUP \ ParameterKey=SubnetID,ParameterValue=$ECS_CLUSTER_SUBNET_1 \ ParameterKey=TaskRoleName,ParameterValue=$REDIS_ECS_TASK_ROLE_NAME \ ParameterKey=ExecutionRoleName,ParameterValue=$REDIS_ECS_EXECUTION_ROLE_NAME \ --capabilities CAPABILITY_NAMED_IAM \ --region $AWS_DEFAULT_REGION

AWS CloudFormation 스택은 다음과 같은 네 개의 리소스를 생성합니다.

  • ECS 태스크 역할 1개

  • ECS 태스크 실행 역할 1개

  • Redis OSS 태스크 정의 1개

  • Redis OSS 서비스 1개

Redis OSS 태스크 정의에서는 다음과 같이 두 컨테이너가 정의됩니다.

  • 기본 컨테이너는 단순한 Redis OSS 애플리케이션을 실행하고 액세스를 위해 포트 6379를 엽니다.

  • 다른 컨테이너에서는 Redis OSS 내보내기 도구 프로세스를 실행하여 포트 9121에서 Prometheus 지표를 노출합니다. 이는 CloudWatch 에이전트가 검색하고 스크레이프할 컨테이너입니다. 다음 Docker 레이블을 정의하여 CloudWatch 에이전트가 해당 레이블을 기반으로 이 컨테이너를 검색할 수 있도록 합니다.

    ECS_PROMETHEUS_EXPORTER_PORT: 9121

Redis OSS Prometheus 지표를 스크레이핑하도록 CloudWatch 에이전트 구성

Redis OSS Prometheus 지표를 스크레이핑하도록 CloudWatch 에이전트를 구성하려는 방법
  1. 다음 명령을 입력하여 최신 버전의 cwagent-ecs-prometheus-metric-for-awsvpc.yaml을 다운로드합니다.

    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
  2. 텍스트 편집기를 사용하여 파일을 열고 resource:CWAgentConfigSSMParameter 섹션에서 value 키 뒤에 있는 전체 CloudWatch 에이전트 구성을 찾습니다.

    여기에 나와 있는 ecs_service_discovery 섹션에서는 Redis OSS ECS 태스크 정의에서 정의한 Docker 레이블과 일치하는 ECS_PROMETHEUS_EXPORTER_PORT를 기반으로 하는 기본 설정으로 docker_label 기반 서비스 검색이 사용 설정됩니다. 따라서 이 섹션에서는 아무것도 변경할 필요가 없습니다.

    ecs_service_discovery": { "sd_frequency": "1m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", * "docker_label": { },* ...

    metric_declaration 섹션의 경우 기본 설정은 어느 Redis OSS 지표도 허용하지 않습니다. Redis OSS 지표를 허용하려면 다음 섹션을 추가합니다. 이때 기존의 들여쓰기 패턴을 따라야 합니다.

    { "source_labels": ["container_name"], "label_matcher": "^redis-exporter-.*$", "dimensions": [["ClusterName","TaskDefinitionFamily"]], "metric_selectors": [ "^redis_net_(in|out)put_bytes_total$", "^redis_(expired|evicted)_keys_total$", "^redis_keyspace_(hits|misses)_total$", "^redis_memory_used_bytes$", "^redis_connected_clients$" ] }, { "source_labels": ["container_name"], "label_matcher": "^redis-exporter-.*$", "dimensions": [["ClusterName","TaskDefinitionFamily","cmd"]], "metric_selectors": [ "^redis_commands_total$" ] }, { "source_labels": ["container_name"], "label_matcher": "^redis-exporter-.*$", "dimensions": [["ClusterName","TaskDefinitionFamily","db"]], "metric_selectors": [ "^redis_db_keys$" ] },
  3. AWS CloudFormation에서 Amazon ECS 클러스터에 CloudWatch 에이전트를 이미 배포한 경우 다음 명령을 입력하여 변경 세트를 생성할 수 있습니다.

    ECS_LAUNCH_TYPE=FARGATE CREATE_IAM_ROLES=True ECS_CLUSTER_SUBNET=$ECS_CLUSTER_SUBNET_1 ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name aws cloudformation create-change-set --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} \ --change-set-name redis-scraping-support
  4. AWS CloudFormation 콘솔(https://console.aws.amazon.com/cloudformation)을 엽니다.

  5. 새로 생성한 변경 세트인 redis-scraping-support를 검토합니다. CWAgentConfigSSMParameter 리소스에 적용된 변경 사항 하나가 표시되어야 합니다. 변경 세트를 실행하고 다음 명령을 입력하여 CloudWatch 에이전트 태스크를 다시 시작합니다.

    aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 0 \ --service cwagent-prometheus-replica-service-$ECS_LAUNCH_TYPE-awsvpc \ --region ${AWS_DEFAULT_REGION}
  6. 10초 정도 기다린 후 다음 명령을 입력합니다.

    aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 1 \ --service cwagent-prometheus-replica-service-$ECS_LAUNCH_TYPE-awsvpc \ --region ${AWS_DEFAULT_REGION}
  7. 클러스터에 처음으로 Prometheus 지표 수집이 포함된 CloudWatch 에이전트를 설치하는 경우 다음 명령을 입력합니다.

    ECS_LAUNCH_TYPE=FARGATE CREATE_IAM_ROLES=True ECS_CLUSTER_SUBNET=$ECS_CLUSTER_SUBNET_1 ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name 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}

Redis OSS 지표 보기

이 튜토리얼에서는 CloudWatch의 ECS/ContainerInsights/Prometheus 네임스페이스에 다음 지표를 전송합니다. CloudWatch 콘솔을 사용하여 해당 네임스페이스의 지표를 볼 수 있습니다.

지표 이름 측정기준

redis_net_input_bytes_total

ClusterName, TaskDefinitionFamily

redis_net_output_bytes_total

ClusterName, TaskDefinitionFamily

redis_expired_keys_total

ClusterName, TaskDefinitionFamily

redis_evicted_keys_total

ClusterName, TaskDefinitionFamily

redis_keyspace_hits_total

ClusterName, TaskDefinitionFamily

redis_keyspace_misses_total

ClusterName, TaskDefinitionFamily

redis_memory_used_bytes

ClusterName, TaskDefinitionFamily

redis_connected_clients

ClusterName, TaskDefinitionFamily

redis_commands_total

ClusterName, TaskDefinitionFamily, cmd

redis_db_keys

ClusterName, TaskDefinitionFamily, db

참고

[cmd] 측정기준의 값은 append, client, command, config, dbsize, flushall, get, incr, info, latency 또는 slowlog일 수 있습니다.

[db] 측정기준의 값은 db0~db15일 수 있습니다.

Redis OSS Prometheus 지표에 대한 CloudWatch 대시보드를 생성할 수도 있습니다.

Redis OSS Prometheus 지표에 대한 대시보드를 생성하는 방법
  1. 환경 변수를 만들어서 아래의 값을 배포와 일치하도록 바꿉니다.

    DASHBOARD_NAME=your_cw_dashboard_name ECS_TASK_DEF_FAMILY=redis-prometheus-demo-$ECS_CLUSTER_NAME-fargate-awsvpc
  2. 다음 명령을 입력하여 대시보드를 생성합니다.

    curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/redis/cw_dashboard_redis.json \ | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \ | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \ | sed "s/{{YOUR_NAMESPACE}}/${NAMESPACE}/g" \