본문 바로가기
카테고리 없음

[AWS] CI/CD 배포 결과 디스코드에 알림 보내기

by 용용이아바이 2024. 12. 5.
728x90
  1. CodeDeploy에서 배포 실패 이벤트 발생
  2. CodeDeploy 트리거에 등록된 AWS SNS 주제로 메시지 전송
  3.  AWS SNS 트리거에 등록된 AWS Lambda 함수로 메시지 전송
  4. AWS Lambda 함수에서 디스코드에 메시지 전송

1. AWS CodeDeploy에 Amazon SNS 권한 연결

CodeDeploy 역할을 생성한다.

 

IAM -> 액세스 관리 -> 역할 -> 역할 만들기에 들어간다.

 

다른 AWS 서비스의 사용 사례에서 CodeDeploy를 선택하고 생성한다.

역할을 생성하면 해당 역할에서 권한 -> 권한 추가 -> 인라인 정책 생성에 들어간다.

시각적 편집기에서 서비스는 SNS, 작업은 Publish, 리소스는 모든 리소스를 선택하고 정책 검토를 눌러준다.

추가 정보를 입력하고 정책을 생성한다.

2. Amazon SNS에서 주제 생성

AWS CodeDeploy의 트리거가 가리킬 SNS 주제를 생성한다.

 

Amazon SNS -> 주제 -> 주제 생성에 들어간다.

 

표준을 선택하고 이름을 적어주고 주제를 생성한다.

 

우리는 Lambda에게 메시지를 보내야하므로 FIFO가 아닌 표준을 선택해야 한다.

 

3. AWS CodeDeploy에서 트리거 생성

이미 만들어둔 CodeDeploy의 애플리케이션에서 트리거를 추가할 배포 그룹을 선택하고 편집에 들어간다.

 고급-선택 사항을 열어보면 트리거를 생성할 수 있다.

트리거 이름을 정하고 이벤트는 배포 실패를 선택하고 만들었던 SNS 주제를 선택하고 트리거를 생성한다.

테스트에 성공했다면 lambda에서 트리거를 추가하자.

이미 만들어 둔 SNS 주제를 선택한다.

이제 CodeDeploy에 배포 실패 이벤트를 추가했었는데 배포 실패가 발생하면 AWS Lambda 함수가 실행된다.

 

여기서 디스코드 훅 url로 post 요청을 보내도록 하면 디스코드에 배포 실패 메시지를 보낼 수 있다.

 

배포 실패가 발생했을 때 JSON은 상당히 복잡한데 lambda에서 다음과 같은 파싱 과정을 거치

event['Records'][0]['Sns']['Message']

아래와 같은 문자열이 반환된다.

{
	"region":"ap-northeast-2",
    "accountId":"019001392774",
    "eventTriggerName":"sdg",
    "applicationName":"cd-test",
    "deploymentId":"d-F813AC8AO",
    "deploymentGroupName":"CD",
    "createTime":"Tue Jun 27 13:44:03 UTC 2023",
    "completeTime":"Tue Jun 27 13:44:12 UTC 2023",
    "deploymentOverview":"{
    	"Succeeded":0,
        "Failed":1,
        "Skipped":0,
        "InProgress":0,
        "Pending":0
        }",
    "status":"FAILED",
    "errorInformation":
    	"{
          	"ErrorCode":"HEALTH_CONSTRAINTS",
            "ErrorMessage":"The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems."
         }",
    "rollbackInformation":"{}"
    }
}

이는 문자열이다. dictionary 타입인줄 알고 "deploymentOverview"를 바로 가져왔더니 오류가 발생했다.

 

json 라이브러리를 사용하여 dictionary 타입으로 바꾸면 된다.

 

다음은 에러 메시지를 파싱해서 디스코드로 메시지를 보내는 파이썬 람다 함수 코드이다.

import requests
import json
def lambda_handler(event, context):
    json_data = json.loads(event['Records'][0]['Sns']['Message'])
    json_data2 = json.loads(json_data['deploymentOverview'])
    json_data3= json.loads(json_data['errorInformation'])
    print(json_data3['ErrorMessage'])

    req = requests.post('디스코드 훅 주소', json={
        'content' : f"에러가 발생했습니다. \n 메시지 : {json_data3['ErrorMessage']} \n 배포 시작 시간 : {json_data['createTime']} \n 배포 끝난 시간 : {json_data['completeTime']}"
    })

 

728x90