AWS/Monitoring

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

TTwY 2021. 8. 20. 09:57
728x90
반응형

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

https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html

 

Amazon CloudWatch 경보 사용 - Amazon CloudWatch

경보를 생성한 직후에 데이터 포인트가 누락되었으며 경보를 생성하기 전에 지표가 CloudWatch 에 보고된 경우, CloudWatch는 경보가 생성되기 전 가장 최근의 데이터 포인트를 검색해 경보를 평가합

docs.aws.amazon.com

 

이 기능은 모니터링에 큰 도움이 됩니다. 하지만 항상 AWS Console을 보면서 모니터링을 할 수 있는 환경이 쉽지 않으므로, 설정한 Alarm(경보)이 발생하였을 때,  AWS의 SNS, Lambda를 이용하여 Slack과 연동하여 Slack으로 Alarm(경보)를 받는 방법을 진행하겠습니다.

 

위와 같은 구성으로 구성을 해보도록 하겠습니다.

 

구성 진행 순서

1. Slack - Webhooks URL 생성
2. AWS SNS 토픽 만들기
3. AWS Lambda Function 만들기
4. Lambda Function Test
5. CloudWatch Alaram 설정
6. 테스트

 

1. Slack - Webhooks URL 생성

Slack에 Webhooks URL을 생성하기 위해서 Slack 채널에서 오른쪽 상단에 i 인포메이션 버튼을 클릭 > 더 보기 > 앱 추가를 선택합니다.

검색창에 WebHooks 라고 검색후 아래와 같이 Incoming WebHooks 설치 버튼을 클릭합니다.

설치 버튼을 클릭하면 아래와 같은 화면이 출력되며, Slack에 추가 버튼을 클릭합니다.

Slack 채널을 선택 후 수신 웹후크 통합 앱 추가 버튼을 클릭합니다.

버튼 클릭 후 넘어간 페이지에서 스크롤 중간쯤 웹 후크 URL을 복사 할 수 있는 부분이 있습니다. URL을 복사하여 따로 보관하거나, 해당 페이지를 닫지 않고 다음 작업으로 진행합니다.(해당 값은 추후 Lambda Funtion에 사용 예정)

 

2. AWS SNS 토픽 만들기

SNS 토픽 만들기

 

CloudWatch가 알림을 넘길 SNS topic을 만들어 줍니다. Amazon SNS>주제>주제 생성을 선택하여 만들어 줍니다.

이름(필수), 표시 이름(선택 사항)을 작성 후 나머지 값들은 디폴트로 두고 주제 생성을 클릭합니다.

 

3. AWS Lambda Function 만들기

앞에서 생성한 SNS 토픽을 Subscription 할 Lambda 함수를 만들어야 합니다. Lambda > 함수 > 함수 으로 이동합니다.

Lambda Code를 신규로 작성할 필요 없이 블루 프린터 > slack을 검색하여 cloudwatch-alarm-to-slack-python을 선택합니다.

구성을 클릭 후 함수 이름을 작성, 실행 역할을 기본 Lambda 권한을 가진 새 역할 생성을 클릭합니다.

SNS 트리거 탭에 가서 SNS 주제를 클릭하면, 이전에 생성했던 SNS 주제가 나타날 것이고, 그 주제를 클릭합니다.

함수 생성에 사용되는 환경 변수 값들을 넣어 주어야 합니다. 코드를 좀 더 편하게 수정하기 위해서 임시로 임의의 값을 넣어서 함수를 먼저 생성하도록 하겠습니다.

함수 생성을 클릭하면, 아래와 같이 SNS 트리거가 추가 된 함수가 생성됩니다.

SNS 주제 페이지에 가면 아무것도 없던 구독에 Lambda 함수가 자동으로 추가 된 것을 확인할 수 있습니다.

위에서 생성했던 블루 프린터 Lambda 함수의 코드를 수정을 조금 해야 합니다. 테스트고 빠르게 환경을 구성하기 위해 KMS 연동 부분은 제거했고, 환경 변수에 웹 훅 URL을 등록하여 활용하는 방향으로 코드를 수정하려 합니다.

import boto3
import json
import logging
import os

from base64 import b64decode
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError

HOOK_URL = os.environ['HOOK_URL']

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def lambda_handler(event, context):
    logger.info("Event: " + str(event))
    message = json.loads(event['Records'][0]['Sns']['Message'])
    logger.info("Message: " + str(message))

    alarm_name = message['AlarmName']
    #old_state = message['OldStateValue']
    new_state = message['NewStateValue']
    reason = message['NewStateReason']

    slack_message = {
        'text': "%s state is now %s: %s" % (alarm_name, new_state, reason)
    }

    req = Request(HOOK_URL, json.dumps(slack_message).encode('utf-8'))
    try:
        response = urlopen(req)
        response.read()
        logger.info("Message posted")
    except HTTPError as e:
        logger.error("Request failed: %d %s", e.code, e.reason)
    except URLError as e:
        logger.error("Server connection failed: %s", e.reason)

 

위에서 임시의 값으러 넣어준 환경 변수를 편집하도록 하겠습니다. HOOK_URL의 값에 위에서 복사하여 보관 한 웹 후크 URL을 넣어주도록 합니다. slackChannel은 위의 변경 코드에서는 사용하지 않지만 추후 사용하기 때문에 넣어서 진행하도록 하겠습니다.

 

4. Lambda Function Test

 

작성한 Lambda Code에 대한 테스트를 진행해보겠습니다. Lambda는 테스트 이벤트를 생성해서 잘 독장하는지 확인할 수 있는 인터페이를 제공합니다. 코드 소스의 Test 박스를 클릭 후 Configure test event를 클릭합니다.

새로운 테스트 이벤트 생성을 선택하고 이벤트 이름을 작성합니다.

테스트 코드는 CloudWatch에서 보내는 Alarm과 동일한 형태의 테스트 이벤트 메시지입니다.
전문은 https://github.com/blueimp/aws-lambda/blob/master/cloudwatch-alarm-to-slack/test-event.json 이곳에서 확인 가능합니다.

 

생성 버튼을 클릭 후 코드 소스의 상단의 Test 버튼을 다시 클릭하면 Test가 수행 되며 아래와 같은 결과를 보여줍니다.

Slack으로 가서 메시지가 발송되었는지 확인합니다.

위와 같이 Slack에 정상적으로 테스트 코드가 왔다면 테스트가 완료 됩니다.

CloudWatch로부터 알람을 받아서 슬랙으로 전송하기 위한 준비가 끝났습니다.

 

5. CloudWatch Alaram 설정

 

CloudWatch로부터 알람을 받기 위해서 CloudWatch 알람을 만들어 보겠습니다.

CloudWatch > 경보 > 경보 생성 을 클릭합니다.

 

테스트를 위해 만든 인스턴스의 CPUUtilization 지표로 아래와 같이 설정하도록 하겠습니다.

(통계 - 평균, 기간 - 1분)

빠른 알람을 받기 위해서 조건은 아래와 같이 지정해서 테스트 해보도록 하겠습니다.

(임계값 유형 - 정적, 임계값 > 50)

알림 설정을 해줍니다. 경보 상태로 클릭하고 기존 SNS 주제 선택하여 이전에 만들어둔 SNS를 선택합니다.

아래와 같이 이름과 설명을 추가합니다.

경보 생성이 완료 되었습니다.

 

6. 테스트

 

테스트로 만든 EC2 인스턴스의 CloudWatch 경보가 발생하여 Slack으로 메시지가 오는지 확인하기 위한 테스트를 진행하겠습니다.

테스트 EC2 인스턴스의 stress를 설치하여 CPU 사용 %를 높여 경보를 발생시키려고 합니다.

sudo amazon-linux-extras install epel -y
sudo yum install -y stress

위의 명령어를 이용하여 테스트 EC2 인스턴스의 stress를 설치합니다.

stress --cpu 1 --timeout 300    // 5분동안 cpu 100% 사용

위 명령어를 실행하여 경보를 발생시키도록 하겠습니다.

조금 시간이 지나면 아래와 같이 Slack에 메시지가 발생한 것을 확인 할 수 있습니다.

다음글에서는 Slack 메시지 포맷 수정, CloudWatch 그래프 받기 등을 해볼 예정입니다.

 

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

 

감사합니다.

 

*참고 페이지

- CloudWatch 이상 동작 탐기 기능 사용하기 #2(https://brunch.co.kr/@alden/56)

- AWS CloudWatch, Slack 알람 발생(https://mementohaeri.github.io/aws/aws_cloudwatch_slack/)

728x90
반응형