AWS/Monitoring

AWS Monitoring[CloudWatch] - 2. Slack Message 변경하기

TTwY 2021. 9. 7. 14:23
728x90
반응형

이전 글에서 CloudWatch의 알람을 Lambda와 SNS를 이용하여 Slack으로 메시지를 받는 방법에 대해서 알아보았습니다.

https://longtermsad.tistory.com/49

 

AWS Monitering[CloudWatch] - 1. CloudWatch Alarm을 Slack 연동하기

AWS에서는 Amazon CloudWatch Alarm(경보)를 사용하여 모니터링 할 수 있으며 Alarm(경보)를 설정하고 해당 내용에 대해서 알람을 받을 수 있습니다. https://docs.aws.amazon.com/ko_kr/AmazonC..

longtermsad.tistory.com

AWS 에서 제공해주는 템플릿 Lambda 코드를 사용하면 아래와 같은 Slack Message를 받을 수 있습니다.

Slack Message를 보면 가독성이 떨어지고, 원하는 내용이 담겨 있지 않을 수도 있습니다. 이번글에서는 내가 원하는 Slack Message 내용을 추가하고 Slack Message를 가독성 있게 변경해보는 작업을 진행하려고 합니다.

 

아래와 같은 순서로 작업을 진행합니다.

1. CloudWatch Log를 통한 Message Value 값 확인하기

2. Lambda Code 수정 - 원하는 Value 값 지정하기

3. Lambda Code 수정 - text 수정 및 정리

4. Meassge 받아서 검증하기

 

1. CloudWatch Log를 통한 Message Value 값 확인하기

CloudWatch > Log groups 로 가보면, Slack을 부르는 Lambda Function 이름으로 끝나는 Log group을 확인 할 수 있습니다.

Log group에서 해당되는 항목을 클릭하면 Log streams이 나오고 가장 최신의 Log stream을 클릭합니다.

Timestamp 순으로 Message들이 나열 됩니다.

이전에 작성한 Lambda Code 중에서 다음과 같이 선언된 부분이 있습니다.

message = json.loads(event['Records'][0]['Sns']['Message'])

이 부분에서 Sns의 Meaasge의 값들을 불러오게 됩니다. 이 인자의 값들을 CloudWatch Log에서 전체 인자값들을 확인 할 수 있습니다.

'aws:sns'로 시작하는 Message를 클릭하면 위와 같이 전체 항목의 인자값을 확인할 수 있습니다.

 

2. Lambda Code 수정(원하는 Value 값 지정하기)

이전의 CloudWatch log에서 필요한 값으로 어떠한 내용을 전달할 것인지를 선택합니다. 저는 지표 이름, 발생 시간, 상태, 자원, 원인, 상세 내용을 표현하려고 합니다.

지표 이름(AlarmName), 발생 시간(StateChangeTime), 상태(NewStateValue), 자원(Dimensions[name][id]), 원인(Period 등), 상세 내용(AlarmDescription)

Lambda Code에 변수를 선언하여 필요값 값을 맵핑 하도록 하겠습니다.


    alarm_name = message['AlarmName']           # 지표 이름
    new_state = message['NewStateValue']        # 상태
    detail_reason = message['NewStateReason']   # 상세 내용
    resource_id = message['Trigger']['Dimensions'][0]['value']  #자원_id
    resource_name = message['Trigger']['Dimensions'][0]['name'] #자원_name
    compar_state = message['Trigger']['ComparisonOperator']    # 임계치 값
    minutes = message['Trigger']['Period']                 # 기간
    minutes = minutes / 60
    evaluationPeriods = message['Trigger']['EvaluationPeriods']  #횟수
    first_value = int(evaluationPeriods * minutes)   #원인
    state_time = message['StateChangeTime'][:19]     # 발생 시간
    kst_time = datetime.strptime(state_time, '%Y-%m-%dT%H:%M:%S') - timedelta(hours=-9) #KST 시간 변환
    metricName = message['Trigger']['MetricName']   # metricName
    threshold = message['Trigger']['Threshold']     # Threshold
    
    # Threshold type 임계치 부등호 변경
    if compar_state == "GreaterThanThreshold":
        compar_state = ">"
    elif compar_state == "GreaterThanOrEqualToThreshold":
        compar_state = ">="
    elif compar_state == "LowerThanOrEqualToThreshold":
        compar_state = "<="
    elif compar_state == "LessThanThreshold":
        compar_state = "<"
    else:
        compar_state = " "
        
    # 원인 문장 만들기
    cause = "%s 분 동안 %s 회 %s %s %s" %(first_value, evaluationPeriods, metricName, compar_state, threshold)
    
    slack_message = {
        'text': "%s, %s, %s, %s, %s, %s, %s" % (alarm_name, kst_time, new_state, resource_name, resource_id, cause, detail_reason)
    }

스트레스나 테스트 값을 넣어 원하는 값들이 잘 전달하는지도 확인합니다.

원하는 값들이 나오는 것을 확인합니다.

 

3. Lambda Code 수정 - text 수정 및 정리

테스트 메시지를 보면 가독성이 매우 떨어지는 것을 볼 수 있습니다.  가독성을 높이기 위해서 text 수정 및 정리를 하도록 하겠습니다.

slack_message = {
        'text': "*[%s]*\n*발생시간*\n%s\n*상태*\n%s\n*자원*\n(%s)%s\n*원인*\n%s\n*상세 내용*\n%s" % (alarm_name, kst_time, new_state, resource_name, resource_id, cause, detail_reason)
    }

Lambda Code에서 slack_message의 text 값을 다음과 같이 정리 합니다.

 

4. Meassge 받아서 검증하기

stress 테스트나 이미 가지고 있는 test 데이터를 test에 넣어주어 Slack Message를 받아 보도록 하겠습니다.

 

위에서 받았던 내용보다는 가독성이 높아진걸 볼 수 있습니다. 위와 같이 본인이 원하는 지표나 값을 변수에 값을 넣고 slack message에 추가하여 slack으로 받아 볼 수 있습니다.

 

질문 사항이나 제가 전달한 내용이 잘못되었거나, 다른 부분이 있으면 댓글로 남겨 주시면 답변 드리도록 하겠습니다.

 

감사합니다.

 

*참고 페이지

- AWS CloudWatch, Slack 알람 발생(https://mementohaeri.github.io/aws/aws_cloudwatch_slack/)
- CloudWatch 이상 지표를 슬랙 알림으로 받기(feat.SNS, Lambda)(https://jojoldu.tistory.com/586)

728x90
반응형