[AWS] Cloudwatch: EC2 메모리 모니터링하기

어느날 특정 EC2 인스턴스가 계속해서 죽는 문제가 발견돼서, EC2 모니터링을 봤는데, CPU 사용량은 터질정도까지 솟은 적이 없었고, 다른 수치들도 마찬가지였다.
그래서 메모리 폭발로 인해 죽었다고 추정을 했는데... 문제는 EC2 기본 구성으로는 메모리를 확인할 수 없다는 것이었다.

기본 메트릭 구성에는 메모리 측정량이 없고, 간편하게 추가할 수도 없다.
변명으로는 그게 호스트 수준이 아니라 OS 수준에서 제어되는거라 그렇다고는 하는데.. 잘 모르겠다. Azure나 GCP는 잘만 지원하는데 안될 이유가 있나?

이걸 해결하려면 ec2에 들어가서 cloudwatch 클라이언트를 깔아주고, 로그 데이터를 계속 전송해줘야 한다.





에이전트 설치하기 (Amazon Linux)

아마존 리눅스의 경우에는 아래 명령으로 설치할 수 있다.

sudo yum install amazon-cloudwatch-agent




에이전트 설치하기 (Debian)

그 외의 플랫폼에서는 직접 다운받아서 설치한다.

wget https://amazoncloudwatch-agent.s3.amazonaws.com/debian/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb



마법사로 에이전트 설정 구성하기

아래 커맨드로 마법사를 켠다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

그리고 하나하나 답해주면 된다.

뭐 잡다한게 많은데, 대충 다 기본값으로 해도 무방하다.

중요한건 이거다.

어떤 항목들을 보여줄지에 대한 것이다.
메모리만 보면 된다면 베이직만 써도 되고, 그 이상이 필요하다면 다른걸 쓰면 된다.

내용은 대충 이렇다.

다 입력해서 이렇게 나가지면 구성은 끝난 것이다.

SSM 설정이나 추가 로그같은건 무시하고 지나가자.

그리고 끝내면 json으로 파일을 만들어줬다고 알려준다.
저 경로를 잘 보관하고 있자.

debian의 경우는 파일을 이상한데 깔아서 옮겨줘야 한다.

sudo mv /opt/aws/amazon-cloudwatch-agent/bin/config.json /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json

대화형이 싫다면 직접 복붙해서 쓰면 된다.

{
	"agent": {
		"metrics_collection_interval": 60,
		"run_as_user": "cwagent"
	},
	"logs": {
		"logs_collected": {
			"files": {
				"collect_list": [
					{
						"file_path": "",
						"log_group_class": "STANDARD",
						"log_group_name": ".",
						"log_stream_name": "{instance_id}",
						"retention_in_days": -1
					}
				]
			}
		}
	},
	"metrics": {
		"aggregation_dimensions": [
			[
				"InstanceId"
			]
		],
		"append_dimensions": {
			"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
			"ImageId": "${aws:ImageId}",
			"InstanceId": "${aws:InstanceId}",
			"InstanceType": "${aws:InstanceType}"
		},
		"metrics_collected": {
			"collectd": {
				"metrics_aggregation_interval": 60
			},
			"disk": {
				"measurement": [
					"used_percent"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				]
			},
			"mem": {
				"measurement": [
					"mem_used_percent"
				],
				"metrics_collection_interval": 60
			},
			"statsd": {
				"metrics_aggregation_interval": 60,
				"metrics_collection_interval": 10,
				"service_address": ":8125"
			}
		}
	},
	"traces": {
		"buffer_size_mb": 3,
		"concurrency": 8,
		"insecure": false,
		"traces_collected": {
			"xray": {
				"bind_address": "127.0.0.1:2000",
				"tcp_proxy": {
					"bind_address": "127.0.0.1:2000"
				}
			}
		}
	}
}




IAM 설정

EC2에서 cloudwatch에 접근할 수 있게끔, IAM 역할을 부여해줘야 한다.

먼저 역할을 만들고

CloudWatchAgentServerPolicy 권한을 붙여준다.

이름을 적당히 짓고

그걸 ec2에 붙여주자.

이러면 된다.




추가 세팅

아래 커맨드로 빈 파일을 하나 만들어준다.

sudo mkdir /usr/share/collectd
sudo touch /usr/share/collectd/types.db

그리고 cloudwatch에 액세스할 수 있게 aws 키값을 넣어준다.

그리고 실행하면 끝이다.

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:아까파일경로




모니터링 보기

모든 지표에 들어가서

잘 찾아보면 새로 생겨난 지표들이 있을 것이다.

한번 부하를 줘서 메모리를 늘려보면
https://blog.naver.com/sssang97/222978681251

여기서도 볼 수 있을 것이다.

해당 EC2의 모니터링만 모아보려면 "리소스 상태"로 이동해서

골라서 들어가서 보면

좀더 예쁘게 모아볼 수 있다.

EC2 페이지의 모니터링 탭에 보이게 하는 방법은 못찾았다.
아마도 매번 cloudwatch 콘솔로 들어와서 봐야 하는 것 같다.



참조
https://stackoverflow.com/questions/42317062/how-to-monitor-ec2-instances-by-memory
https://aws.amazon.com/ko/blogs/aws/new-cloudwatch-plugin-for-collectd/
https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html
https://musketpopeye.xyz/2020/12/11/aws-ec2-cloudwatch-mem/