[원본] 아래 블로그와 동일한 작업이며, 단지 소스 오픈 여부 입니다. 아래 작성자님 무한 감사 드립니다.
https://brunch.co.kr/@alden/53
- 더불어 문서에 앞서 ST Unitas 황선규님에게 감사 인사 드립니다. 대부분의 코딩 수정을 도와주셨습니다.
(거의 다 작성해 주셨습니다 ㅎㅎ)
목적
- Cloudwatch 상에서 확인할 수 있는 그래프를 Slack에서 이미지로 확인
- 가독성이 높아져서 현상 확인하기 쉬움
- 그래프를 확인하기 위해 AWS에 접속하는 불편 감수
동작방식
- Lambda 에서 미리 셋팅한 Cloudwatch 정보를 이용하여(json) 현재 상태를 이미지화 하여 Slack으로 전송
- Python 3.7로 개발
필요한 모듈
- boto3
- certifi
- chardet
- idna
- json
- requests
사전지식
- Lambda 를 이용하기 위해서는 python에서 사용하는 모든 모듈을 파일로 보유해야함(모두 하나의 zip으로 압축해서 업로드)
(Lambda에 대한 사전 지식이 있으면 괜찮지만, 처음 접하기에 쉽지 않음 - pip로 local로 필요한 모듈을 설치 후 해당 모듈의 폴더 전체가 필요)
ex) C:\Users\접속한계정\AppData\Local\Programs\Python\Python37\Lib\site-packages 에 설치한 모듈 존재 - Lambda 테스트를 위해서는 핸들러의 명칭에 존재하는 함수가 반드시 명시되어 있어야 하며, 함수의 Default 핸들러는 수정하면 안됨
-
권한 : boto3.client('cloudwatch').get_metric_widget_image 을 사용하기 위해서는 Cloudwatch에 접근할 수 있는 권한과 함께 "cloudwatch:GetMetricWidgetImage" 이라는 권한도 필요
Lambda를 생성하는 계정에 모든 권한이 존재 하더라도, Lambda 하단의 역할에서 존재 여부를 체크 필요
IAM 권한에서 있는지 여부 체크 필요 (아래는 관련 모든 권한을 부여함){
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"cloudwatch:DescribeAlarmHistory",
"cloudwatch:GetDashboard",
"cloudwatch:GetMetricData",
"cloudwatch:DescribeAlarmsForMetric",
"cloudwatch:DescribeAlarms",
"cloudwatch:GetMetricStatistics",
"cloudwatch:GetMetricWidgetImage"
],
"Resource": "*"
}
]
}
필요한 Cloudwatch 정보
- 이미지로 보고자 하는 Cloudwatch 지표를 확인하여 저장
아래 샘플은 Cloudwatch의 지표 중 하나인 전체 EC2 CPU 정보
소스를 선택하면 아래의 정보를 확인할 수 있다.
{
"view": "timeSeries",
"stacked": false,
"metrics": [
[ "AWS/EC2", "CPUUtilization" ]
],
"title": "전체 EC2 CPU",
"width": 2310,
"height": 250,
"start": "-PT3H",
"end": "P0D",
"timezone": "+0900"
}
여기서 가장 중요한 것은 metrics 정보를 잘 저장하면 된다. -
Slack 으로 전달하기 위해서 token 정보 필요
Slack bot을 미리 생성하였기 때문에 해당 Slack bot을 이용하였으며, channels 만 변경 한다면 동일 Bot을 이용해도 문제 없을 것이라고 예상
아래에서 channels 에서 필요한 곳으로 변경 하자.slack_params = {
"filename":"test.png",
"token":"SLACK BOT의 token 값을 넣어 주시면 됩니다",
"channels":['#aws-db-slowquery-noti <-와 같이 채널 명칭을 넣어주세요.']
}
전체 소스
- metric_sources 만 수정하면 된다. 디테일하게 수정하고 싶다하면 아래 문서 참조
https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/CloudWatch-Metric-Widget-Structure.html
Sample_python
import json import boto3 import requests
cloudwatch = boto3.client('cloudwatch') metric_sources = [ { "metrics": [ "AWS/EC2", "CPUUtilization" ], "view": "timeSeries", "stacked": False, "region": "ap-northeast-2", "timezone": "+0900" } ]
def metric(event, context): for metric_data in metric_sources : metric_data = json.dumps(metric_data)
#print(metric_data) image_data = cloudwatch.get_metric_widget_image(MetricWidget=metric_data) # print(image_data)
slack_params = { "filename":"test.png", "token":"SLACK BOT의 token 값을 넣어 주시면 됩니다", "channels":['#aws-db-slowquery-noti <-와 같이 채널 명칭을 넣어주세요.'] } image = {'file': image_data['MetricWidgetImage']}
requests.post("https://slack.com/api/files.upload", params=slack_params, files=image)
|
- 직접 테스트한 내용
lambda_python
import json import boto3 import requests
cloudwatch = boto3.client('cloudwatch') metric_sources = [ { "metrics": [ [ "LogMetrics", "MongoDB-queries time Value", "MongoDB-Primary-Collections", "queries time millisecond", { "stat": "Sum" } ], ], "view": "timeSeries", "stacked": False, "region": "ap-northeast-2", "timezone": "+0900" }, { "metrics": [ [ "AWS/RDS", "CPUUtilization", "DBInstanceIdentifier", "rds-m1" ], [ "...", "rds-s1" ], [ "...", "rds-s2" ], [ "...", "rds-s3" ], [ "...", "rds-s4" ], [ "...", "rds-s5" ] ], "view": "timeSeries", "stacked": False, "region": "ap-northeast-2", "timezone": "+0900" } ]
def metric(event, context): for metric_data in metric_sources : metric_data = json.dumps(metric_data)
#print(metric_data) image_data = cloudwatch.get_metric_widget_image(MetricWidget=metric_data) # print(image_data)
slack_params = { "filename":"test.png", "token":"SLACK BOT의 token 값을 넣어 주시면 됩니다", "channels":['#aws-db-slowquery-noti <-와 같이 채널 명칭을 넣어주세요.'] } image = {'file': image_data['MetricWidgetImage']}
requests.post("https://slack.com/api/files.upload", params=slack_params, files=image)
|
- 전체 소스에 대한 zip파일 (해당 파일을 Lambda에 업로드 하면 필요한 모듈을 한번에 upload
출처
'AWS' 카테고리의 다른 글
[Amazon MemoryDB for Redis] 정리 및 비교 (0) | 2021.12.22 |
---|---|
[Amazon MemoryDB for Redis] 정리 및 비교 (0) | 2021.12.22 |