티스토리 뷰

전체적인 로직

깃허브에서 pull request 를 만들면 api gateway로 요청을 보낸다 api gatewaylambda의 함수를 호출하고 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. 코드 > 코드 작성

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 데이터 긁어오는 방법

    1. github의 Settings > Webhooks > 이미 만들어져 있던 webhook 클릭
    2. Content type 이 application/json 인 webhook 선택 필요
    3. 우리가 원하는 pull request 관련 데이터의 Payload 복사

 

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-를-사용하여-람다-호출

 

 

 

 

 

 

 

 

댓글