알림을 받고자 하는 채널의 webhook URL이 필요.
노란색 네모는 아래에서 설명하겠음.
이름 설정후 확인을 하면 사진의 가장 아래처럼, webhook URL이 발급된다.
이 URL을 저장. 혹시 까먹거나, 나중에 다시 보고 싶다면 2번에 노란색 네모를 누르면 나옴.
어떤 정보를 받아 올건지 주제를 생성해야 함.
다른것은 따로 설정하지 않고 주제 생성.
위에서 설정한 주제에 대해서, 어떻게 받아올건지 이후에 설정을 할 것인데 우리는 Teams로 메세지를 쏘는 기능을 만들 것이므로, AWS Lambda를 이용할 것이다.
이후 다른 설정은 따로 안바꾸고 생성함. 완료되면 아래와 같이 나옴.
아래 함수 ARN 을 저장해 놓아야 함.
아래 코드에서 url을 바꾼 후 lambda_function.py에 붙여넣고 저장 후 Deploy를 한다.
url 은 처음에 발급받은 Teams webhookURL을 넣는다.
예시) url = os.environ['scouter911hook']
import urllib3
import json
import os
http = urllib3.PoolManager()
def lambda_handler(event, context):
url = os.environ['환경변수 Key']
message = json.loads(event['Records'][0]['Sns']['Message'])
alarm_name = message['AlarmName']
new_state = message['NewStateValue']
reason = message['NewStateReason']
msg = {
'text': "%s: %s CPU가 85프로 이상 입니다. Info: %s" % (new_state, alarm_name, reason)
}
encoded_msg = json.dumps(msg).encode('utf-8')
resp = http.request('POST',url, body=encoded_msg)
return (json.loads(encoded_msg))
코드는 보면 바로 이해할 내용인지라, 한가지만 짚고 넘어가겠다.
message = json.loads(event['Records'][0]['Sns']['Message'])
event['Records'][0]['Sns']['Message']에 담겨오는 정보는 아래와 같다.
따라서, 이중 나는 AlarmNams, NewStateValue, NewStateReason만 메세지로 받고자 하여 위와같은 코드를 작성하였다.
아래의 테스트 코드를 넣고 JSON 형식 지정을 누른 후 저장 버튼 클릭.
{
"Records": [
{
"EventSource": "aws:sns",
"EventVersion": "1.0",
"EventSubscriptionArn": "arn:aws:sns:ap-northeast-2:046394151411:DEV_RDS_CPUUtilization",
"Sns": {
"Type": "Notification",
"MessageId": "test",
"TopicArn": "arn:aws:sns:ap-northeast-2:046394151411:DEV_RDS_CPUUtilization",
"Subject": "ALARM: \"RDS-CPUUtilization-high\" in Asia Pacific (Seoul)",
"Message": "{\"AlarmName\":\"RDS-CPUUtilization-high\",\"AlarmDescription\":\"RDS CPUUtilization HIGH\",\"AWSAccountId\":\"test\",\"NewStateValue\":\"ALARM\",\"NewStateReason\":\"Thresholds Crossed: 1 out of the last 1 datapoints [3.357642633941475 (14/12/22 07:05:00)] was greater than the threshold (1.0) (minimum 1 datapoint for OK -> ALARM transition).\",\"StateChangeTime\":\"2021-06-07T11:31:17.332+0000\",\"Region\":\"Asia Pacific (Seoul)\",\"AlarmArn\":\"arn:aws:cloudwatch:ap-northeast-2:123123123:alarm:RDS-CPUUtilization-high\",\"OldStateValue\":\"OK\",\"Trigger\":{\"Period\":60,\"EvaluationPeriods\":10,\"ComparisonOperator\":\"GreaterThanUpperThreshold\",\"ThresholdMetricId\":\"ad1\",\"TreatMissingData\":\"- TreatMissingData: missing\",\"EvaluateLowSampleCountPercentile\":\"\",\"Metrics\":[{\"Id\":\"m1\",\"MetricStat\":{\"Metric\":{\"Dimensions\":[{\"value\":\"ant-man-rdb-live\",\"name\":\"DBInstanceIdentifier\"}],\"MetricName\":\"CPUUtilization\",\"Namespace\":\"AWS/RDS\"},\"Period\":60,\"Stat\":\"Average\"},\"ReturnData\":true},{\"Expression\":\"ANOMALY_DETECTION_BAND(m1, 3)\",\"Id\":\"ad1\",\"Label\":\"CPUUtilization (expected)\",\"ReturnData\":true}]}}",
"Timestamp": "2021-06-07T11:31:17.380Z",
"SignatureVersion": "1",
"MessageAttributes": {}
}
}
]
}
그리고 Test 버튼을 누르고 status success가 나오면 됨.
받아온 정보는 주제로 전달이 되는데, 이 전달된 내용을 최종적으로 어디서 볼 것인지 구독을 생성해야 함.
참고로 한가지 주제로 여러 구독이 가능함.
예를들어 CPU 사용량 이라는 한가지 주제를 이메일로도 받고 문자로도 받는 것 처럼 여러가지 수단(구독)으로 받을 수 있음.
주제 ARN : 버튼을 클릭하면 자동으로 설정한 주제 목록이 나옴. 위에서 생성한 주제 클릭.
프로토콜 : 구독할 엔드포인트 유형 선택. 클릭하면 아래와 같이 엔드포인트 유형이 나옴.
AWS Lambda를 이용하여 Teams로 메세지를 쏠 거기 때문에 이걸 선택.
엔드포인트 : 아까 Lambda 생성할 때 저장해 둔, 함수 ARN을 붙여넣으면 아래 사진처럼 Use 하고 ARN이 뜨는데, 그걸 클릭.
완료되면 아래와 같이 나옴.
📌 여기까지, 구조는 아래와 같음.
이제 어떤 구독 내용물을 전달할거냐! 설정만 남아있음.
우리는 AWS RDS의 CPU 사용량에 대한 정보를 전달받고자 하니, Cloudwatch를 통하여 정보를 받을 것.
클라우드 워치는 리소스 및 애플리케이션을 모니터링 하는 서비스임.
자세한 내용은 cloudwatch를 공부하면 좋을 것.
나는 1분의 기간동안 CPU사용률이 최소 85% 이상이 되면 알림을 받고자 하여 아래 사진처럼 설정함.
여기서 정한 이름이 메세지에도 옴. 아래사진 참조하여 잘 정하기.
그 이외거 건들이지 않고 다음을 누르면 미리보기 및 생성이 나옴.
그대로 경보 생성.
바로 만들면 상태가 데이터 부족으로 나옴.
조금 기다리면 정상적으로 작동함.
아마 1분당 CPU가 몇인지 필요한데, 만들자 마자는 바로 조회를 안하니까 조금 기다려야 하는 것 같음.
위 과정에서 문제가 없다면, Cloudwatch 에서 경보 발생시 SNS 주제에 데이터를 전달하고, 그 주제를 각 구독 대상에게 전달한다. 우리는 람다로 설정했으므로 람다가 받을 것. 그것을 람다에서 팀즈로 보내주는 것.
완료하면 아래처럼 나온다. 아래는 테스트겸 CPU 설정을 20으로 해놓은 것! 헷갈리지 마세요!
Cloudwatch 에서 정한 이름이 나옴.
자세하게 글 써주셔서 감사합니다 도움많이 됐어요1!
혹시 7번 응용보면 개발DB는 타이틀같이 되어있고 밑에 본문도있는것같은데.. 람다에서 보낼때 msg = {
'text': ""
}
이 부분 혹시 어떻게 하셨는지 코드 알려주실 수 있을까요??? 잘안되네요ㅠ