상세 컨텐츠

본문 제목

EC2 상태 변경 알람 Slack으로 받아보기

☁️ AWS

by chnh 2023. 6. 1. 11:14

본문

반응형

들어가며

이 글에서는 이전 포스팅에서 설명했던 EC2 상태 변경 알람을 Slack으로 받아보는 방법에 대해 다룬다. EC2 상태 변경 알람은 이벤트 패턴이 규정되어 있어서 따로 SNS 구독이나 CloudWatch 경보를 생성할 필요가 없다. 나는 개인용으로 사용할 거라 따로 Slack 앱을 생성하지 않고 Incoming Webhook을 사용할 예정이다.

이 과정을 수행하고 나면 EC2 상태가 변경됐을 때 다음과 같은 알람을 받게된다.

 

가트몬 이미지는 slack webhook icon을 변경했다.

 

작동 방식을 간단히 그림으로 표현하면 다음과 같다.

구성 방법

1. Slack Webhook 생성

  1. Slack App directory에서 Incoming Webhook을 검색한다. Add to channel을 선택하고 알람을 수신받을 채널을 선택한다. 나는 개인적으로 받아볼거라 내 채널을 선택했다.
  1. 채널 선택 후 Add incoming WebHooks integration 버튼을 클릭하면 다음과 같은 화면이 표시된다. 스크롤을 다운하면 Webhook URL을 복사할 수 있다. Webhook URL을 다음 단계에서 Lambda의 환경변수로 설정해준다.
  2. 여기서 이름과 아이콘도 설정이 가능하다. 여기서 설정한 아이콘은 나중에 Slack 알람의 프로필 사진이 된다.

 

2. Lambda 함수 Deploy

  1. Lambda 콘솔에서 함수 생성을 선택한다.
  2. 코드 소스를 입력하는 부분에 다음 함수를 붙여넣고 Deploy를 클릭한다. 이 함수는 github에서 계속 업데이트 될 예정이다.
# Slack Webhook으로 CloudWatch Event를 전송하는 함수 

from datetime import datetime, timedelta, timezone
import os
import urllib3
import json

# KST 시간대 정의 (UTC +9)
KST = timezone(timedelta(hours=9))

# Slack에 메시지를 전송하는 함수
def send_to_slack(webhook_url, msg):
    http = urllib3.PoolManager()
    encoded_msg = json.dumps(msg).encode('utf-8')
    resp = http.request('POST', webhook_url, body=encoded_msg)
    return resp

# Lambda 함수 핸들러
def lambda_handler(event, context):
    # 환경변수'SLACK_WEBHOOK_URL'에서 Slack Webhook URL 추출
    url = os.environ['SLACK_WEBHOOK_URL']     
    username = '[CloudWatch Alarm]' 
    pretext  = f'🔔 [Event] {event["detail-type"]}'
    account = event['account']

    # 이벤트 시간을 KST로 변환하고, 문자열로 변환
    time = datetime.fromisoformat(event['time'].replace('Z', '+00:00')).astimezone(KST)
    formatted_time = time.strftime('%Y-%m-%d %H:%M:%S KST')  # 'KST' added

    region = event['region']
    detail = event['detail']

    # 메시지 텍스트 작성
    senText  =  f'Account : {account}\nTime : {formatted_time}\nRegion : {region}\nDetail : {detail}'  # Changed {time} to {formatted_time}
    msg = {
        "username": username,
        "pretext": pretext,
        "text": senText,
        "icon_emoji": ""
    }

    # Slack에 메시지 전송    
    resp = send_to_slack(url, msg)

    # 응답 상태 및 본문 출력
    print({
        "status_code": resp.status, 
        "response": resp.data.decode('utf-8')
    })

    return {
        'statusCode': resp.status,
        'body': resp.data.decode('utf-8')
    }

 

3. 환경 변수에 Webhook 입력

코드에 직접 Webhook을 입력하지 않도록하기 위해 환경변수를 사용하도록 구성했다.

  1. 구성 탭 > 환경 변수 > 환경 변수 편집을 선택한다.
  2. 키를 SLACK_WEBHOOK_URL 로 입력한다.
  3. 1단계에서 복사해둔 Webhook을 값으로 입력한다.

 

4. Lambda 트리거 추가

  1. 함수 개요 부분에 있는 +트리거 추가 를 선택한다.
  2. 트리거 구성에서 EventBridge를 선택하고 다음과 같이 설정한다.
    규칙 유형: 이벤트 패턴
    EC2 / EC2 인스턴스 상태 변경 알림
  3. 저장하면 함수 개요 탭에서 트리거가 생성된 것을 확인할 수 있다.
  4. 이후 EC2를 시작하거나 중지해보면 Slack 알람이 수신된다.

 

마치며

SNS 구독 설정 단계를 추가하면 State change 외에 다양한 CloudWatch 경보를 받아볼 수 있다. Lambda 함수를 변형해서 Slack으로 도착하는 메시지 내용과 형태를 변경할 수 있고, Slack에서 제공하는 API를 사용하여 대화형으로도 구성할 수 있다. 

꼭 전파해야하는 이슈가 발생했을 때 공통 채널에 바로 게시할 수 있도록 설정해두면 의사소통 비용이 많이 줄어들 것으로 보인다. 다음에는 깃헙관련 내용으로 정리해봐야지. 

반응형

관련글 더보기

댓글 영역