AWS에서 EC2에 CloudWatch 에이전트를 설치하는 두 가지 방법에 대해서 알아보고 자동 설치를 위한 방법과 이점을 공유하고자 합니다. 기존 OpsNow의 한 서비스에서 진행하던 수동 설치 방법이 어떻게 대체될 수 있는지를 보시면서 도움되기를 바랍니다.

수동 설치

먼저, 사전에 준비한 CloudWatch 에이전트의 설정에 대한 config.json 파일을 EC2로 옮기고, 링크에서 해당하는 OS에 따른 에이전트 설치 파일을 다운로드 합니다. 다운로드한 설치 패키지를 다음 명령을 통해서 설치합니다. 기본적으로 우분투를 기준으로 설명하도록 하겠습니다.

{
"agent":{
"metrics_collection_interval":60,
"region":"ap-northeast-2",
"logfile":"/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
"debug":false
},
"metrics":{
"namespace":"CWAgent/Linux",
"metrics_collected":{
"disk":{
"measurement":[
"disk_used_percent"
],
"metrics_collection_interval":60,
"resources":[
"/"
] },
"mem":{
"measurement":[
"mem_used_percent"
],
"metrics_collection_interval":60
}
},
"append_dimensions":{
"InstanceId":"${aws:InstanceId}"
}
}
}
Code language: JSON / JSON with Comments (json)
# rpm package
sudo rpm -U ./amazon-cloudwatch-agent.rpm
# deb package
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
Code language: Bash (bash)

CloudWatch 에이전트는 /opt/aws/amazon-cloudwatch-agent 경로에 설치가 진행됩니다. 다음 명령을 통해서 사전에 EC2로 옮겨놓은 config.json을 연결합니다. 필요에 따라서 파일을 CloudWatch 에이전트가 설치된 경로로 옮기는 것이 안전합니다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:<configuration-file-path> -s
Code language: Bash (bash)

config.json의 일부 설정은 collectd를 필요로 합니다. 설치 여부를 확인하고 누락되어 있으면 설치를 진행합니다. 모든 설정이 완료되었으면 서비스를 시작하고 상태를 확인합니다.

sudo systemctl enable amazon-cloudwatch-agent
sudo systemctl start amazon-cloudwatch-agent
sudo systemctl status amazon-cloudwatch-agent
Code language: Bash (bash)

systemctl이 설치되지 않은 경우에는 설치를 하거나, 수동으로 실행할 수 있습니다.

/opt/aws/amazon-cloudwatch-agent/bin
/start-amazon-cloudwatch-agent
Code language: Bash (bash)

자동 설치

AWS의 Systems Manager를 통해서 관리형 인스턴스 (Managed Instance) 에 등록되면 런 커맨드 (Run Command) 라는 기능을 사용할 수 있습니다. 이 기능은 여러 인스턴스에 대해서 공통의 명령을 일괄로 제공하는 기능입니다. EC2를 관리형 인스턴스로 등록하는 방법은 다음 글을 참고하시기 바랍니다.

물론 이 방법은 또 다른 에이전트의 설치를 요구하고 있습니다. 바로 System Manager의 ssm 에이전트 입니다. 다행히도 Amazon Linux 또는 Ubuntu 16.04 이후의 최신 버전들은 해당 에이전트가 기본적으로 설치되어 있으므로, 이를 이용하면 손쉽게 CloudWatch 에이전트를 설치할 수 있게 됩니다.

자동 설치는 크게 3단계로 이루어집니다.

  • config.json의 파라미터 스토어 등록
  • CloudWatch 에이전트 설치
  • CloudWatch 에이전트 설정

먼저, 파라미터 스토어에 config.json의 모든 내용을 compact 타입으로 저장합니다. 용량을 최소하하기 위함입니다.

표준 문자열 파라미터를 생성합니다.

이제 런 커맨드로 가서 명령을 생성합니다. 별도로 스크립트를 작성할 필요 없이, 사전에 AWS에서 제공하는 배포자 (Distributor) 기능을 이용합니다. AWS-ConfigureAWSPackage 명령을 선택합니다.

AWS-ConfigureAWSPackage를 선택합니다.

패키지 명은 다음과 같이 AmazonCloudWatchAgent를 입력합니다.

명령 파라미터를 설정합니다.

그리고 해당 명령을 수행할 인스턴스를 관리형 인스턴스 목록에서 수동 선택하거나 태그를 통해서 일괄 지정할 수 있습니다. 그대로 명령을 실행하고 명령의 결과를 확인합니다.

설치 결과가 정상인 인스턴스들은 이제 CloudWatch 에이전트 설정을 변경해서 파라미터 스토어에 저장된 config.json을 이용할 수 있도록 합니다. 다음과 같이 AmazonCloudWatch-ManageAgent 커맨드를 선택하고 앞서 파라미터 스토어에서 설정한 파라미터 이름을 입력합니다.

파라미터 스토어의 파라미터 이름을 입력할 수 있습니다.

다시 명령을 수행하고 결과를 확인합니다. 시간이 지나고 CloudWatch의 로그가 정상적으로 쌓이는지 확인하면 됩니다. 음… 쌓이지 않는군요.

디버깅

첫 번째 문제는 collectd를 이용하는 설정때문입니다. 이것도 런 커맨드로 설치할 수 있습니다. Amazon Linux에서는 AWS-RunShellScript 명령을 이용하여 다음과 같이 진행하시면 됩니다.

sh 커맨드를 제공합니다.

두 번째 문제는, 인스턴스에 IAM 정책이 할당되지 않았기 때문입니다. CloudWatch 에이전트에서 발생하는 메트릭을 저장하려면 CloudWatchAgentServerPolicy 정책이 EC2에 할당이 되어있어야 합니다. 그 후에 다시 메트릭을 살펴보니, 정상적으로 메트릭이 나타나는 것을 볼 수 있었습니다.

메트릭이 확인됩니다!

이렇게 CloudWatch 에이전트의 수동 설치와 자동 설치에 대해서 살펴보았습니다. 수동 설치는 별도의 툴을 이용하지 않는 이상, PEM키를 준비해서 EC2에 SSH로 접속하고 하나씩 설치해야 하는 문제가 있습니다. 물론 벌크 작업이 가능하게 동시에 수십대를 접속해주는 툴이 있기는 하지만, 키 관리가 여간 고역이 아닙니다.

그러나, 자동 설치는 IAM을 통한 접근 제어 + 런 커맨드를 이용한 벌크 작업을 매우 간단하게 제공하고 있습니다. 시스템 관리자라면 반드시 사용해야 할 툴 중에 하나라고 생각됩니다. 좀 더 클라우드 네이티브한 관리 방법을 사용하시기를 권장하며 글을 마칩니다. 👍