티스토리 뷰
카테고리 없음
GitHub pull request 발생 시 Mattermost 에 메세지 전송하기(AWS lambda, api gateway)
rangrangerang 2024. 6. 20. 23:30전체적인 로직
깃허브에서 pull request 를 만들면 api gateway로 요청을 보낸다 api gateway 는 lambda의 함수를 호출하고 lambda 의 함수 로직에서 mattermost를에 메세지를 전송한다
- api gateway : API 만들어주는 친구. 외부 클라이언트로부터 요청을 받아 람다 함수로 연결해줌
- lambda : 서버리스 컴퓨팅 플랫폼(메서드만 작성해서 실행시킬 수 있음)
1. Mattermost에 webhook 추가하기
먼저 mattermost에 외부 메세지를 받을 수 있도록 webhook을 추가해 준다
- 좌상단 > 통합
- 전체 Incoming Webhook
- Incoming Webhook 추가하기
- 내용 입력
- 생성된 URL → 람다에서 메세지 전송할 URL 로 사용
2. aws lambda 함수 만들기
2-1. 함수 생성
- aws lambda > 함수 생성
- 언어는 python 3.11 사용
- 자바의 경우 코드 수정 시 로컬에서 빌드 후 jar 업로드 필요
- 파이썬의 경우 aws 웹에서 바로 수정&배포&테스트가 가능함
2-2. 코드 > 코드 작성
- github json을 받아 원하는 데이터 추출
- 해당 데이터를 Mattermost에 보낼 형식에 맞게 변환
- 1에서 생성한 Mattermost url로 전송
- Mattermost 전송 형식 참고 : https://developers.mattermost.com/integrate/reference/message-attachments/
import requests
import json
def lambda_handler(event, context):
try:
# Slack 메시지 전송
send_slack_message(event)
return {
'statusCode': 200,
'body': json.dumps('send message mm')
}
except Exception as e:
return {
'statusCode': 500,
'body': json.dumps(f'error : {str(e)}')
}
def send_slack_message(event):
# mm url : 메터모스트 webhook url
url = 'https://~~~~~'
# github json 에서 필요 데이터 추출
title = event["pull_request"]["title"]
pr_url = event["pull_request"]["html_url"]
user_id = event["pull_request"]["user"]["login"]
branch = event["pull_request"]["head"]["ref"]
task_url = f'https://app.clickup.com/t/25540965/{branch}'
# 메세지 형식 지정
text = f'Task: {title}\nMR: {pr_url}\nTASK: {task_url}\nUSER: {user_id}\n'
message = {
# "text": title,
"attachments": [
{
# "pretext": "test",
"text":text
}
]
}
# mm 에 메세지 전송
headers = {'Content-Type': 'text/plain'}
payload = {"text" : message}
response = requests.post(url, headers=headers, data=json.dumps(message))
# 응답 확인
print('Response:', response.status_code)
print(response.text)
2-3. requests 계층 추가
- 파이썬 라이브러리를 사용하는 경우 직접 람다에 추가해줘야 함
- 라이브러리 파일 준비 & 세팅 : https://ottl-seo.tistory.com/181
2-4. 배포
- Deploy 버튼 클릭
2-5. (참고) 테스트
- 람다에서는 테스트 코드를 생성해 간단하게 테스트가 가능하다
- Test > Configure test event
- 이벤트 JSON에 github 결과 예시 추가 및 저장
-
더보기테스트 데이터 가지고 오는 법
기존의 webhook 데이터를 긁어오거나 람다에서 event를 print 해서 사용해도 됨
아래 내용은 기존 webhook 데이터 긁어오는 방법
- github의 Settings > Webhooks > 이미 만들어져 있던 webhook 클릭
- Content type 이 application/json 인 webhook 선택 필요
- 우리가 원하는 pull request 관련 데이터의 Payload 복사
- github의 Settings > Webhooks > 이미 만들어져 있던 webhook 클릭
3. Api Gateway API 생성
3-1. API 생성(API base url을 만드는 작업)
- aws api gateway > API 생성
- REST API > 구축
- API 이름 작성 후 API 생성
3-2. 리소스 생성(API 상세 url을 만드는 작업)
- 리소스 이름 작성 후 리소스 생성
3-3. 메서드 생성(GET, POST 등을 결정)
- 메서드 생성
- 메서드 세부 정보 작성
- 메서드 유형 : POST(github에서 POST 로 전송해줌)
- 통합 유형 : Lambda 함수
- Lambda 함수 : 2에서 생성한 lambda 함수 선택
- 메서드 생성 버튼 클릭
3-4. 외부에서 접근 가능하도록 API 배포
- API 배포
- 스테이지 : prod(보통은 개발은 dev, 운영은 prod를 사용함 여기서는 운영 개발 상관없기 때문에 그냥 prod로 함)
- URL 호출 : pull reqeust 발생 시 github 에서 호출하는 api
(참고) 로그 확인 방법
- 모니터링 탭
- 하단 CloudWatch Logs > Recentinvocations
- 예시
4. github Webhooks 추가
- Settings > Webhooks > Add webhook
- API Gateway에서 생성한 api url을 입력 & Content type : application/json 선택
- Which events would you like to trigger this webhook?
→ Let me select individual events. 선택- 하위 내용에서 Pull Requests 선택(pull request 관련 작업이 있을 때만 알람을 전송)
- 하단 Add webhook 클릭
- 정상적으로 생성 시 아래와 같이 pull_request 만 대상임을 알 수 있음
- 실제로 전송한 데이터와 결과를 Recent Deliveries에서 확인 가능
결과
- 상태가 open 인 경우 초록, closed 인 경우 보라
참고
https://velog.io/@parksangwon0610/Slack-Github-Webhook을-이용한-슬랙-PR-자동-Mention#api-gateway-를-사용하여-람다-호출
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 보관주기
- 도커
- 다중 데이터소스
- SynchronousQueue
- 티스토리챌린지
- 카프카
- 넥서스 보관주기
- s3
- API Gateway
- kafka without zookeeper
- cleanup policy
- jeus8
- 쓰레드 변수
- php
- cleanup policies
- AWS
- 제우스 로그
- 제우스8
- 스레드 동기화
- 제우스8.5
- volatile
- 오블완
- 넥서스 파일 보관주기
- 주키퍼 없는 카프카
- jeus8.5
- db 두개
- 네트워크
- docker
- multiple datasource
- kafka with raft
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함