Education*
Devops
Architecture
F/B End
B.Chain
Basic
Others
CLOSE
Search For:
Search
BY TAGS
linux
HTTP
golang
flutter
java
fintech
개발환경
kubernetes
network
Docker
devops
database
tutorial
cli
분산시스템
www
블록체인
AWS
system admin
bigdata
보안
금융
msa
mysql
redis
Linux command
dns
javascript
CICD
VPC
FILESYSTEM
S3
NGINX
TCP/IP
ZOOKEEPER
NOSQL
IAC
CLOUD
TERRAFORM
logging
IT용어
Kafka
docker-compose
Dart
SNS, Lambda로 Slack에 메시지 보내기
Recommanded
Free
YOUTUBE Lecture:
<% selectedImage[1] %>
yundream
2023-11-22
2023-11-22
1122
### 이벤트를 Slack로 전송하기 AWS 클라우드를 운영하는데 있어서 가장 중요한 요소는 모니터링을 시스템을 이용한 이벤트 관리다. AWS 클라우드에서는 다양한 이벤트가 발생하는 데, 중요한 이벤트들은 Slack으로 전송해야 한다. 여기에서는 **Pub/Sub 서비스인 SNS**와 **Labmda**를 이용해서 Slack으로 메시지를 전송하는 방법을 살펴볼 것이다. ### 아키텍처 아키텍처는 아래와 같다. ![SNS Lambda](https://docs.google.com/drawings/d/e/2PACX-1vT2iq8IZvyb5vdxLV4holBrhSSXJ6W3jXIolU59gLIui92Zmlxb4dVKpfrpVaDzHeDIa-kVhH-m13i6/pub?w=880&h=343) AWS sevice가 **publisher**가 되어서 이벤트를 SNS topic에 게시하면, Lambda 가 이를 읽어서 Slack에 전송하는 방식이다. 예를 들어 "S3 bucket에 있는 object가 삭제됐을 경우 Slacke 메시지로 전송" 할 수 있다. ### Slack 설정 Slack은 각 채널별로 **webhook url**을 만들 수 있는데, 이 url을 이용해서 Slack에 메시지를 전송 할 수 있다. ![Slack webhook](https://docs.google.com/drawings/d/e/2PACX-1vRhl7ExQ2nAClQBQUwKpt3jK-sytkWVmcIREQXndtiIKQNNEpPN4-ndRl1A_ePMgZhvRbRLgVco-74J/pub?w=608&h=176) ##### Slack channel 생성 메시지를 받을 slack channel인 **aws-test**를 만들었다. ![](https://docs.google.com/drawings/d/e/2PACX-1vTtBjeDzFrzP8RyNqJmbIOlhazbq1WuFomxf2otMOI-vnKCQtJkWimMq7H1MwqJCl6RMdCuTHJ4_FV2/pub?w=935&h=421) ##### Webhook url 만들기 웹 브라우저로 https://api.slack.com/apps 에 접속해서 slack app을 생성할 수 있다. ![](https://docs.google.com/drawings/d/e/2PACX-1vT7584S9eaaRQJYxYRt0Ez9M45RIE3j-oVvG8FR1Rhsh3lIFkAZMxyhhr2vX5saHc8_HhqT90scndQI/pub?w=834&h=527) **Create New App**을 클릭하면 새로운 slack app을 만들 수 있다. ![slack app create](https://docs.google.com/drawings/d/e/2PACX-1vSvqDElGid2HnnkTBZKTzXbvBbL-p4N4EYqV2XHPz1pdWIU1HrvyeHUwiSuFsTqwCl1T0hzTdQt1-d1/pub?w=690&h=478) ![Slack app create](https://docs.google.com/drawings/d/e/2PACX-1vRRMbtzBwUi61yscehe9yJW2lKKs9M6WmyKa_r5ShCUbyBBUuHiJkBEb3qHB8AlJJmqFSNsZeP4nzUq/pub?w=640&h=552) **App Name**을 입력하고, 이 app을 설치할 **workspace**를 선택하고 **Create App**을 클릭하면 Slack app이 만들어진다. ![](https://docs.google.com/drawings/d/e/2PACX-1vQ-uXwfXiJNeIGvJtl9HM7hL8ZJdDjKKeC_nPk-adST0fTDfVtqQ3xAuKJE_jd9GSBr5OcF89fOAfUD/pub?w=872&h=648) App이 만들어졋으니, App의 기능을 설정해야 한다. Webhook URL로 메시지를 수신하기로 했으니, **Incoming Webhooks**를 선택한다. ![slack webhook url 생성](https://docs.google.com/drawings/d/e/2PACX-1vRi-FpHGrXeW3Ym__mVazdkoZdRrr6-LYCBn_6Ibyj7LNa1YErnJP2CxGubyFhCAN0wUCOfOV5O7iko/pub?w=956&h=902) **Activate Incomming Webhooks**를 활성화(on)하고 **Add New Webhook to Workspace**를 클릭한다. ![slack webhooks](https://docs.google.com/drawings/d/e/2PACX-1vR1bDAZUcW1fr4eKO5qbKiI0otxO8JZvJ0f-NE3i5gpWf2wdKNETUxpRpSmNsHJ-yliwobFIHhvqF5K/pub?w=549&h=449) webhook 메시지를 받을 채널을 선택하고 **Allow**를 클릭한다. ![Slack webhook](https://docs.google.com/drawings/d/e/2PACX-1vTtMWeLpVlHFTb67K7uqbKX-xEQ_d3JASaGJzn-I6MsEiDlZcL8VLU8GmNoWvnes59SDRBgRvHrfYJR/pub?w=700&h=471) 드디어 webhook url이 만들어졌다. **curl** 명령으로 메시지가 잘 전달되는지 테스트 해보자. ``` $ curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/Txxxxxxxxxxxxxxxx/zzzzzzzzzzz ok ``` 아래와 같이 Slack 채널에 메시지가 전달되면 성공이다. ![Slack webhooks message](https://docs.google.com/drawings/d/e/2PACX-1vReIuXp1QKi5HkrVmuHJNeJuy2tA-EGhRIF4H7LPokNztRoYsNKbAVpXxTJge-qO-B6kTNvwDP_mIBJ/pub?w=910&h=579) ### Lambda 코드 개발 이제 앞서 만든 "Webhooks URL"을 이용해서 Lambda 코드를 만들어야 한다. ![](https://docs.google.com/drawings/d/e/2PACX-1vTwVT3AC2cOkbC5blxcqTv338R2O87E09SfOJYaDs5LgzoNgvy5xbqflOuiACbLg15U5T-wv7iz8rUh/pub?w=1312&h=770) 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](https://docs.google.com/drawings/d/e/2PACX-1vTY7lUhU0iQLPoEo2lyW2hbbe_OLcYQAnIJp3oWmVtSTWmMWV67nMySMKbWGRdzC4cwyauwGS6u6Z4N/pub?w=951&h=364) 그러면 Lambda function의 정보를 확인 할 수 있다. * Add trigger: 우리가 만든 Lambda를 실행(trigger)하기 위한 이벤트 소스를 설정할 수 있다. 나중에 SNS를 trigger로 추가할 것이다. 가장 중요한 부분은 Lambda 코드를 만드는 것이다. AWS 관리자 콘솔에서 제공하는 에디터를 이용해서 웹 상에서 직접 코딩 / 테스트 / 배포를 할 수 있다. ![Lambda console editor](https://docs.google.com/drawings/d/e/2PACX-1vT_NR3KI3VHrDrKZ-66SS2a0MotCTUi2DECJHv14bQsiJR8ESr1H7RpIity057QxMUPRFpav5QGkw3z/pub?w=1041&h=374) 아래는 webhook url로 slack alarm을 전송 하는 코드다. ```python 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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" def lambda_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 및 테스트 ![Lambda code deploy](https://docs.google.com/drawings/d/e/2PACX-1vRL58td5P7dtfZF5u87KVU0mVcV-9DyFhwVIjZ5E2P1VTlWsdM0Ko4z1QiX-0o4KF6u6a1DBDOHZy16/pub?w=1017&h=534) 코드를 완성했으면 **deploy**로 코드를 배포한다. 코드가 배포되면 **Test**를 이용해서 코드를 테스트 할 수 있다. ![Lambda test](https://docs.google.com/drawings/d/e/2PACX-1vQj44xMVEM_KchxQK-yQ_UkkgcdhY5qzxcHKKWeyiOJ637wlNUkQPyyVJDHScmQ3-RwJA0PGNvbTavR/pub?w=1030&h=561) Test 설정은 **Event name**으로 저장해서 필요 할 때 불러서 사용 할 수 있다. 실제 Lambda를 작성하는 경우 다양한 형태의 메시지를 다루게 되는데, **Event JSON**을 바꿔가면서 잘 처리하는지를 확인 할 수 있다. 여기에서는 하드코딩된 메시지를 전송하므로 Event JSON은 무시해도 된다. 이제 **Test** 버튼을 누르면 Lambda 함수가 실행이 된다. 코드를 잘 작성했다면, 슬랙으로 메시지가 전달될 것이다. ![Lambda Slack 테스트](https://docs.google.com/drawings/d/e/2PACX-1vR8qN-bAYNfhTZkjpI2QBbuf0TtKiP64u3klUJMZeN6yXjSw3Qk6qKTTnpaYiVgI0LQ9l1g-DU-tKyG/pub?w=840&h=282) ### Lambda로 SNS 메시지를 전달하기 이제 SNS이용해서 Slack으로 메시지를 전달해보자. 구조는 아래와 같다. ![SNS Lambda 구조](https://docs.google.com/drawings/d/e/2PACX-1vTrG68oHorH_a9PcRiZ2llNeHEvvHCz2owJEwX3Tzs6fAqPGFYlMhBF74l5ztJP6TNTSE9b77W2h5iC/pub?w=814&h=105) #### SNS Topic 만들기 **Create topic**를 클릭한다. ![](https://docs.google.com/drawings/d/e/2PACX-1vSiRUIwRnGz3zHhU0A-yzmowP9abx4HKCxnk2H53t5bdS0SPW_ZAwwE5QVv_apDzHkJpEHE_PUr8DNX/pub?w=1048&h=356) **Standard**를 선택하고 Topic 이름을 만든다. ![](https://docs.google.com/drawings/d/e/2PACX-1vSL9xN3saKGMCeEy4JA-7nMx1HH1HkB06M1_7r2LMlNOC8Tl9Aqb84EhukNk96RLY82wQMQH_OGfLk_/pub?w=947&h=483) ##### SNS topic를 Lambda trigger 로 등록 Lambda 페이지로 이동해서 **Add trigger**를 클릭한다. ![Lambda trigger](https://docs.google.com/drawings/d/e/2PACX-1vQOftxkWod3UgGSNXCsV-0UsNrOBHCNwj45oXqyGFJzO5eS4Zphbao13GC8v6EJje_Lg3bhSbyOMD1W/pub?w=846&h=396) 구독할 **SNS topic**를 선택한다. ![SNS Lambda](https://docs.google.com/drawings/d/e/2PACX-1vTP858lZ-zlERwzqweY9LwmyOKFB44EM8-F6MRhu9951NGU0zI90Uifxx1fJgPI1JG3StuKfszSq4aj/pub?w=888&h=424) 해당 SNS Topic이 Lambda와 연결된 것을 확인할 수 있다. 이제 SNS Topic에 이벤트가 게시(publish)되면 Lambda가 실행될 것이다. ### SNS Lambda Trigger 테스트 SNS가 Lambda를 잘 실행하는지 테스트를 해보자. SNS 페이지로 이동하면 SNS Topic에 대한 정보를 확인 할 수 있다. joinc-dev-sns topic을 우리가 만든 Lambda가 구독하고 있는 것도 확인 할 수 있다. **Publish message**를 눌러서 SNS에 테스트 메시지를 게시할 수 있다. ![SNS Dashboard](https://docs.google.com/drawings/d/e/2PACX-1vTj_T45uk7EZcBwkvCA-VeXHkw3A1HYqsVMBN8kHc3eqgEez61nIaLToeDpT7oPK3MBMN6n5VjE294A/pub?w=1056&h=762) subject와 메시지 내용(message body)를 만들고 "Publish message"을 누르면 된다. 우리가 만든 Lambda는 메시지가 하드 코딩 됐기 때문에, SNS 메시지 내용은 큰 의미는 없을 것이다. ![SNS 메시지 작성](https://docs.google.com/drawings/d/e/2PACX-1vROJkgv2YHHBbefTHNH8RBKckLbiIFyOLSPFowk3kyir3U-Iim2I9QHHiz5JW9T1dGeQSTdYjw3kEIF/pub?w=1164&h=382) **Publish message** 를 클릭하면 Slack에 새로운 메시지가 전달 될 것이다. ### 메시지 커스터마이징 지금은 메시지를 하드코딩 했는데, 실제 환경에서는 SNS의 메시지를 읽어서 처리를 해야 할 것이다. 그럴려면 SNS에서 전달되는 메시지 포맷을 알고 있어야 한다. 아래는 SNS의 메시지 포맷이다. ```json [ { "EventSource": "aws:sns", "EventVersion": "1.0", "EventSubscriptionArn": "arn:aws:sns:ap-northeast-2: 01111111111:joinc-dev-sns: 7fb6cc93-54f6-00000-aaaaa-11111", "Sns": { "Type": "Notification", "MessageId": "004427fa-58af-5314-9840-7a2d208f6134", "TopicArn": "arn:aws:sns:ap-northeast-2: 016355928008:joinc-dev-sns", "Subject": "1111", "Message": "111111", "Timestamp": "2023-11-22T03: 30: 40.459Z", "SignatureVersion": "1", "Signature": "g/I8Sx+U7VX7uGBZrR1KFqAAIcZhBnkALtTKbAz/JXJ/ZCFLV+MjzaapBblntEKJUWczIbYISYeVvhwdaCukUiXxnWGeCaTgtM4TdR5Q==", "SigningCertUrl": "https: //sns.ap-northeast-2.amazonaws.com/SimpleNotificationService-01d08000000000000000e40ed6.pem", "UnsubscribeUrl": "https://sns.ap-northeast-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-northeast-2:01111111111:joinc-dev-sns:7f888-3333-44444-a9fc-16f", "MessageAttributes": {} } } ] ``` JSON 포맷을 가지고 있으며 메시지 내용은 **SNS.Message**에 저장된다. 이 포맷을 읽을 수 있도록 아래와 같이 Lambda 코드를 수정했다. ```python 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/k236.../06G3X.../o6QrHGckftT3" def lambda_handler(event, context): message = event['Records'][0]['Sns']['Message'] send_data = { 'text': str(message), } 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() ``` SNS에서 테스트 메시지를 만들어서 publish 해보자. ![SNS Message Test](https://docs.google.com/drawings/d/e/2PACX-1vTwojqShFqgTxqvXGNWiMvxouz8fdhXRCHN4OTBbqERj87cgp5aMFXq8193vkR9J6GIK8CjdxqGtN76/pub?w=854&h=538) ![](https://docs.google.com/drawings/d/e/2PACX-1vRTQtcLf8hy-7RGEm92yDt2rmUXR2UWINx8WX-vasr_jUILaT5D3_4zpoe9rvaFmROCgFsVIcD3rBTP/pub?w=793&h=233) ### 정리 이렇게 해서 SNS -> Lambda -> Slack 으로 이어지는 **Event 관리 패턴**을 완성했다. 이 패턴은 AWS에서 발생하는 모든 이벤트들의 관리를 위한 가장 많이 사용하는 패턴 중 하나다. 현장에서는 Message 내용(AWS 서비스마다 Message 내용이 다르다.)에 따라서 Lambda 함수를 개발 것으로 대부분의 이벤트 관리 업무를 수행 할 수 있다.
Recent Posts
Vertex Gemini 기반 AI 에이전트 개발 03. Vertex AI Gemini 둘러보기
Vertex Gemini 기반 AI 에이전트 개발 02. 생성 AI에 대해서
Vertex Gemini 기반 AI 에이전트 개발 01. 소개
Vertex Gemini 기반 AI 에이전트 개발-소개
생성 AI 모델 Flux.1 설치 및 사용
GPT를 이용한 Reranker 테스트
5분만에 만들어보는 Streamlit 챗봇
Let's encrypt로 SSL 인증서 관리하기
Upscayl을 이용한 이미지 업스케일링
스테이블 디퓨전 설치 및 사용해보기
Archive Posts
Tags
aws
cloud
모니터링
Copyrights © -
Joinc
, All Rights Reserved.
Inherited From -
Yundream
Rebranded By -
Joonphil
Recent Posts
Archive Posts
Tags