[AWS] CloudWatch Alarms to Slack(로그 에러메세지 슬랙으로 알림)

SAM ?

AWS에서 서버리스 애플리케이션을 빌드하는 데 사용할 수 있는 오픈 소스 프레임워크입니다.
Lambda 함수, 이벤트 소스 및 기타 리소스의 조합.

굳이 힘들게 만들지 않아도 기본적인 앱들이 많다.

그중에 cloudwatch to slack 을 이용해서 해본다.

lambda -> 어플리케이션 -> 검색 serverlessrepo-cloudwatch-alarm-to-slack


slack incoming webhook

미리 생성


CloudWatch Alarms to Slack

흐름?
흐름도

그림상 CPU로 했지만 이번엔 특정 람다함수의 에러로그시 알람을 받아보기로함.

1. SAM을 이용해서 앱 생성
SAM

2. 생성된 리소스 확인해보자
리소스

SAM이 아니였다면 일일이 수작업을 해야한다.
SNS Topic, Role, Lambda function & permission & SNS연결

3. Lambda이벤트소스
이벤트 -> 슬랙 메세지 전송
이벤트 파라미터를 통해 채널별로 별도로 전송도 가능하겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function processEvent(event, callback) {
console.log("event");
const message = JSON.parse(event.Records[0].Sns.Message);

const alarmName = message.AlarmName; //event.Records[0].Sns.Message.AlarmName;
//var oldState = message.OldStateValue;
const newState = message.NewStateValue; //event.Records[0].Sns.Message.NewStateValue;
const reason = message.NewStateReason; //event.Records[0].Sns.Message.NewStateReason;

const slackMessage = {
channel: slackChannel,
text: `${alarmName} state is now ${newState}: ${reason}`
};


postMessage(slackMessage, (response) => {
if (response.statusCode < 400) {
console.info('Message posted successfully');
callback(null);
} else if (response.statusCode < 500) {
console.error(`Error posting message to Slack API: ${response.statusCode} - ${response.statusMessage}`);
callback(null); // Don't retry because the error is due to a problem with the request
} else {
// Let Lambda retry
callback(`Server error when processing message: ${response.statusCode} - ${response.statusMessage}`);
}
});
}

4. 앱 환경변수
환경변수

웹훅 url을 KMS로 암호화해서 넣어야한다.
알람을 받을 채널명을 입력한다.

5. KMS로 암호화
aws kms로 이동 후 kms 생성

작업PC에 aws-cli를 설치하고 sdk config를 설정한후 (key, secret, region )

암호화 명령어(웹훅 주소는 https://는 빼고한다.)

1
2
3
4
5
6
aws kms encrypt --key-id "alias/firstKey" --plaintext hooks.slack.com/services/T919NHKHQ/BRC2C9JTW/AWHkTB9tqxxxx
{
"CiphertextBlob": "AQICAHjZAWxDFIzL7Oag6zTm7iWRjsIxxxxxgEJyyQbbCYC6gzchcB1MLs6AAAApzCBpAYJKoZIhvcNAQcGoIGWMIGTAgEAMIGNBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDMlBSyOT7QHDEM8sLAIBEIBgFilgF7ONYEgiiiM4yxz+Iy8TkbzFlOiDoa79s4z................................+HWPErBuwGtje3bwfmoRCL1D24aosHuW8lekMJUqF0SqdlmGuxxxxx",
"KeyId": "arn:aws:kms:us-east-2:271382xxxxxx193:key/ab9a5099-01aa-46dc-b284-xxxxxx",
"EncryptionAlgorithm": "SYMMETRIC_DEFAULT"
}

6. CloudWatch Alert
경보생성

지표선택

지표선택오류시

조건설정

연결SNS 선택

알람 생성

7. 경보호출
소스수정

소스수정으로 hello function실행시 error로그가 발생하도록 수정

에러발생

8. 슬랙 채널 확인
슬랙