## AWS CloudWatch와 AWS Lambda를 활용해 AWS EC2 실행, 중지 될 때마다 Slack 메세지 받기(How to receive Slack message using AWS CloudWatch and AWS Lambda when AWS EC2 state is changed)
[이 글](https://ghkdgh2365.blogspot.com/2020/12/aws-lambda-aws-cloudwatch-aws-rds-how.html)을 쓴 김에 쓰는 글입니다.
AWS EC2 상태가 변경(실행 또는 중지 등)할 때마다 슬랙으로 메세지를 받는 방법에 대해서 작성합니다.
순서는 아래와 같습니다.
1. Slack 설정
2. AWS Lambda 설정
3. AWS CloudWatch 설정
### 1. Slack 설정
[해당 페이지](http://ghkdgh2365.blogspot.com/2020/12/aws-lambda-aws-cloudwatch-aws-rds-how.html) 1. Slack 설정과 같습니다.
### 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 = 'https://hooks.slack.com/services/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'
payloads = {
"attachments":[{
"pretext": "AWS EC2 관리 봇",
"color":"#0099A6",
"fields": [{
"title": "EC2 상태가 변경되었습니다.",
"value": json.dumps(event["detail"]["state"]), #EC2 state 정보
"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에 들어가 왼쪽 메뉴에 **이벤트 > 규칙**을 클릭하고 **이벤트 패턴**을 선택하고, **서비스 이름**엔 **EC2**, **이벤트 유형**은 **EC2 Instance State-change Notification**, 특정 상태만 원하면 **특정 상태**를 선택하시면 되고, 모든 상태를 선택하려면 **모든 상태**를 선택하면 됩니다. 인스턴스의 경우에도 모든 인스턴스를 원하면 **모든 인스턴스**를 선택하고, 특정 인스턴스만을 원하면 **특정 인스턴스**를 선택하고 해당 **인스턴스 ID**를 입력하면 됩니다.
대상은 위에서 설정한 Lambda를 선택해주고 의미있는 이름을 적고 규칙을 생성합니다. 이제 EC2의 상태가 변경될 때마다 Slack 메시지를 받을 수 있습니다.
참고로 특정 인스턴스들과 특정 상태를 선택한 경우에는 아래와 같이 규칙이 생성됩니다.
```
{
"source": [
"aws.ec2"
],
"detail-type": [
"EC2 Instance State-change Notification"
],
"detail": {
"state": [
"running",
"stopping",
"stopped"
],
"instance-id": [
"i-0XXXXXXXXX",
"i-0XxXXXXXXX"
]
}
}
```
댓글
댓글 쓰기