## AWS Lambda와 AWS CloudWatch 이용해서 AWS RDS가 시작 또는 중지되었을 때, 슬랙으로 메시지 받기(How to receive slack message using AWS Lambda and AWS CloudWatch when AWS RDS is started or stopped)
AWS Lambda와 CloudWatchAWS 이용해서 AWS RDS가 시작 또는 중지되었을 때, 슬랙으로 메시지 받는 방법을 소개하려고 합니다. ~~(AWS RDS는 비싸니깐요?)~~ 여기서 가장 중요한 부분은 **AWS CloudWatch 이벤트 생성 규칙**입니다. 따라서 가장 마지막에 적겠습니다. ~~(왜..?)~~
순서는 다음과 같습니다.
1. Slack 설정
2. AWS Lambda 설정
3. AWS CloudWatch 설정
### 1. Slack 설정
slack에 들어가 Apps 옆에 있는 **+** 버튼을 클릭합니다.
그 다음 검색창에 **incoming-webhook** 을 검색해 들어간 후 **Add**를 누르고, 새 창이 열리면 **Add to slack** 이라는 버튼을 클릭합니다.
그 다음 메시지를 받기 원하는 채널을 선택한 후 **Add Incoming WebHooks integration** 버튼을 선택하면 끝납니다. 새 페이지에서 **Webhook URL**에 적혀져 있는 링크만 복사해서 보관하고 있으면 끝. 혹시 메시지 알려주는 봇? 의 이름을 바꿔주고 싶다면 조금 더 아래로 내려가서 **Customize Name**을 바꿔주면 됩니다. 그 아래 **Icon** 도 바꾸실 수 있습니다.
### 2. AWS Lambda 설정
AWS Lambda 에 가서 **함수 생성** 버튼을 클릭하고 **함수 이름**을 적은 뒤 함수를 생성합니다. 저의 경우 **런타임**(사용할 프로그래밍 언어)은 **Python 2.7**로 했습니다. 생성한 뒤 **함수 코드**는 아래와 같이 작성합니다. `'YOUR SLACK URL'` 자리에 Slack 설정 시 확인했던 **Webhook URL** 을 복사해서 붙여넣어주면 됩니다.
```
# -*- coding: utf-8 -*-
import json, random
import httplib
from botocore.vendored import requests
def lambda_handler(event, context):
slack_url = 'YOUR SLACK URL' #https://hooks.slack.com/services/XXXXXX
payloads = {
"attachments":[{
"pretext": "AWS RDS 관리 봇",
"color":"#0099A6",
"fields": [{
"title": "RDS 아래와 같이 상태가 변경되었습니다.",
"value": json.dumps(event["detail"]["Message"]), #RDS event 정보(Message)
"short": False
}]
}]
}
response = requests.post(
slack_url, data=json.dumps(payloads),
headers={'Content-Type': 'application/json'}
)
if response.status_code != 200:
raise ValueError(
'Request to slack returned an error %s, the response is:\n%s'
% (response.status_code, response.text)
)
```
### 3. AWS CloudWatch 설정
이제 AWS CloudWatch 로 가서 왼쪽 메뉴에서 **이벤트의 규칙**에 들어갑니다. 그 다음 **규칙 생성**을 누르고 **이벤트 패턴**을 선택하고 그 바로 아래 **서비스별 이벤트**와 **일치시킬 이벤트 패턴 작성**을 클릭해서 **사용자 지정 이벤트 패턴 작성**으로 변경합니다. 그리고 아래와 같이 입력합니다.
#### RDS Cluster가 중지됐을 때
```
{
"source": [
"aws.rds"
],
"detail-type": [
"RDS DB Cluster Event"
],
"detail": {
"EventID": [
"RDS-EVENT-0150"
],
"EventCategories": [
"notification"
],
"SourceType": [
"CLUSTER"
],
"SourceArn": [
"arn:aws:rds:ap-northeast-2:xxxxxxxxxxx" # 해당 RDS cluster 의 arn
],
"SourceIdentifier": [
"xxxxxxxx" # 해당 RDS cluster 의 DB 식별자
]
}
}
```
#### RDS Cluster가 시작됐을 때
```
{
"source": [
"aws.rds"
],
"detail-type": [
"RDS DB Cluster Event"
],
"detail": {
"EventID": [
"RDS-EVENT-0151"
],
"EventCategories": [
"notification"
],
"SourceType": [
"CLUSTER"
],
"SourceArn": [
"arn:aws:rds:ap-northeast-2:xxxxxxxxxxx" # 해당 RDS cluster 의 arn
],
"SourceIdentifier": [
"xxxxxxxx" # 해당 RDS cluster 의 DB 식별자
]
}
}
```
그 다음, 대상은 위에서 만든 **AWS Lambda** 를 **선택**해주고, 의미 있는 이름을 적은 뒤 규칙 생성을 완료합니다. 혹시 **ARN**과 **DB 식별자**가 어딨는지 궁금하신 분들은 RDS에 들어가보면 DB 식별자를 확인하실 수 있고, ARN의 경우 해당 클러스터를 선택한 후 아래 탭에서 구성을 누르면 ARN을 확인하실 수 있습니다. 이제 RDS Cluster를 중지하거나 시작하면 Lambda가 실행되면서 slack 메시지가 올것입니다.
### 추가(RDS Instance가 시작됐을 때, 중지됐을 때 규칙)
AWS Instance 에 관해 CloudWatch 규칙이 궁금하신 분들은 아래를 참고해주세요. [해당 페이지](https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/USER_Events.html)에서 더 자세히 확인하실 수 있습니다.
#### RDS Instance가 중지됐을 때
```
{
"source": [
"aws.rds"
],
"detail-type": [
"RDS DB Instance Event"
],
"detail": {
"EventID": [
"RDS-EVENT-0087"
],
"EventCategories": [
"notification"
],
"SourceType": [
"DB_INSTANCE"
],
"SourceArn": [
"arn:aws:rds:ap-northeast-2:xxxxxxxxxxx" # 해당 RDS instance 의 arn
],
"SourceIdentifier": [
"xxxxxxxx" # 해당 RDS instance 의 DB 식별자
]
}
}
```
#### RDS Instance가 시작됐을 때
```
{
"source": [
"aws.rds"
],
"detail-type": [
"RDS DB Instance Event"
],
"detail": {
"EventID": [
"RDS-EVENT-0088"
],
"EventCategories": [
"notification"
],
"SourceType": [
"DB_INSTANCE"
],
"SourceArn": [
"arn:aws:rds:ap-northeast-2:xxxxxxxxxxx" # 해당 RDS instance 의 arn
],
"SourceIdentifier": [
"xxxxxxxx" # 해당 RDS instance 의 DB 식별자
]
}
}
```
##### 참고
https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/USER_Events.html
https://medium.com/mathpresso/aws-lambda%EB%A1%9C-slack-message-bot-%EB%A7%8C%EB%93%A4%EA%B8%B0-69e1a069c19b
댓글
댓글 쓰기