반응형
 
 
[AWS 서비스 모니터링 및 알림을 위한 Slack 연결 방법]
 
AWS 서비스를 사용하여 개발된 어플리케이션 서비스를 모니터링하기 위해 Slack을 연결 하는 방법입니다.  미리 알고 계시면 좋은 것들은 다음과 같습니다. 먼저, AWS 서비스 들에 대한 이름, 사용목적 등에 대한 이해가 있으면 좋습니다. 그리고 슬랙은 쉽게 말하면 카톡과 같이 메시지를 보내는 별도의 서비스입니다. 이것을 이미 사용해보셨으면 더 좋고요. 그리고 간단한 파이썬개발 지식과 도커에 대한 기본 지식을 알고있으면 글의 내용을 이해하기가 더 좋습니다.
 

0. 배경 및 목적

일반적으로 어플리케이션 서비스나 기능을 배포하기 전에 단위/통합 테스트 등을 통해 개발 내용이 잘 동작하는 지를 확인하고 배포합니다. 그리고 배포한 이후에도 해당 동작이 잘동작하고 있는지 안되고 있는지에 대한 모니터링이 필요합니다. 물론 AWS의 CloudWatch를 사용하여 웹 콘솔화면에서 동작 결과를 로그로 조회하거나, AmazonSNS 같은 서비스를 통해서 결과 내용을 메일로 받아 볼 수 있게 구현할 수도 있습니다. 하지만 모니터링 목적에 따라 지표를 만들어서 알림을 설정할 필요가 있기도 하고(CW에서도 가능) 보다 복잡한 조건에 해당하는 경우를 판단해서 알림을 받고 싶은 경우가 있습니다. 예를 들면 로그 중에서 특정 서비스 요청 메시지가 미리정한 횟수보다 많아지거나 또는 특정 서비스 이용 패턴이 발견되거나, 또는 두가지 상황 모두가 발생했을 경우 등의, 조금은 복잡한 논리적 판단이 필요한 경우가 되겠습니다. 이런 경우에는 단순히 CloudWatch 를 이용하기 어려운 경우가 있습니다. 이처럼 상대적으로 복잡한 판단이나 로그 내용을 검토해서 알림 여부를 결정해야 한다면 프로그래밍 적인 처리가 필요합니다. 이럴때 우리는 CloudWatch Logs Group에 Labmda 구독 필터를 만들어서 이러한 로직 처리를 개발 할 수 있습니다. 그리고 이 람다에서 Slack Webhook를 연결하면 로그 또는 처리 내용을 메시지로 받을 수 있습니다.
 

1. 목표

이번 포스팅에서는 위에서 제시한 것 처럼 어플리케이션의 모니터링 및 알림을 위해 AWS 서비스를 이용한 어플리케이션과 Slack 알림을 구성하는 것이 목표입니다. 먼저 간단한 어플리케이션을 실행하기 위해 EC2, AWS CloudWatch, AWS Lambda를 이용하여 구성하고, Slack을 연결하여 어플리케이션에서 나온 정보를 슬랙 메시지로 받을 수 있도록 구성 합니다. 전체적인 서비스 구성은 아래 그림과 같으며, 이를 위해서 다음과 같은 순서와 단계로 진행합니다.
 
서비스 구성도
 
ECR : Amazon ECR은 어디서나 애플리케이션 이미지 및 아티팩트를 안정적으로 배포할 수 있도록 뛰어난 성능 호스팅을 제공하는 완전관리형 컨테이너 레지스트리입니다. 간단히 말씀 드리면 도커 이미지 저장소 입니다.
Lambda : AWS Lambda는 서버를 프로비저닝 또는 관리하지 않고도 실제로 모든 유형의 애플리케이션 또는 백엔드 서비스에 대한 코드를 실행할 수 있는 이벤트 중심의 서버리스 컴퓨팅 서비스입니다. 서버 인스턴스를 만들어주는 EC2 서비스와 달리 별도의 서버를 지정하지 않아도 알아서 만들어주는 서비스 입니다.
CloudWatch : Amazon CloudWatch는 실시간 로그, 지표 및 이벤트 데이터를 자동화된 대시보드에 수집하고 이를 시각화하여 인프라 및 애플리케이션 유지 관리를 간소화합니다.
 

 

 
이후, 전체적인 이 글의 진행 순서에 대한 설명은 아래와 같습니다.
 
1. 어플리케이션 프로그램을 만들고 도커 이미지로 만들어서 ECR에 등록합니다.  
2. hello-world 이미지를 가져와서 실행할 어플리케이션 실행 람다 함수 생성하고 CloudWatch 로그가 생성되는지 확인합니다.
3. 쉽게 말하면 프로그램을 통해서 슬랙에 메시지를 보낼 수 있도록 코딩하기위해 필요한 주소정보(URL) 즉, 슬랙 웹훅 생성을 합니다.
4. 슬랙 메시지를 보낼 슬랙 발송 람다 생성
5. CloudWatch Log 필터 설정: 특정 로그가 들어오면 람다를 실행 시키도록 연결
6. 테스트 : 어플리케이션 실행 람다 함수 테스트 -> 로그 테스트
 
 
 

목차

1. ECR에 등록
2. 어플리케이션 실행 람다 함수 생성
3. 슬랙 웹훅 생성
4. 슬랙 발송 람다 생성
5. CloudWatch Log 필터 설정
6. 테스트
 
 
 
 

 

 
 

1. ECR에 등록

2. 어플리케이션 실행 람다 함수 생성
3. 슬랙 웹훅 생성
4. 슬랙 발송 람다 생성
5. CloudWatch Log 필터 설정
6. 테스트
 
 
먼저, 개발된 어플리케이션을 도커 이미지로 만들어서 ECR에 등록하는 것이 필요합니다. 이렇게 등록해 놓아야 나중에 람다에서 이 것을 가져다가 실행할 수 있습니다. 이 글의 주된 목적이 어플리케이션 개발이 아니므로 개발 내용을 깊이 다루지는 않겠습니다.

(간단한 코딩이 가능하신 분들은 Hello, World 를 프린트하는 간단한 어플리케이션 프로그램을 만들어서 도커 이미지로 빌드하셔도 됩니다. 실제로 저도 이번 연결에서는 Hello, World를 출력하는 어플리케이션과 이미지를 만들어 사용했지만 아래 내용은 (간단한 ECR 등록 방법을 설명하기 위해서) 도커 허브에 올라가 있는 이미지를 다운받아서 ECR에 등록하는 내용을 설명합니다.)

이미 만들어진 이미지를 확보하기 위해 아래의 명령으로 도커 허브에서 hello-world 이미지를 다운 받습니다. (당연히 도커가 설치되어있어야 합니다. docker를 입력해서 동작하지 않으면 도커 설치 후 진행해 주세요)
$ docker pull hello-world
이 이미지는 이미지가 실행될때 간단한 설명을 출력하는 어플리케이션 입니다. 상세 정보는 다음 주소를 참고하세요. https://hub.docker.com/_/hello-world
 

 

 
다운 받은 이미지를 ECR에 등록 합니다. 
ECR 사용을 위해 aws cli 명령어를 이용하여 ecr 에 로그인 합니다.
aws ecr get-login-password --region regionID | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.regionID.amazonaws.com
 
 
이미지의 tag를 수정해줍니다.
$ docker tag hello-world:latest username.dkr.ecr.us-east-1.amazonaws.com/hello-world
 

 

수정된 tag를 이용하여 이미지를 ecr에 등록/푸시 합니다.
$ docker push username.dkr.ecr.us-east-1.amazonaws.com/hello-world
Using default tag: latest

 

 
그러면 아래와 같이 ecr 관리 콘솔에서 생성된 리포지토리를 확인할 수 있습니다.  자세한 ECR 사용 상세 방법은 이전 포스팅을 참고하세요.https://bigdatamaster.tistory.com/120
 
 
 
 
 
1. ECR에 등록

2. 어플리케이션 실행 람다 함수 생성

3. 슬랙 웹훅 생성
4. 슬랙 발송 람다 생성
5. CloudWatch Log 필터 설정
6. 테스트
 
AWS Lambda 서비스 화면에서 함수생성 버튼을 클릭합니다.
 
 
 
 
 
 
우리는 ecr의 이미지를 이용할 것이기 때문에 제일 오른쪽에 있는 컨테이너 이미지를 선택합니다. 적당한 함수이름을 넣고, 이미지 찾아보기 버튼을 이용하여 1번에서 등록한 이미지를 선택하고 함수 생성을 클릭합니다.
 
 
 
함수 생성이 완료되면 아래와 같은 이미지가 나옵니다. 여기에서 잘 동작하는지 테스트하기 위해서 테스트 탭을 클릭합니다.
 
 
 
새 이벤트 생성을 선택 하고 적당한 이벤트 이름을 입력하고 테스트 버튼을 클릭 합니다.
 
 
 
테스트 실행후 로그 보기 연결 버튼을 클릭하거나, CloudWatch 서비스 화면으로 이동후 로그 그룹 중 /aws/labmda/lambda-name 으로 생성된 로그 그룹을 선택하고, 로그 스트림 탭에서 최근 로그 스트림을 클릭하면 어플리케이션 람다 실행중에 나온 로그 정보를 확인할 수 잇습니다. 
아래 보이는 로그는 hello-world 이미지 실행으로 인한 로그가 아니고 Hello, World를 1초마다 프린트하는 어플리케이션을 이미지로 만들어 놓은 것을 실행 시킨 결과 입니다. Hello, World를 1초 마다 프린트하는 어플리케이션을 이미지로 만드는 방법은 다음의 글을 참고해주세요.https://faun.pub/hello-world-in-docker-using-python-9b3eb418fb15

 

 
 
 
1. ECR에 등록
2. 어플리케이션 실행 람다 함수 생성
3. 슬랙 웹훅 생성
4. 슬랙 발송 람다 생성
5. CloudWatch Log 필터 설정
6. 테스트
 

 

 
1번과 2번에서 ECR에 이미지도 만들었고 이를 활용해서 어플리케이션을 실행시키는 람다함수도 만들었고 실행했을때 로그가 출력 되는 것도 확인하였습니다.
이제 슬랙에 메시지를 보내기 위해서 슬랙 웹훅을 만드는 방법에 대해서 알아보겠습니다.
 
슬랙에서 웹훅을 만들려면    
가. 먼저 슬랙 앱을 만들고.
나. 앱을 워크스페이스에 연결해주어야 합니다.
다. 그리고 생성된 url로 테스트 하면 됩니다.
 
 

가. 슬랙 앱 생성

api.slack.com에 접속 후 로그인 합니다.  중앙 왼쪽에 보이는 Create an app 버튼을 클릭 합니다.
 
 
 
 
그러면 아래와 같은 내용이 팝업 됩니다. (Creat New App을 누르면 나오는 동일한 내용입니다.)  여기서  from scratch를 선택합니다.
 
 
 
아래의 화면과 같이 뜨면 앱이름과 앱이 사용할 워크스페이스를 선택해줍니다.
 
 
 
 
 
 
Create App을 클릭하면 아래와 같은 화면이 뜹니다. 여기서 Incoming Webhooks 를 클릭합니다.
 
 
 

나. 앱을 워크 스페이스에 연결

이전 작업까지해서 슬랙 앱 생성이 완료되었습니다. 이제부터 앱과 워크 스페이스 채널을 연결합니다.
오른쪽 위에 off 를 클릭하여 On으로 바꾸어 줍니다. 그러면 아래와 같이 정보가 표시됩니다.  이제부터 앱과 워크스페이스를 연결해주는 작업을 합니다. 제일 아래의 Add New Webhook to Workspace를 클릭합니다.
 
 
 
 
 
그러면 아래와 같은 화면이 나옵니다. 아래의 Search for channel 리스트 박스를 클릭하여 연결가능한 채널을 선택하고 Allow를 클릭 합니다.
 
 
 
그러면 아까 페이지와 유사한 페이지가 다시 나타납니다. 다만 이페이지에는 이전 페이지와 달리 아래쪽에 추가된 Webhook URL 정보가 추가된 것을 볼 수 있습니다.  Sample 로 나와있는 내용중 Copy버튼을 클릭하여 Sample 명령어를 클립보드에 복사합니다.
 
 
 

다. 웹 훅 URL 테스트

복사한 (URL을 포함한 명령어) 내용을 (윈도우에서는) cmd 창이나 (맥에서는) 터미널을 열어서 붙여 넣은 후 엔터를 입력합니다.
 
 
그러면 슬랙을 통해 아래와 같이 새로 작성된 메시지를 볼 수 있습니다.
 
 
연결에 문제가 없음을 확인 했으므로 해당 Webhook URL을 이용하여 프로그램에서 호출할 수 있도록 코팅을 할 수 있습니다.
 
지금까지 슬랙 웹훅 연결을 위해서 슬랙 앱 생성, 워크스페이스 연결, 그리고 태스트를 진행해보았습니다.
 
 
 
 
 
 
 
1. ECR에 등록
2. 어플리케이션 실행 람다 함수 생성
3. 슬랙 웹훅 생성
4. 슬랙 발송 람다 생성
5. CloudWatch Log 필터 설정
6. 테스트
 
AWS Lambda 서비스에서 함수 생성을 클릭 하고 아래와 같이 새로 작성을 선택합니다. 적당한 함수이름을 입력하고 실행 런타임을 선택 합니다. 
 
함수가 생성되면 아래와 같은 화면이 보입니다.
 
위 화면의 lambda function 탭의 코딩 내용을 작성 합니다. 내용은 바로 슬랙 웹훅 URL을 호출하는 간단한 스크립트이며 아래와 같습니다.
 
 
 
 
환경변수에 채널과 웹훅 주소를 설정해 줍니다. 이를 위해서 람다에서 구성 탭을 선택후 '환경 변수’를 선택하고 편집 버튼을 클릭합니다.
 
 
키와 키에 해당하는 값을 입력하고 저장 버튼을 누릅니다.
 
슬랙 발송 람다를 통해 슬랙 알림이 잘가는지 테스트 해 봅니다.
테스트 버튼의 아래로 삼각형 모양을 클릭하여 테스트에 필요한 설정을 해줍니다.
 
 
적당한 이름을 주고 저장 버튼을 클릭합니다.
 
 
저장후 테스트 버튼을 클릭하여 테스트 이벤트를 실행합니다. 문제 없이 진행되었다면 해당 슬랙 채널에 메시지가 전송되고 람다 관리콘솔에서는 아래과 같이 성공 메시지를 볼 수 있습니다.
 
 
 
 
 
1. ECR에 등록
2. 어플리케이션 실행 람다 함수 생성
3. 슬랙 웹훅 생성
4. 슬랙 발송 람다 생성
5. CloudWatch Log 필터 설정
6. 테스트

 

 
 
CloudWatch 서비스로 이동합니다. 그리고 로그 그룹에서 어플리케이션 람다 동작시 로그 스트림이 생성되는 CloudWatch 로그 그룹을 찾습니다.
해당 로그 그룹을 선택하고 오른쪽 아래에 있는 생성 버튼을 클릭하면 아래와 같이 리스트가 나오며 리스트중에서 Lambda 구독 필터 생성을 클릭 합니다.
 
 
연결할 Lambda 함수를 선택해주고 적당한 구독필터패턴과 이름을 정해 줍니다. 아래는 "START RequestId"와 정확하게 일치하는 경우에 필터링되게 하기위한 방법입니다. (더 많은 구독 필터 패턴을 설정하는 방법은 아래의 주소를 참고해 주세요)  테스트할 로그를 선택하고 패턴 테스트 버튼을 클릭하면 실제로 필터링되는 로그가 어떤 것이 있는지 확인할 수 있습니다.
 
 
 
 
테스트 결과 아래처럼 하나의 로그가 걸러졌네요, 이처럼 정상적으로 필터링된다면 스트리밍 시작 버튼을 클릭하여 이후 로그의 패턴 검사를 시작합니다.
 
 
 
 
 
 
 
 
 
1. ECR에 등록
2. 어플리케이션 실행 람다 함수 생성
3. 슬랙 웹훅 생성
4. 슬랙 발송 람다 생성
5. CloudWatch Log 필터 설정
6. 테스트
 
 
 
이제 마지막으로 모든 연결이 잘 되었는지 확인을 위해 테스트를 진행합니다.  람다 서비스화면으로 이동 후 어플리케이션 람다인  hello-world-lambda 를 선택합니다. 아래와 같이 적당한 이름을 입력하고 테스트 버튼을 클릭하면 앞에서 테스트했던 슬랙 채널에 새로운 알림 메시지가 도착한 것을 확인 할 수 있습니다.
 
 
 
 
이렇게 해서 모든 구성을 완료하였습니다. CloudWatch 로그에 다양한 '구독 로그 필터' 적용을 통해 언제 슬랙 메시지 발송이 필요한지를 정의 할 수있습니다. 또한 슬랙 발송 람다에서 로그 내용을 파악해서 발송 여부를 결정할 수 도 있습니다. 이러한 방법을 통해 원하는 알림 메시지를 보낼 수 있습니다. 또한 관련 정보나 연결이 필요한 페이지 링크 등을 알림 메시지에 포함하면 더 상세한 내용을 알수도 있고 빠르게 조치도 할 수 있습니다.
 
진행이 안되는 목차 번호와 내용을 댓글로 남겨주세요.
잘못된 내용이나 궁금한 사항도요.
 
좋아요, 구독, 댓글, 감사합니다.
 

 

 
 
 
 
 
반응형

+ Recent posts