AWS Health Event 알림을 AWS EventBridge를 이용해 슬랙으로 보내기

AWS Health Event 메시지가 EventBridge를 통해 Slack 으로 전달되는 도식
AWS health event 예시

AWS 콘솔에 위와 같은 Health Event 알림이 오는데, Slack 채널로 보내보자

최대한 간단히 만들고 싶어서, 서버리스 서비스인 AWS EventBridge를 사용해봤다

Prerequisite

  • Slack Incoming webhook을 사용한다

AWS EventBridge

AWS EventBridge(이벤트브릿지)는 여러 애플리케이션을 연결하는 서버리스 서비스다. AWS 에서는 Serverless Event Router 라고 소개하고 있다.

사용 요금은 Ingestion / Delivery 요금이 있으며, 이벤트 백만개당 1$ 정도니 알림정도는 무료라고 봐도 된다

알림 추가는 아래 순서로 진행한다

(1) Connection 추가

Connection은 Endpoint 인증 관련 정보를 저장하는 곳이다

EventBridge - Create connection 위치

아래 정보를 참고해 생성한다

  • API type: Public 선택
  • Authorization type: API Key
    • Header name / Value는 적당히 dummy로 적는다
    • ex) Content-Type: application/json

좀 아쉬운 점이라면 EventBridge는 무조건 인증을 붙여야하는데, 슬랙 webhook처럼 인증이 필요 없는 경우라도 붙여야 해 더미값을 넣어야 한다. (참고 Q&A)

그리고 이는 AWS Secrets Manager에 추가되기 때문에 추가 요금이 나갈 수 있다. (한달에 0.4$ / 10000번 API 호출당 0.05$)

(2) API Destination 추가

Slack webhook endpoint를 추가한다

EventBridge - API destination 위치

아래 정보 참고해 추가한다

  • API destination endpoint: slack webhook url을 넣는다
    • ex) https://hooks.slack.com/services/aaaaaa/bbbbbb/cccccc
  • HTTP method: POST
  • Connection type: Use an existing connection - 아까 만들어둔 connection 선택

(3) Rules 추가

"AWS Health Event가 발생했을 때 -> 이벤트를 적당히 잘 바꿔서 .. json으로 변환하고 Slack webhook url에 POST 요청을 보낸다" 라는 로직을 작성하는 곳이다

EventBridge - Rule 편집 예시

아래 정보를 참고해 만든다. 왼쪽 탭에서 컴포넌트를 검색해서 드래그 앤 드랍 하면 된다.

  • Triggering Events: AWS Health Event
  • Targets: Input Transformation -> EventBridge API Destination
  • Input Transformation > Transformation method: Input transformer

Transform 섹션을 보면 4개의 박스가 있는데 맨 왼쪽 Sample event/Event payload와 맨 오른쪽 Output은 예시를 위한 데이터라서, 중간의 두 섹션 - Input path와 Template만 입력하면 된다

Input transformation 설정 예시

각각의 섹션은 아래처럼 입력한다

{
  "desc": "$.detail.eventDescription[0].latestDescription",
  "region": "$.region",
  "service": "$.detail.service",
  "status": "$.detail.statusCode"
}

Transform - Input path

{
  "text": ":warning: *AWS Health Alert*\n*Service:* <service>\n*Region:* <region>\n*Status:* <status>\n*Message:* <desc>"
}

Transform - Template

참고로 웹 UI상으로는 Output의 double quote(") 이스케이핑이 좀 이상하게 나오는데 무시하면 된다.

여기까지 하면 AWS 알림이 슬랙으로 잘 오게 된다

막상 보내보니, 슬랙 메시지가 매우 길어져서 조금 화면을 많이 차지하는 것 같은데.. 이건 어떻게 하는게 좋을지 좀 고민이 된다