■ 최종 서비스 구현 : WAF에서 특정 이벤트 발생 시, Lambda를 통해 Slack으로 관련 데이터 전송 ■ 준비 과정 1. WEB Server ALB 설정 : [AWS][ALB] WEB SERVER ALB 구성 :: 하다 보면 늘어나는 업무 지식 (tistory.com) 2. WAF 설정 : [AWS][WAF] WEB SERVER WAF 설정 :: 하다 보면 늘어나는 업무 지식 (tistory.com) |
WEB Server ALB 설정을 하고, WAF 설정을 한 다음에
해당 로그를 Cloudwatch로 전송하여 최종적으로는 Slack으로 알람을 보내는 대장정의 끝이 보인다.
위 준비과정 1. 2. 에서 ALB 설정과 WAF 설정 하는 방법에 대해 학습해보았으며
이번에는 WAF 로그 → Cloudwatch → SNS → Slackd으로 연동하는 방법에 대해 알아보자!
AWS Cloudwatch 란?
AWS Docs에 의하면 AWS에서 발생하는 서비스 또는 Application을 실시간 모니터링하기 위한 서비스이다.
즉, 로그 기반의 모니터링 서비스이다. 모든 서비스로그를 확인할 수 없기에 특정 임계치 등을 설정하여
경보 상태를 정할 수 있고, 이를 통해 E-Mail 또는 Slack으로 특이사항이 발견되면 알람을 줄 수 있다.
인프라 운영 담당자 또는 보안관리자가 모든 로그를 확인할 수 없기에, 매우 유용한 기능이라고 생각한다.
AWS SNS(Simple Notification Service)란?
이름에서도 알 수 있듯이, SNS로 특정 메시지를 보내는 서비스이다.
일반적으로 E-Mail 또는 Lambda를 선택하여 특정 상황에 대해 경보를 보내주는 용도로 사용하며
이외에도 Kinesis, HTTP, SQS(??)등의 용도가 다양하다.
즉, 정리하자면 아래와 같은 형태로 Slack으로 알람을 전송한다.
작업 순서는 다음과 같다.
1. Slack Webhook Key 확보 2. AWS SNS 주제 설정 3. Slack 알람용 Lambda 테스트 및 설정 4 Cloudatch 경보알람 설정 5. 테스트!! - 실제 알람은 다음과 같은 순서로 진행된다. WAF → Cloudwatch로 데이터 전송 → Cloudwatch에서 경보알람 발생 → SNS 작업 호출 → Lambda 구독 호출 → Slack 알람 전송 |
1. Slack Webhook Key 확보
먼저 Slack에서 Alarm을 받고자하는 채널을 생성한다. 그 다음에 Webhook Key를 받으면 된다.
처음에는 Webhook을 어디서 검색하는지 몰랐는데.. Alarm을 받을 채널을 생성한 다음에 [앱]을 눌러보니 있었다ㅎㅎ
채널 Post, 설명 라벨, 이름은 자유롭게 지정하면 된다. 우리에게 중요한건 아래 웹후크 URL이다!! Key 확보 완료
2. AWS SNS 주제 설정
1.에서 Slack Webhook Key를 확보했다면, 이제 AWS SNS에서 해당 Key를 이용할 수 있도록 설정만 하면 된다.
AWS SNS는 주제와 구독의 개념으로 나눠진다. 주제라는 큰 틀은 하나 만든 다음에, 해당 주제에 맞는 구독이 있다.
즉, Cloudwatch_alarm이라는 주제에 E-Mail 전송하는 구독도 할 수 있고, Lambda를 호출하는 구독을 할 수 있다.
주제 = 구분자, 구독 = 실제 작업 내용으로 보면 될 것 같다.
3. Slack 알람용 Lambda 테스트 및 설정
가장 시간을 많이 들였던 부분이고, 아직까지도 잘 모르겠는 부분이다...
이론만 먼저 본다면, SNS에서 Lambda를 구독/호출할 함수를 지정하는 것이다.
SNS에서 Lambda 함수를 호출하여 실제 Slack으로 Alarm을 주는것이다
좋은 부분은 "블루포인트"라고 이미 어느정도 정의된 Lambda 함수를 그대로 쓸 수 있다.
그리고 cloudwatch-alarm-to-slack-python을 검색하면 slack으로 cloudwatch alarm을 보낼 수 있는 함수가 미리 정의되있다.
함수 이름은 본인의 원하는 이름을 지정하고, 중요한 부분은 SNS 트리거이다.
SNS 트리거를 선택하면, 위 2. 에서 설정할 SNS의 ARN을 선택할 수 있다. (2. 에서 생성한 SNS ARN 정보와 일치한다.)
Lambda 함수가 정상적으로 생성되었다면, 2.에서 생성한 AWS SNS을 선택하면 아래와 같이 구독이 생긴다.
그렇다면 이제 AWS SNS ↔ Lambda는 정상적으로 연결되었다는 뜻이고,
Lambda에서 Slack으로 보낼 TEST CODE만 생성하면 된다.
기본 CODE를 보면 HOOK_URL을 Encryption하는 부분이 있다. 하지만 TEST만 하는것이기에 삭제하였고
하단의 Slack_Message에서도 Lambda → Slack으로 Alarm이 잘 가는지만 테스트 하기에 수정하였다.
TEST CODE는 아래와 같다. 중요한건 주제/구독의 ARN 그리고 ID를 잘 맞추는 것이다!!
{ "Records": [ { "EventSource": "aws:sns", "EventVersion": "1.0", "EventSubscriptionArn": "SNS > 구독 > Lambda ARN", "Sns": { "Type": "Notification", "MessageId": "SNS > 구독 > ID", "TopicArn": "SNS > 주제 > ARN", "Subject": "ALARM: \"Example alarm name\" in EU - Ireland", "Message": "{\"AlarmName\":\"Example alarm name\",\"AlarmDescription\":\"Example alarm description.\",\"AWSAccountId\":\"000000000000\",\"NewStateValue\":\"ALARM\",\"NewStateReason\":\"Threshold Crossed: 1 datapoint (10.0) was greater than or equal to the threshold (1.0).\",\"StateChangeTime\":\"2017-01-12T16:30:42.236+0000\",\"Region\":\"EU - Ireland\",\"OldStateValue\":\"OK\",\"Trigger\":{\"MetricName\":\"DeliveryErrors\",\"Namespace\":\"ExampleNamespace\",\"Statistic\":\"SUM\",\"Unit\":null,\"Dimensions\":[],\"Period\":300,\"EvaluationPeriods\":1,\"ComparisonOperator\":\"GreaterThanOrEqualToThreshold\",\"Threshold\":1.0}}", "Timestamp": "2022-05-02T16:30:42.318Z" } } ] } |
그리고 Lambda TEST를 해보면 Slack에 아래와 같이 TEST Message가 전송된다.
2편에서는 Cloudwatch에서 경보알람을 만드는 것을 알아보겠다!!!
끄읏!
'기술 이모저모 > [AWS] Workshop' 카테고리의 다른 글
[AWS] VPC Peering VS TransitGateway (0) | 2022.06.06 |
---|---|
[AWS][SNS] Cloudwatch 경보 Slack 연동[2/2] (0) | 2022.05.06 |
[AWS][WAF] WEB SERVER WAF 설정 (0) | 2022.05.02 |
[AWS][ALB] WEB SERVER ALB 구성 (0) | 2022.04.25 |
[Secworkshop] DevSecOps: Integrating security into pipelines (0) | 2022.03.01 |