Amazon ECS
와탭 Amazon ECS모니터링은 META API 및 Cgroup 디렉토리를 통해 도커 컨테이너별 자원 사용량을 실시간으로 수집합니다. Amazon ECS API 연동 와탭 Task를 통해 Amazon ECS Service, Deployment, Container Instance의 상태를 조회 및 수집합니다.
필요 소프트웨어
설치에 쓰이는 와탭 이미지(whatap/ecs_mon)는 다운로드 후 사용자 레지스트리에 등록 후 사용 하시는 것을 권장합니다. |
모니터링 대상
Amazon ECS 모니터링 대상은 Task, Service, Deployment, ContainerInstance입니다.
-
Amazon ECS Launch Type Fargate 모니터링 (Task, Service, Deployment)
-
Amazon ECS Launch Type EC2 모니터링 (Task, Service, Deployment, ContainerInstance)
이어 설명할 모니터링 절차도 Launch Type Fargate 모니터링을 위한 절차와 Launch Type EC2 모니터링을 위한 절차로 구분되어 진행됩니다.
모니터링 절차
-
사용자 와탭 콘솔에서 인티그레이션 프로젝트를 Amazon ECS 사용 상태로 생성 합니다.
-
와탭 Amazon ECS 에이전트를 전용 Task 혹은 Sidecar 로 배포 합니다.
Amazon ECS Launch Type Fargate 와탭 에이전트 Task 배포

-
와탭 ECS 모니터링 설정 클릭 후 2. Task 생성하기에서 Launch Type Fargate를 선택합니다.
-
스크립트를 실행하여 AWS ECS API READONLY IAM ROLE을 만듭니다. 와탭 Task 가 ECS Service 를 조회하여 서비스 상태를 실시간 수집하는데 필요합니다.
-
실행하는데 필요한 항목 아래와 같습니다.
-
ACCESSKEY (와탭 프로젝트 Access Key)
-
WHATAP_HOST (와탭 수집 리전 IP, 복수 IP는 / 로 연결)
-
REGION (AWS Region)
-
PROFILE (ECS Profile)
-
CLUSTER (ECS Cluster)
-
CLUSTER_CONFIG (ECS Cluster Config)
-
TASK_EXECUTION_ROLE (와탭 에이전트 Task ECS Task 실행 역활)
-
SUBNET_1 (와탭 에이전트 Task SUBNET#1)
-
SUBNET_2 (와탭 에이전트 Task SUBNET#2)
-
SGGRP (와탭 에이전트 Task Security Group)
-
-
#!/usr/bin/env bash
export REGION=xxxxx
export WHATAP_ECS_ROLE_READONLY=WhatapEcsReadonly
export WHATAP_ECS_POLICY_READONLY=WhatapEcsReadonly
cat >ecs_trust.json <<EOL
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOL
aws iam create-role --role-name $WHATAP_ECS_ROLE_READONLY --assume-role-policy-document file://ecs_trust.json
cat >ecs_readonly.json <<EOL
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:Describe*",
"ecs:List*"
],
"Resource": [
"*"
]
}
]
}
EOL
aws iam --region $REGION create-policy --policy-name $WHATAP_ECS_POLICY_READONLY \
--policy-document file://ecs_readonly.json | python -c 'import json,sys;print(json.load(sys.stdin)["Policy"]["Arn"])' > policy_arn.txt
export POLICY_ARN=$(cat policy_arn.txt)
aws iam --region $REGION attach-role-policy --role-name $WHATAP_ECS_ROLE_READONLY \
--policy-arn $POLICY_ARN | python -c 'import json,sys;print(json.load(sys.stdin)["Role"]["Arn"])' > role_arn.txt
-
생성한 IAM ROLE을 탑재한 whatap-single 에이전트를 시작합니다. ECS API를 사용하여 Service 상태를 실시간 수집합니다.
#!/usr/bin/env bash
export ACCESSKEY=
export WHATAP_HOST=
export PROFILE=
export REGION=
export CLUSTER=
export CLUSTER_CONFIG=
export TASK_EXECUTION_ROLE=
export SUBNET_1=
export SUBNET_2=
export SGGRP=
export WHATAP_ECS_ROLE_READONLY=WhatapEcsReadonly
export PROJNAME=whatap-monitoring
export LAUNCH_TYPE=FARGATE
export WHATAP_ROLE_ARN=$(cat role_arn.txt)
cat >docker-compose.yml <<EOL
version: '3'
services:
whatap-ecs-agent:
image: whatap/ecs_mon
environment:
- ACCESSKEY=$ACCESSKEY
- WHATAP_HOST=$WHATAP_HOST
- FARGATE_HELPER=true
EOL
cat >ecs-params.yml <<EOL
version: 1
task_definition:
task_execution_role: $TASK_EXECUTION_ROLE
task_role_arn: "$WHATAP_ROLE_ARN"
ecs_network_mode: awsvpc
task_size:
mem_limit: 0.5GB
cpu_limit: 256
run_params:
network_configuration:
awsvpc_configuration:
subnets:
- "$SUBNET_1"
- "$SUBNET_2"
security_groups:
- "$SGGRP"
assign_public_ip: ENABLED
EOL
ecs-cli compose --project-name $PROJNAME service up \
--cluster-config $CLUSTER_CONFIG \
--ecs-profile $PROFILE --region $REGION
-
아래와 같이 최종 사용자 Task에 와탭 sidecar 에이전트를 배포 합니다. ACCESSKEY 및 WHATAP_HOST를 환경변수로 추가하여 수집서버와 통신할 수 있도록 합니다.
.Linux
version: '3' services: xxxxx: image: xxxx ports: - "xx:xx" ... whatap-ecs-agent: image: whatap/ecs_mon environment: - ACCESSKEY= - WHATAP_HOST=
Amazon ECS Launch Type EC2 와탭 에이전트 배포

-
와탭 ECS 모니터링 설정 클릭 후 2. Task 생성하기에서 Launch Type EC2를 선택합니다.
-
아래 스크립트를 실행하여 DAEMON 타입 Task를 생성 합니다. CLUSTER, REGION을 추가하고 ACCESSKEY 및 WHATAP_HOST를 설정하여 수집서버와 통신할 수 있도록 합니다.
-
실행하는데 필요한 항목 아래와 같습니다.
-
ACCESSKEY (와탭 프로젝트 Access Key)
-
WHATAP_HOST (와탭 수집 리전 IP)
-
REGION (AWS Region)
-
CLUSTER (ECS Cluster)
.Linux
-
-
#!/usr/bin/env bash export ACCESSKEY= export WHATAP_HOST= export CLUSTER= export REGION= export LAUNCH_TYPE=EC2 cat >whatap_ecs.json <<EOL { "containerDefinitions": [ { "name": "whatap-node-agent", "image": "whatap/ecs_mon", "cpu": 100, "memory": 50, "essential": true, "mountPoints": [{ "containerPath": "/var/run/docker.sock", "sourceVolume": "docker_sock", "readOnly": true},{ "containerPath": "/rootfs", "sourceVolume": "rootfs", "readOnly": true}], "environment": [{ "name": "ACCESSKEY", "value": "$ACCESSKEY" },{ "name": "WHATAP_HOST", "value": "$WHATAP_HOST"} ], "linuxParameters": { "capabilities": { "add": [ "SYS_ADMIN", "SYS_RESOURCE", "SYS_PTRACE", "NET_ADMIN", "NET_BROADCAST", "NET_RAW", "IPC_LOCK", "CHOWN"] }}}], "requiresCompatibilities": ["EC2"], "volumes": [{ "host": {"sourcePath": "/var/run/docker.sock"}, "name": "docker_sock"},{ "host": {"sourcePath": "/"}, "name": "rootfs"}], "family": "whatap-agent-task"} EOL aws ecs register-task-definition \ --cli-input-json file://$(pwd)/whatap_ecs.json \ --region $REGION aws ecs create-service --cluster $CLUSTER \ --service-name whatap-node-agent \ --task-definition whatap-agent-task \ --scheduling-strategy DAEMON \ --launch-type $LAUNCH_TYPE \ --region $REGION