AWS 클라우드를 운영하는데 있어서 가장 중요한 요소는 모니터링을 시스템을 이용한 이벤트 관리다. AWS 클라우드에서는 다양한 이벤트가 발생하는 데, 중요한 이벤트들은 Slack으로 전송해야 한다.
여기에서는 Pub/Sub 서비스인 SNS와 Labmda를 이용해서 Slack으로 메시지를 전송하는 방법을 살펴볼 것이다.
아키텍처
아키텍처는 아래와 같다.
AWS sevice가 publisher가 되어서 이벤트를 SNS topic에 게시하면, Lambda 가 이를 읽어서 Slack에 전송하는 방식이다. 예를 들어 "S3 bucket에 있는 object가 삭제됐을 경우 Slacke 메시지로 전송" 할 수 있다.
Slack 설정
Slack은 각 채널별로 webhook url을 만들 수 있는데, 이 url을 이용해서 Slack에 메시지를 전송 할 수 있다.
Slack channel 생성
메시지를 받을 slack channel인 aws-test를 만들었다.
Webhook url 만들기
웹 브라우저로 https://api.slack.com/apps 에 접속해서 slack app을 생성할 수 있다. Create New App을 클릭하면 새로운 slack app을 만들 수 있다.
App Name을 입력하고, 이 app을 설치할 workspace를 선택하고 Create App을 클릭하면 Slack app이 만들어진다.
App이 만들어졋으니, App의 기능을 설정해야 한다. Webhook URL로 메시지를 수신하기로 했으니, Incoming Webhooks를 선택한다.
Activate Incomming Webhooks를 활성화(on)하고 Add New Webhook to Workspace를 클릭한다.
webhook 메시지를 받을 채널을 선택하고 Allow를 클릭한다.
드디어 webhook url이 만들어졌다. curl 명령으로 메시지가 잘 전달되는지 테스트 해보자.
$ curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/Txxxxxxxxxxxxxxxx/zzzzzzzzzzz
ok
아래와 같이 Slack 채널에 메시지가 전달되면 성공이다.
Lambda 코드 개발
이제 앞서 만든 "Webhooks URL"을 이용해서 Lambda 코드를 만들어야 한다.
AWS > Lambda 로 이동해서 Create function을 클릭한다. Lambda 함수를 만드는 3가지 방법이 있는데 Author from scratch 를 선택한다. Author from scratch는 미리 만들어진 템플릿 없이 처음부터 개발하는 거라고 보면 된다.
Function 이름을 설정하고 Runtime을 선택한다. Java, Go, .Net, Ruby, Python, Node.js 중 선택할 수 있다. 여기에서는 Python 3.11을 선택한다.
그러면 Lambda function의 정보를 확인 할 수 있다.
Add trigger: 우리가 만든 Lambda를 실행(trigger)하기 위한 이벤트 소스를 설정할 수 있다. 나중에 SNS를 trigger로 추가할 것이다.
가장 중요한 부분은 Lambda 코드를 만드는 것이다. AWS 관리자 콘솔에서 제공하는 에디터를 이용해서 웹 상에서 직접 코딩 / 테스트 / 배포를 할 수 있다.
아래는 webhook url로 slack alarm을 전송 하는 코드다.
import json
import os
import urllib.request
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
HOOK_URL ="https://hooks.slack.com/services/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"deflambda_handler(event, context):
send_data ={'text':"안녕하세요. Slack alarm 메시지 테스트 입니다.",}
send_text = json.dumps(send_data)
request = urllib.request.Request(
HOOK_URL,
data=send_text.encode('utf-8'),)with urllib.request.urlopen(request)as response:
slack_message = response.read()
Lambda code deploy 및 테스트
코드를 완성했으면 deploy로 코드를 배포한다. 코드가 배포되면 Test를 이용해서 코드를 테스트 할 수 있다.
Test 설정은 Event name으로 저장해서 필요 할 때 불러서 사용 할 수 있다. 실제 Lambda를 작성하는 경우 다양한 형태의 메시지를 다루게 되는데, Event JSON을 바꿔가면서 잘 처리하는지를 확인 할 수 있다. 여기에서는 하드코딩된 메시지를 전송하므로 Event JSON은 무시해도 된다. 이제 Test 버튼을 누르면 Lambda 함수가 실행이 된다.
코드를 잘 작성했다면, 슬랙으로 메시지가 전달될 것이다.
Lambda로 SNS 메시지를 전달하기
이제 SNS이용해서 Slack으로 메시지를 전달해보자. 구조는 아래와 같다.
SNS Topic 만들기
Create topic를 클릭한다.
Standard를 선택하고 Topic 이름을 만든다.
SNS topic를 Lambda trigger 로 등록
Lambda 페이지로 이동해서 Add trigger를 클릭한다.
구독할 SNS topic를 선택한다.
해당 SNS Topic이 Lambda와 연결된 것을 확인할 수 있다. 이제 SNS Topic에 이벤트가 게시(publish)되면 Lambda가 실행될 것이다.
SNS Lambda Trigger 테스트
SNS가 Lambda를 잘 실행하는지 테스트를 해보자. SNS 페이지로 이동하면 SNS Topic에 대한 정보를 확인 할 수 있다. joinc-dev-sns topic을 우리가 만든 Lambda가 구독하고 있는 것도 확인 할 수 있다. Publish message를 눌러서 SNS에 테스트 메시지를 게시할 수 있다.
subject와 메시지 내용(message body)를 만들고 "Publish message"을 누르면 된다. 우리가 만든 Lambda는 메시지가 하드 코딩 됐기 때문에, SNS 메시지 내용은 큰 의미는 없을 것이다.
Publish message 를 클릭하면 Slack에 새로운 메시지가 전달 될 것이다.
메시지 커스터마이징
지금은 메시지를 하드코딩 했는데, 실제 환경에서는 SNS의 메시지를 읽어서 처리를 해야 할 것이다. 그럴려면 SNS에서 전달되는 메시지 포맷을 알고 있어야 한다. 아래는 SNS의 메시지 포맷이다.
이렇게 해서 SNS -> Lambda -> Slack 으로 이어지는 Event 관리 패턴을 완성했다. 이 패턴은 AWS에서 발생하는 모든 이벤트들의 관리를 위한 가장 많이 사용하는 패턴 중 하나다.
현장에서는 Message 내용(AWS 서비스마다 Message 내용이 다르다.)에 따라서 Lambda 함수를 개발 것으로 대부분의 이벤트 관리 업무를 수행 할 수 있다.
이벤트를 Slack로 전송하기
AWS 클라우드를 운영하는데 있어서 가장 중요한 요소는 모니터링을 시스템을 이용한 이벤트 관리다. AWS 클라우드에서는 다양한 이벤트가 발생하는 데, 중요한 이벤트들은 Slack으로 전송해야 한다.
여기에서는 Pub/Sub 서비스인 SNS와 Labmda를 이용해서 Slack으로 메시지를 전송하는 방법을 살펴볼 것이다.
아키텍처
아키텍처는 아래와 같다.

AWS sevice가 publisher가 되어서 이벤트를 SNS topic에 게시하면, Lambda 가 이를 읽어서 Slack에 전송하는 방식이다. 예를 들어 "S3 bucket에 있는 object가 삭제됐을 경우 Slacke 메시지로 전송" 할 수 있다.
Slack 설정
Slack은 각 채널별로 webhook url을 만들 수 있는데, 이 url을 이용해서 Slack에 메시지를 전송 할 수 있다.

Slack channel 생성
메시지를 받을 slack channel인 aws-test를 만들었다.

Webhook url 만들기
웹 브라우저로 https://api.slack.com/apps 에 접속해서 slack app을 생성할 수 있다.

Create New App을 클릭하면 새로운 slack app을 만들 수 있다.
App Name을 입력하고, 이 app을 설치할 workspace를 선택하고 Create App을 클릭하면 Slack app이 만들어진다.
App이 만들어졋으니, App의 기능을 설정해야 한다. Webhook URL로 메시지를 수신하기로 했으니, Incoming Webhooks를 선택한다.
Activate Incomming Webhooks를 활성화(on)하고 Add New Webhook to Workspace를 클릭한다.
webhook 메시지를 받을 채널을 선택하고 Allow를 클릭한다.
드디어 webhook url이 만들어졌다. curl 명령으로 메시지가 잘 전달되는지 테스트 해보자.
아래와 같이 Slack 채널에 메시지가 전달되면 성공이다.

Lambda 코드 개발
이제 앞서 만든 "Webhooks URL"을 이용해서 Lambda 코드를 만들어야 한다.

AWS > Lambda 로 이동해서 Create function을 클릭한다. Lambda 함수를 만드는 3가지 방법이 있는데 Author from scratch 를 선택한다. Author from scratch는 미리 만들어진 템플릿 없이 처음부터 개발하는 거라고 보면 된다.
Function 이름을 설정하고 Runtime을 선택한다. Java, Go, .Net, Ruby, Python, Node.js 중 선택할 수 있다. 여기에서는 Python 3.11을 선택한다.
그러면 Lambda function의 정보를 확인 할 수 있다.
Add trigger: 우리가 만든 Lambda를 실행(trigger)하기 위한 이벤트 소스를 설정할 수 있다. 나중에 SNS를 trigger로 추가할 것이다.
가장 중요한 부분은 Lambda 코드를 만드는 것이다. AWS 관리자 콘솔에서 제공하는 에디터를 이용해서 웹 상에서 직접 코딩 / 테스트 / 배포를 할 수 있다.

아래는 webhook url로 slack alarm을 전송 하는 코드다.
Lambda code deploy 및 테스트
코드를 완성했으면 deploy로 코드를 배포한다. 코드가 배포되면 Test를 이용해서 코드를 테스트 할 수 있다.
Test 설정은 Event name으로 저장해서 필요 할 때 불러서 사용 할 수 있다. 실제 Lambda를 작성하는 경우 다양한 형태의 메시지를 다루게 되는데, Event JSON을 바꿔가면서 잘 처리하는지를 확인 할 수 있다. 여기에서는 하드코딩된 메시지를 전송하므로 Event JSON은 무시해도 된다. 이제 Test 버튼을 누르면 Lambda 함수가 실행이 된다.
코드를 잘 작성했다면, 슬랙으로 메시지가 전달될 것이다.

Lambda로 SNS 메시지를 전달하기
이제 SNS이용해서 Slack으로 메시지를 전달해보자. 구조는 아래와 같다.
SNS Topic 만들기
Create topic를 클릭한다.

Standard를 선택하고 Topic 이름을 만든다.

SNS topic를 Lambda trigger 로 등록
Lambda 페이지로 이동해서 Add trigger를 클릭한다.

구독할 SNS topic를 선택한다.

해당 SNS Topic이 Lambda와 연결된 것을 확인할 수 있다. 이제 SNS Topic에 이벤트가 게시(publish)되면 Lambda가 실행될 것이다.
SNS Lambda Trigger 테스트
SNS가 Lambda를 잘 실행하는지 테스트를 해보자. SNS 페이지로 이동하면 SNS Topic에 대한 정보를 확인 할 수 있다. joinc-dev-sns topic을 우리가 만든 Lambda가 구독하고 있는 것도 확인 할 수 있다. Publish message를 눌러서 SNS에 테스트 메시지를 게시할 수 있다.
subject와 메시지 내용(message body)를 만들고 "Publish message"을 누르면 된다. 우리가 만든 Lambda는 메시지가 하드 코딩 됐기 때문에, SNS 메시지 내용은 큰 의미는 없을 것이다.

Publish message 를 클릭하면 Slack에 새로운 메시지가 전달 될 것이다.
메시지 커스터마이징
지금은 메시지를 하드코딩 했는데, 실제 환경에서는 SNS의 메시지를 읽어서 처리를 해야 할 것이다. 그럴려면 SNS에서 전달되는 메시지 포맷을 알고 있어야 한다. 아래는 SNS의 메시지 포맷이다.
JSON 포맷을 가지고 있으며 메시지 내용은 SNS.Message에 저장된다. 이 포맷을 읽을 수 있도록 아래와 같이 Lambda 코드를 수정했다.
SNS에서 테스트 메시지를 만들어서 publish 해보자.


정리
이렇게 해서 SNS -> Lambda -> Slack 으로 이어지는 Event 관리 패턴을 완성했다. 이 패턴은 AWS에서 발생하는 모든 이벤트들의 관리를 위한 가장 많이 사용하는 패턴 중 하나다.
현장에서는 Message 내용(AWS 서비스마다 Message 내용이 다르다.)에 따라서 Lambda 함수를 개발 것으로 대부분의 이벤트 관리 업무를 수행 할 수 있다.
Recent Posts
Archive Posts
Tags