brunch

You can make anything
by writing

C.S.Lewis

by 강진우 Oct 10. 2019

CloudWatch 이상 동작 탐지 기능 사용하기 #2

Amazon Web Service

지난 글에 이어 오늘은 CloudWatch 이상 동작 탐지 기능을 통해 발생한 알람을 SNSLambda를 이용해 슬랙으로 받아보는 과정에 대해서 살펴보겠습니다. 오늘 글의 내용은 SNSLambda를 이용해 슬랙으로 메시지를 전송하는 과정이기 때문에 꼭 CloudWatch 이상 동작 탐지가 아니라도 두루 사용할 수 있는 기능입니다.

시스템 구성도

SNS 토픽 만들기


먼저 CloudWatch가 알람을 넘길 SNS 토픽을 만들어 줍니다. Amazon SNS > Topics > Create topic에서 아래와 같이 만들어 줍니다.

SNS 토픽 만들기

SNS 토픽은 이름만 지정해서 생성하면 되기 때문에 매우 간단합니다.

물론 다양한 옵션이 있지만 이 글에서는 따로 다루지 않겠습니다.

이제 만들어진 토픽을 사용할 Lambda 함수를 생성해야 합니다.


Lambda 함수 만들기


앞에서 생성한 SNS 토픽을 Subscription 할 Lambda 함수를 만들어야 합니다. Lambda > Functions > Create function을 클릭해서 함수를 만들어 줍니다. SNS 토픽으로 들어온 데이터를 슬랙으로 발송하는 Lambda 함수는 직접 만들지 않아도 됩니다. AWS에서 제공하는 예제 Lambda 함수들 중에 해당 기능을 훌륭히 수행하는 함수가 이미 만들어져 있기 때문입니다. Use a blueprint를 클릭하고 Slack이라는 단어로 검색하면 아래와 같이 cloudwatch-alarm-to-slack-python이라는 함수가 검색됩니다. 이 함수를 체크하고 Configure 버튼을 클릭합니다.

Lambda Blueprint 화면

Configure 버튼을 클릭하면 아래와 같이 생성하고자 하는 함수의 정보를 입력하게 됩니다. Lambda 역시 IAM 설정이 매우 중요한데, 우리는 특별한 기능을 필요로 하지 않으니 우선은 Create a new role with basic Lambda permissions를 선택해서 기본 정책을 바탕으로 역할을 생성합니다. SNS Trigger의 토픽명은 우리가 위해서 생성한 cloudwatch-anomaly-detection-alarm으로 입력해 줍니다. 그리고 Enable trigger를 클릭해 줍니다.

Lambda 함수 설정

Enable trigger를 체크한 후 생성하게 되면 SNS 토픽을 Subcription 하기 위해 필요한 설정들을 자동으로 해줍니다.

다음으로 스크롤을 내려서 함수 생성에 사용되는 환경 변수 값들을 넣어 줍니다. 함수 코드를 조금 더 간단하게 수정해야 하지만 수정하기 위해서는 함수를 생성한 후에 가능하기 때문에 쓰레기 값을 넣어서 함수 생성만 먼저 진행합니다.

환경 변수 넣기

생성이 완료되면 아래와 같이 생성 완료 메시지와 SNS 토픽이 트리거로 걸린 모습을 볼 수 있습니다. 

Lambda 함수 생성 완료

그리고 SNS 콘솔에 들어가 보면 Subscription도 자동으로 생성되어 있는 것을 볼 수 있습니다.

SNS 토픽의 Subscription 설정

이제 거의 다 되었습니다. 아까 생성한 Lambda 함수의 코드를 약간 수정해 보겠습니다. KMS와의 연동 부분을 제거하고 슬랙 웹 훅 URL을 환경 변수에서 직접 입력할 수 있도록 수정하려고 합니다.

수정한 소스 코드

KMS에 암호화되어 저장된 HOOK_URL을 가져오는 로직에서 HOOK_URL을 환경 변수로 직접 설정해서 보내는 형태로 로직을 변경했습니다. 또한 슬랙 웹 훅 URL 중에는 채널을 명시하지 않아도 되는 웹 훅 URL이 있기 때문에 SLACK_CHANNEL이라는 환경 변수도 제거했습니다.

KMS 암호화 과정까지 설정하려면 Lambda의 IAM 정책도 수정해야 하기 때문에 이번 글에서는 간단하게 환경 변수로 설정하도록 수정했습니다.
환경 변수 수정

이제 마지막으로 잘되는지 테스트해 볼 차례입니다. Lambda는 테스트 이벤트를 생성해서 잘 동작하는지 확인할 수 있는 인터페이스를 제공합니다. 우측 상단에 Select a test event를 클릭하면 Configure test events 메뉴가 나타납니다. 해당 메뉴를 클릭한 후 Create new test event에서 아래와 같이 입력해 줍니다.

Lambda 테스트용 이벤트

CloudWatch에서 발송하는 Alarm과 동일한 형태의 테스트 이벤트 메시지입니다. 

해당 메시지의 전문은 https://github.com/blueimp/aws-lambda/blob/master/cloudwatch-alarm-to-slack/test-event.json 이곳에서 확인할 수 있습니다.

테스트 이벤트가 생성된 후 Test 버튼을 클릭하면 아래와 같이 테스트가 정상적으로 실행되었음을 보여 줍니다. 

테스트 성공 화면

그리고 슬랙 채널에 가보면 아래와 같이 메시지가 정상적으로 전달된 것을 볼 수 있습니다.

슬랙 메시지

이제 CloudWatch로부터 알람을 받아서 슬랙으로 전송하기 위한 모든 준비가 끝났습니다. 마지막으로 CloudWatch에서 알람을 위한 룰을 만들어 보겠습니다. CloudWatch > Alarms > Create alarm에 들어가서 어떤 메트릭으로 알람을 만들 것인지 선택합니다.

그리고 활성화 해 놓은 이상 동작 학습 메트릭을 선택해 줍니다.

CloudWatch 알람은 한 번에 하나의 메트릭만 설정 가능합니다.

그리고 아래와 같이 추가 설정 값들을 알맞은 값으로 설정합니다.

Statistic과 Period는 말 그대로 어떤 값을 기준으로 할 것인지 그리고 데이터의 수집 주기를 어느 정도로 할 것인지를 설정합니다. 

제일 중요한 건 Anomaly detection threshold인데 이 값이 커지면 커질수록 이상 동작을 탐지하기 위한 영역이 넓어집니다. 

그리고 가장 중요한 Notification 설정을 해 줍니다.

우리가 앞 서 만들었던 SNS 토픽명을 입력해 주면 모든 설정이 끝납니다.


마치며


지금까지 두 번에 걸친 글을 통해서 CloudWatch의 이상 동작 탐지 기능을 설정하고 알람을 받아볼 수 있는 SNS + Lambda 형태의 파이프라인을 구축해 보았습니다. 특히 이번 글에서 설정한 SNS + Lambda 파이프라인은 CloudWatch의 모든 알람에 설정 가능하기 때문에 한 번만 잘 만들어 놓으면 모니터링을 위한 파이프라인으로 재사용할 수 있습니다.

이 글이 많은 분들에게 도움이 되었으면 좋겠습니다. 긴 글 읽어 주셔서 감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari