엔지니어링

Elastic Observability로 Amazon ECS를 모니터링하는 방법

애플리케이션과 워크로드를 컨테이너로 마이그레이션하는 기업이 계속해서 증가함에 따라 컨테이너 상태와 사용량을 모니터링하고 추적할 수 있는 기능이 그 어느 때보다 중요해졌습니다. 이미 많은 팀이 Metricbeat docker 모듈을 사용하여 Docker 컨테이너 모니터링 데이터를 수집하고 추가 분석을 위해 Elasticsearch에 저장하고 있습니다. 하지만 사용자가 Amazon Elastic Container Service(Amazon ECS)를 사용하는 경우는 어떻게 될까요? 여전히 Metricbeat를 사용하여 Amazon ECS를 모니터링할 수 있을까요? 그렇습니다!

이 블로그에서는 Elastic Observability를 사용하여 Amazon ECS를 모니터링하는 방법을 단계별로 살펴보겠습니다.

Amazon ECS란?

Amazon ECS는 확장성이 뛰어난 완전관리형 서비스로, Docker 컨테이너를 쉽게 오케스트레이션하고 프로비저닝할 수 있도록 지원합니다. Amazon ECS는 ‘시작 유형’이라고 하는 두 가지 기본 클라우드 서비스, 즉 EC2와 Fargate를 지원하며, 어떤 서비스를 사용하는지에 따라 컴퓨팅 리소스를 관리하는 방법이 달라집니다.

EC2 시작 유형을 사용하는 경우, 컨테이너는 사용자가 자체적으로 관리해야 하는 EC2 인스턴스에서 실행됩니다. 그리고 Fargate 시작 유형을 사용하는 경우, 사용자는 컨테이너와 태스크만 지정하면 됩니다. 그러면 Fargate가 백엔드 인프라의 프로비저닝, 구성 및 관리를 대신 처리합니다.

Metricbeat를 사용하여 이러한 시작 유형을 모니터링하는 방법을 각각 살펴보겠습니다! 

Elastic으로 Amazon ECS EC2 컨테이너를 모니터링하는 방법

컨테이너를 EC2에 배포하는 경우, 자체 Amazon ECS 클러스터를 배포하고 관리할 책임은 사용자에게 있습니다. 모니터링 관점에서 보면, 이러한 EC2 인스턴스는 다른 일반적인 VM과 같습니다. 즉, 사용자가 직접 EC2 인스턴스에 연결하고 Docker 데몬에서 Docker 통계를 수집합니다. EC2에서 실행되는 Amazon ECS 컨테이너를 모니터링하는 방법을 몇 가지 간단한 단계를 통해 알아보겠습니다.

사전 조건: SSL 키

Amazon ECS 클러스터를 생성할 때 유효한 SSL 키를 연결하는 것이 중요합니다. 그래야 SSH를 통해 인스턴스에 액세스할 수 있습니다.

1단계: 보안 그룹

네트워킹 섹션에서는 SSH 액세스(포트 22)를 활성화할 수 있는 보안 그룹을 선택해야 합니다.

2단계: EC2 인스턴스 확인

Amazon ECS 클러스터를 올바르게 시작한 후에는 다음과 같이 EC2 인스턴스를 나열할 수 있어야 합니다.

3단계: SSL 연결

다음과 같이, 1단계에서 연결한 키 페어를 사용하여 SSH를 통해 각 인스턴스에 연결할 수 있습니다.

ssh -i "ec2-ecs-test.pem" ec2-user@3.125.104.129

4단계: Metricbeat 설치

클러스터의 모든 인스턴스에 액세스할 수 있으므로, 각 인스턴스에 Metricbeat를 설치하고 Docker 데몬으로부터 메트릭 수집을 시작할 수 있습니다.

curl -L -O <a href="https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.11.1-x86_64.rpm">https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.11.1-x86_64.rpm</a> 
sudo rpm -vi metricbeat-7.10.1-x86_64.rpm 
sudo metricbeat modules disable system 
sudo metricbeat modules enable docker

이제 메트릭을 Elastic Cloud에서 실행되는 인스턴스로 전송하도록 Elasticsearch 엔드포인트를 정의할 수 있습니다. 원하신다면 무료 체험판을 활용하여 직접 따라 해 보실 수 있습니다.

metricbeat.yml을 수정하여 Elastic Cloud 옵션을 추가합니다.

일반적으로 이 파일은 /etc/metricbeat/metricbeat.yml 밑에 위치해 있으며 다음과 같이 수정하면 됩니다.

sudo vi /etc/metricbeat/metricbeat.yml
cloud.id: "elastic-observability-deployment:ZXV…….k3MTI1ZTA1Ng==" 
cloud.auth: "elastic:2vXXXXXXXXXXXxxxxxxxxxxxV"

자체 관리형 Elasticsearch 클러스터를 실행하고 있는 경우에는 다음과 같이 Elasticsearch 출력을 구성해야 합니다.

output.elasticsearch: 
  hosts: ["https://myEShost:9200"] 
  username: "elastic" 
  password: "changeme"

그리고 나서, 다음과 같이 미리 정의된 대시보드, 인덱스 및 매핑을 설정합니다.

sudo metricbeat setup -e

Metricbeat를 시작합니다.

./metricbeat -e -d & 
sudo service metricbeat start

시스템이 부팅될 때 자동으로 시작하도록 Metricbeat 서비스를 구성할 수도 있습니다.

systemctl enable metricbeat
참고: 이 프로세스는 클러스터에 있는 모든 EC2 인스턴스에 대해 수행해야 합니다.

5단계: 메트릭 수집 확인

이제 Metricbeat가 실행되고 있으므로, Kibana의 ‘발견’ 화면에서 Docker 관련 메트릭을 살펴보면 이벤트가 Elasticsearch 클러스터에 저장되고 있는지 확인할 수 있습니다.

계속 진행하여 Amazon ECS 클러스터에 태스크를 배포하면 Metricbeat가 해당 태스크에서 메트릭을 수집합니다. 이 메트릭을 사용하여 시각화와 대시보드를 생성하는 동시에 기본적으로 추가되는 cloud_metadatahost_metadata와 같은 추가적인 메타데이터를 활용하여 AWS 계정, 리전, 호스트 식별자 및 유형별로 메트릭을 상호 연관시킬 수 있습니다. 예를 들어 docker.info.containers.running 메트릭을 host.name과 결합하면 시간 경과에 따라 호스트당 실행 중인 컨테이너 개수를 간략하게 파악할 수 있습니다.

6단계: 사전 구축된 Kibana 대시보드에서 메트릭 확인

그뿐만 아니라, Metricbeat와 함께 번들로 제공되는 기본 Docker 대시보드에서 컨테이너 워크로드에 대한 개요를 확인할 수도 있습니다.

간단한 몇 단계만 거치면 Amazon ECS 태스크를 모니터링할 수 있으며, 그 후에는 Metricbeat를 사용하여 EC2 클러스터에 대한 가시성을 계속해서 확장할 수 있습니다. 이번에는 Fargate에서 실행되는 Amazon ECS 태스크를 모니터링하는 방법을 살펴보겠습니다.

Elastic으로 Fargate 컨테이너를 모니터링하는 방법

Fargate 기반 Amazon ECS는 태스크 메타데이터 엔드포인트를 통해 실행 중인 태스크 및 컨테이너에 대한 다양한 메타데이터, 네트워크 메트릭 및 Docker 통계를 제공합니다. Metricbeat는 태스크 메타데이터 엔드포인트 버전 4를 사용하며, 이 버전은 컨테이너별로 사용 가능하고 AWS Fargate 플랫폼 버전 1.4.0 이상에서 기본적으로 활성화됩니다.

Fargate에서 실행 중인 태스크를 모니터링하려면 직접 새로운 컨테이너 정의를 추가하는 방식으로 태스크 자체에 Metricbeat 컨테이너를 배포해야 합니다. Standard 섹션에서 Container namemetricbeat-container와 같은 이름을 입력하고, 특정 버전의 Metricbeat 이미지 즉, Elastic Docker 레지스트리 docker.elastic.co/beats/metricbeat:7.11.0의 Metricbeat docker 이미지를 사용합니다.

또한, Metricbeat를 설정 및 시작하고 데이터를 Elastic Cloud로 전송하려면 이 컨테이너에 대한 명령을 추가해야 합니다.

./metricbeat setup -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH && ./metricbeat modules disable system && ./metricbeat modules enable awsfargate && ./metricbeat -e -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH

실제 자격 증명을 사용하여 Environment variables 섹션에 $ELASTIC_CLOUD_ID$ELASTIC_CLOUD_AUTH 값을 추가해야 합니다. AWS Secret Manager를 사용하면 이 값을 일반 텍스트로 저장하는 것을 방지할 수 있습니다.

새로운 태스크 정의 수정 버전이 생성되면 [Actions] 드롭다운 메뉴에서 run task를 클릭합니다. 그러면 재시작 시 Metricbeat가 태스크에 추가됩니다.

모니터링할 태스크가 많은 경우, 수동으로 Metricbeat 컨테이너를 추가하는 것은 시간 소모적이고 지루한 작업이 될 수 있습니다. 이때는 AWS CloudFormation을 사용하는 것이 좋습니다. 이는 수동 작업 없이 수명 주기 전체에 걸쳐 리소스를 프로비저닝하고 업데이트하여 리소스를 관리하는 AWS 네이티브 템플릿입니다. AWS CloudFormation을 사용하면 인프라를 코드로 처리하고 템플릿 파일을 통해 관리할 수 있습니다. 템플릿 파일에는 필요한 리소스 및 관련 종속성이 모두 정의되어 있습니다.

다음은 CloudFormation을 사용하여 Metricbeat 컨테이너를 태스크에 추가하는 방법을 보여주는 간단한 예입니다.

 TaskDefinition: 
   Type: AWS::ECS::TaskDefinition 
   Properties: 
     Family: !Ref TaskName 
     Cpu: 256 
     Memory: 512 
     NetworkMode: awsvpc 
     ExecutionRoleArn: !Ref ExecutionRole 
     ContainerDefinitions: 
       - Name: metricbeat-container 
         Image: docker.elastic.co/beats/metricbeat:7.11.0 
         Secrets: 
           - Name: ELASTIC_CLOUD_ID 
             ValueFrom: !Ref CloudIDArn 
           - Name: ELASTIC_CLOUD_AUTH 
             ValueFrom: !Ref CloudAuthArn 
                 EntryPoint: 
           - sh 
           - -c 
         Command: 
           - ./metricbeat setup -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH && ./metricbeat modules disable system && ./metricbeat modules enable awsfargate && ./metricbeat -e -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH

또한 awsfargate 모듈이 포함된 전체 AWS CloudFormation 템플릿을 사용할 수도 있습니다. 이 템플릿은 새로운 클러스터를 생성하고 Metricbeat 컨테이너 및 스트레스 테스트 컨테이너에 대한 태스크 정의를 생성하여 서비스를 시작합니다. 템플릿을 로컬에서 cloudformation.yml 파일로 복사해 둔 후 직접 사용해 보셔도 좋습니다.

Elastic Cloud를 사용하고 있다면 cloud id와 cloud auth를 AWS Secret Manager에 저장하는 것이 좋습니다. 다음은 AWS CLI 예시입니다.

ELASTIC_CLOUD_AUTH 보안 정보 생성:

aws --region us-east-1 secretsmanager create-secret --name ELASTIC_CLOUD_AUTH --secret-string XXX

ELASTIC_CLOUD_ID 보안 정보 생성:

aws --region us-east-1 secretsmanager create-secret --name ELASTIC_CLOUD_ID --secret-string YYY

보안 정보가 생성되었으니 CloudFormation 템플릿 파일인 cloudformation.yml을 사용하여 AWS CLI 호출 한 번으로 전체 스택을 생성하겠습니다.

CloudFormation 스택 생성:

aws --region us-east-1 cloudformation create-stack --stack-name test-metricbeat-deployment --template-body file://./cloudformation.yml --capabilities CAPABILITY_NAMED_IAM --parameters ParameterKey=SubnetID,ParameterValue=subnet-5d89de27 ParameterKey=CloudAuthArn,ParameterValue=arn:aws:secretsmanager:us-east-1:xxx:secret:ELASTIC_CLOUD_AUTH-abc ParameterKey=CloudIDArn,ParameterValue=arn:aws:secretsmanager:us-east-1:xxx:secret:ELASTIC_CLOUD_ID-abc ParameterKey=ClusterName,ParameterValue=metricbeat-fargate ParameterKey=RoleName,ParameterValue=ecsFargateTaskExecutionRole 
ParameterKey=TaskName,ParameterValue=task-metricbeat ParameterKey=ServiceName,ParameterValue=metricbeat-service ParameterKey=LogGroupName,ParameterValue=metricbeat-fargate-log-group

CloudFormation에서 스택 상태가 CREATE_COMPLETE로 표시되면 10초 간격으로 Elasticsearch에 전송되는 모니터링 메트릭을 볼 수 있습니다. awsfargate 모듈은 각 컨테이너에서 CPU, 메모리, 네트워크, 디스크 IO 정보 등 런타임 메트릭을 수집합니다. 또한, 즉시 사용할 수 있는 대시보드도 있습니다. 이 대시보드는 Kibana에서 awsfargate의 모든 모니터링 데이터를 표시합니다.

테스트가 끝나면 AWS CLI를 사용하여 전체 스택을 손쉽게 삭제할 수 있습니다.

aws --region us-east-1 cloudformation delete-stack --stack-name test-metricbeat-deployment

그럼 이제 무엇을 해야 할까요?

Amazon ECS 컨테이너 배포에 사용할 모니터링 솔루션을 찾고 계신가요? Metricbeat dockerawsfargate 모듈을 사용하면 사용자가 간편하게 Amazon ECS 컨테이너를 모니터링하고 메트릭을 Elastic Cloud의 Elasticsearch Service로 전송할 수 있습니다. 질문이나 피드백이 있으시면, Beats 포럼에 자유롭게 글을 올려주세요!