CloudWatch 대시보드 생성을 자동화하여 AWS 리소스를 모니터링 하는 방법

8 minute read
Content level: Advanced
1

본 기사에서는 AWS 리소스를 모니터링하기 위해 CloudWatch 지표와 경보를 포함하는 CloudWatch 대시보드 생성을 자동화하는 방법에 대해 설명합니다.

Amazon CloudWatch는 AWS 리소스 및 AWS에서 실행되는 애플리케이션을 실시간으로 모니터링합니다. 또한 CloudWatch 대시보드를 추가로 생성하여 사용자의 지정 애플리케이션에 대한 지표를 표시하고, 선택한 지표의 사용자의 지정 집합을 표시할 수 있습니다. 따라서 CloudWatch 대시보드를 사용하여 IEM(AWS 인프라 이벤트 관리) 또는 특별 이벤트 그리고 일상적인 상황에서 AWS 리소스를 모니터링할 수 있습니다.

그리고 AWS 리소스를 모니터링 해야할 때, 여러 지표를 확인해야 하거나 때로는 여러 지역에 AWS 리소스가 있을 수 있습니다. 그러나 CloudWatch 대시보드는 기본적으로 필요한 지표로 위젯을 구축하는 것이므로 번거로울 수 있습니다.

AWS CloudWatch Dashboard GeneratorTAG Based CloudWatch Dashboard using CDK는 CloudWatch 대시보드 생성을 자동화하여 수동으로 여러 지역의 AWS 리소스에 대한 여러 지표를 표시해야 하는 번거로움을 해소할 수 있습니다.


AWS CloudWatch Dashboard Generator

AWS CloudWatch Dashboard Generator는 Python 기반으로 모니터링 대상의 리소스 목록 CSV 파일을 읽어서 리소스 ID를 가져온 다음 지정된 디렉토리에 CloudWatch 대시보드 JSON 스크립트를 생성합니다.

Python 소스 코드가 참조하는 리소스 목록의 CSV 파일은 CloudWatch Dashboard에서 지표가 포함된 그래프를 생성할 여러 정보를 포함합니다. CSV 파일의 테이블은 다음 형식을 따라야 합니다.

serviceregion_codedim1_namedim1_valuedim2_namedim2_value
serviceregion codeDimensionName1DimensionValue1DimensionName2DimensionValue2

service에는 현재 지원되는 AWS 리소스 유형을 입력합니다.

Resource TypesSupported?
Application Load Balancer
Network Load Balancer
Classic Load Balancer
CloudFront
NAT Gateway
EC2
ElastiCache
RDS
Aurora

Dimension은 지표에 연결되는 이름/값 pair입니다. 예를 들면, EC2의 경우 dim1_name은 InstanceId가 되고 dim1_value는 인스턴스 ID가 됩니다.

리소스 목록 CSV 파일의 예제를 보겠습니다.

service,region_code,dim1_name,dim1_value,dim2_name,dim2_value
ALB,ap-northeast-1,LoadBalancer,app/my-alb1/1234567890123456
ALB,ap-northeast-1,LoadBalancer,app/my-alb2/1234567890123456,TargetGroup,targetgroup/my-targets/1234567890123456
CLB,ap-northeast-1,LoadBalancer,myCLB
NLB,ap-northeast-1,LoadBalancer,net/my-nlb1/1234567890123456
NLB,ap-northeast-1,LoadBalancer,net/my-nlb2/1234567890123456,TargetGroup,targetgroup/my-targets/1234567890123456
NAT,ap-northeast-1,NatGatewayId,nat-0abcdef1234567890
CloudFront,us-east-1,DistributionId,EDFDVBD6EXAMPLE
EC2,ap-northeast-1,InstanceId,i-0abcdef1234567890
RDS,ap-northeast-1,DBInstanceIdentifier,support-instance-1
ElastiCache,ap-northeast-1,CacheClusterId,support-001,CacheNodeId,0001
AuroraCluster,ap-northeast-1,DBClusterIdentifier,cluster-001
AuroraInstance,ap-northeast-1,DBInstanceIdentifier,instance-001

리소스 목록 CSV 파일이 준비되었으면 프로젝트 디렉토리에서 종속성을 설치한 후 iemcwd.py을 실행하여 CloudWatch 대시보드 JSON 스크립트를 생성합니다.

  • 종속성 설치: pip install -r requirements.txt
python3 iemcwd.py -f inputs/csv/example.csv -o outputs/example_output.json

Successfully generated CloudWatch dashBoard JSON file.
  • 리소스 목록 CSV 파일명 "example.csv" 및 CloudWatch 대시보드 JSON 스크립트 파일명 "example_output.json"을 수정하여 실행합니다.
  • iemcwd.py가 정상적으로 실행되기 위해서는 3.8과 3.11 사이의 Python 버전과 pip가 설치되어 있어야 합니다.

다음은 EC2 인스턴스에서 AWS CloudWatch Dashboard Generator의 전제조건과 종속성을 설치한 후 리소스 목록 CSV 파일을 생성하고 AWS CloudWatch Dashboard Generator의 iemcwd.py을 실행하여 CloudWatch 대시보드 JSON 스크립트를 생성하는 EC2 사용자 데이터 스크립트입니다.

  • 이 쉘스크립트와 Amazon Linux EC2 인스턴스를 사용하여 간편하고 쉽게 CloudWatch 대시보드 JSON 스크립트를 생성할 수 있습니다.
  • Amazon Linux EC2 인스턴스를 생성할 때 사용자 데이터에 입력합니다.
  • 그리고 생성된 CloudWatch 대시보드 JSON 스크립트를 확인하여 다른 곳에 복사한 후 인스턴스를 종료할 수 있습니다.

# AWS CloudWatch Dashboard Generator #
#!/bin/bash -xe
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
sleep 60
cd /home/ec2-user
sudo -u ec2-user python3 -m ensurepip --upgrade --user
sudo yum install -y git
sudo -u ec2-user git clone https://github.com/aws-samples/aws-cloudwatch-dashboard-generator.git
sudo -u ec2-user curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
cd /home/ec2-user/aws-cloudwatch-dashboard-generator
pip install -r requirements.txt
cd /home/ec2-user/aws-cloudwatch-dashboard-generator/inputs/csv
# iemcwd.py와 함께 사용되는 리소스 목록 CSV 파일을 생성합니다. 서비스, 지역 코드, 차원 이름, 차원 값 순으로 나열됩니다. 이 예제에서 파일 이름은 CWDashboard.csv입니다.
sudo -u ec2-user echo "service,region_code,dim1_name,dim1_value,dim2_name,dim2_value" > /home/ec2-user/aws-cloudwatch-dashboard-generator/inputs/csv/CWDashboard.csv
sudo -u ec2-user echo "ALB,ap-northeast-2,LoadBalancer,app/my-alb1/1234567890123456" >> /home/ec2-user/aws-cloudwatch-dashboard-generator/inputs/csv/CWDashboard.csv
sudo -u ec2-user echo "ALB,ap-northeast-2,LoadBalancer,app/my-alb2/1234567890123456" >> /home/ec2-user/aws-cloudwatch-dashboard-generator/inputs/csv/CWDashboard.csv
sudo -u ec2-user echo "NLB,ap-northeast-2,LoadBalancer,net/my-nlb1/1234567890123456" >> /home/ec2-user/aws-cloudwatch-dashboard-generator/inputs/csv/CWDashboard.csv
sudo -u ec2-user echo "CLB,ap-northeast-2,LoadBalancer,myCLB" >> /home/ec2-user/aws-cloudwatch-dashboard-generator/inputs/csv/CWDashboard.csv
sudo -u ec2-user echo "RDS,ap-northeast-2,DBInstanceIdentifier,support-instance-1" >> /home/ec2-user/aws-cloudwatch-dashboard-generator/inputs/csv/CWDashboard.csv
sudo -u ec2-user echo "AuroraCluster,ap-northeast-2,DBClusterIdentifier,cluster-001" >> /home/ec2-user/aws-cloudwatch-dashboard-generator/inputs/csv/CWDashboard.csv
sudo -u ec2-user echo "AuroraInstance,ap-northeast-2,DBInstanceIdentifier,instance-001" >> /home/ec2-user/aws-cloudwatch-dashboard-generator/inputs/csv/CWDashboard.csv
sudo -u ec2-user echo "EC2,ap-northeast-2,InstanceId,i-0abcdef1234567890" >> /home/ec2-user/aws-cloudwatch-dashboard-generator/inputs/csv/CWDashboard.csv
sudo -u ec2-user echo "CloudFront,us-east-1,DistributionId,EDFDVBD6EXAMPLE" >> /home/ec2-user/aws-cloudwatch-dashboard-generator/inputs/csv/CWDashboard.csv
sudo -u ec2-user echo "NAT,ap-northeast-2,NatGatewayId,nat-0abcdef1234567890" >> /home/ec2-user/aws-cloudwatch-dashboard-generator/inputs/csv/CWDashboard.csv
cd /home/ec2-user/aws-cloudwatch-dashboard-generator
sudo -u ec2-user mkdir outputs
sudo -u ec2-user python3 iemcwd.py -f inputs/csv/CWDashboard.csv -o outputs/CWDashboard.json
  • 이 쉘스크립트에서는 Event Monitoring Generator의 Python 소스 코드가 참조할 리소스 목록의 CSV 파일을 생성합니다.
  • service, ​​region_code, dimension name, dimension value 순으로 나열합니다. 리소스 목록 CSV 파일을 생성하는 부분을 수정하여 AWS 리소스를 추가하거나 제거할 수 있습니다.
  • 이 예제 쉘스크립트에서 리소스 목록 CSV 파일 이름은 CWDashboard.csv이고 CloudWatch 대시보드 JSON 스크립트 이름은 CWDashboard.json이며 CloudWatch 대시보드 JSON 스크립트가 저장되는 폴더는 outputs입니다.


TAG Based CloudWatch Dashboard using CDK

TAG Based CloudWatch Dashboard using CDK는 AWS Resource Groups Tagging API를 사용해서 특정 태그를 검색한 다음에 발견된 AWS 리소스를 기반으로 각 서비스 API에서 추가 정보를 끌어오고 구성 파일(JSON)을 생성하여 지표와 경보가 포함된 CloudWatch Dashboard를 생성합니다.

CloudWatch 대시보드를 생성하기 위한 전제조건

  • Python 3
  • Boto 3
  • Node JS 18 LTS
  • CDK v2 -- CDK v2는 CloudFormation 템플릿을 생성하고 배포하는 데 사용됩니다.

CDK v2로 처음 배포하는 경우 먼저 부트스트래핑을 해야 합니다.

  • 부트스트래핑은 AWS CDK 앱을 AWS 환경에 배포하기 전에 AWS CDK용 리소스를 프로비저닝하는 프로세스입니다.
  • 프로젝트 디렉토리에서 명령어 cdk bootstrap를 실행합니다.

프로젝트 디렉토리에서 명령어 npm install를 실행하여 종속성을 설치합니다.

프로젝트 설정 파일 lib/config.json에서 TagKey를 사용하려는 태그 키로 설정하고 TagValues를 값 배열로 설정합니다.

  • CloudWatch 대시보드가 해당 키와 지정된 값으로 태그된 모든 리소스를 수집합니다.

모니터링하려는 리소스가 포함된 리전을 포함하도록 지역을 설정합니다.

프로젝트 디렉토리의 data/resource_collector.py를 실행하여 리소스 구성 파일(resources.json)을 생성합니다.

프로젝트 디렉토리에서 명령어 cdk synth를 실행하여 CloudFormation 템플릿을 생성하거나 명령어 cdk deploy --all을 사용하여 AWS 계정에 직접 배포합니다.

다음은 EC2 인스턴스에서 TAG Based CloudWatch Dashboard using CDK의 전제조건과 종속성을 설치한 후 프로젝트 설정 파일 lib/config.json을 수정하고 data/resource_collector.py를 실행하여 리소스 구성 파일(resources.json)을 생성합니다. 그리고 CloudFormation 템플릿을 생성하고 CloudWatch 대시보드를 AWS 계정에 배포하는 EC2 사용자 데이터 스크립트입니다.

# TAG Based CloudWatch Dashboard using CDK #
#!/bin/bash -xe
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
sleep 60
cd /home/ec2-user
sudo -u ec2-user curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
sudo -u ec2-user python3 -m pip install boto3
sudo yum update -y
sudo yum install -y git nodejs
sudo npm -g install aws-cdk@latest
sudo -u ec2-user git clone https://github.com/aws-samples/tag-based-cloudwatch-dashboard.git
cd tag-based-cloudwatch-dashboard/
sudo -u ec2-user npm install
sleep 1
sed -i 's/"Application"/"IEM"/g' /home/ec2-user/tag-based-cloudwatch-dashboard/lib/config.json
# config.json에 기본적으로 설정되는 CloudWatch 대시보드 이름은 Application입니다. 이 예제에서는 IEM으로 변경합니다.
sed -i 's/"iem"/"IEM"/g' /home/ec2-user/tag-based-cloudwatch-dashboard/lib/config.json
# config.json에 기본적으로 설정된 태그의 키는 소문자 iem입니다. 이 예제에서는 대문자 IEM으로 변경합니다.
sed -i 's/"202202","202102"/"yes"/g' /home/ec2-user/tag-based-cloudwatch-dashboard/lib/config.json
# config.json에 기본적으로 설정된 태그 값은 202202 및 202102입니다. 이 예제에서는 소문자 yes로 변경합니다.
sed -i 's/"eu-west-1"/"ap-northeast-2"/g' /home/ec2-user/tag-based-cloudwatch-dashboard/lib/config.json
# config.json에 기본적으로 설정된 지역은 eu-west-1입니다. 이 예제에서는 ap-northeast-2로 변경합니다.
sleep 1
cd /home/ec2-user/tag-based-cloudwatch-dashboard/data
sudo -u ec2-user python3 resource_collector.py
cd /home/ec2-user/tag-based-cloudwatch-dashboard/
sudo -u ec2-user cdk synth
sudo -u ec2-user cdk bootstrap
sudo -u ec2-user cdk deploy
sleep 60
sudo poweroff
  • 이 쉘스크립트와 Amazon Linux EC2 인스턴스를 사용하여 쉽게 CloudWatch 대시보드를 배포할 수 있습니다.
  • Amazon Linux EC2 인스턴스를 생성할 때 사용자 데이터에 입력합니다.
  • 이 쉘스크립트는 CloudWatch 대시보드를 배포한 후 인스턴스를 중지 또는 종료합니다.
  • TAG Based CloudWatch Dashboard using CDK 소스에는 태그 및 리전 정보를 설정하는 config.json이 있고 기본적으로 설정되어 있는 값이 있습니다.
  • 배포되어 생성될 CloudWatch 대시보드의 이름과 태그 키 및 값 그리고 리전에 대한 정보를 사용자에 맞게 변경합니다.


지원되는 AWS 서비스 비교

리소스의 ID와 같은 정보만 알고 있으면 CloudWatch 대시보드의 JSON 스크립트를 생성할 수 있는 CloudWatch Dashboard Generator의 경우 9개의 AWS 서비스를 지원합니다.

TAG Based CloudWatch Dashboard using CDK의 경우 지원되는 AWS 서비스가 20개로 많지만, 선행되어야 하는 작업으로 AWS 리소스에 태그를 지정해야 합니다. 만약 AWS 리소스에 공통된 태그가 이미 있는 경우에 TAG Based CloudWatch Dashboard using CDK를 사용하는 것이 가장 좋습니다.

Resource TypesCloudWatch Dashboard GeneratorTAG Based CloudWatch Dashboard using CDK
Application Load Balancer
Network Load Balancer
Classic Load Balancer
NAT Gateway
Transit Gateway
WAFv2
CloudFront
Auto Scaling Group
API Gateway
Lambda
ECS
AppSync
SNS
SQS
S3
RDS
Aurora
DynamoDB
EC2
ElastiCache
Volumes
  • As of November 20, 2023

profile pictureAWS
SUPPORT ENGINEER
Jisoo_K
published 6 months ago507 views