본문 바로가기
공부/AWS

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

by 웅대 2023. 7. 5.
728x90
반응형

이전 포스팅에서 github actions와 AWS CodeDeploy를 이용해서 CI/CD를 구축하는 방법에 대해서 알아보았다.

 

https://growth-coder.tistory.com/221

 

CodeDeploy를 통해 배포 과정을 자동화하였고 생산성이 굉장히 향상되었다.

 

그런데 아직도 아쉬운 점이 있다.

 

배포 결과를 확인하기 위해서 AWS CodeDeploy에 접속해야하고 메시지를 확인해야하기 때문이다.

 

그래서 이번에는 CodeDeploy 배포 결과를 자동으로 디스코드에 알림을 보내주는 프로그램을 만들어보려고 한다.

 

우선 과정을 간단히 설명하자면 다음과 같다.

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

 

이번 포스팅은 CodeDeploy를 통한 배포 자동화가 구축되어있는 상태에서 시작한다.

 

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 주제를 선택하고 트리거를 생성한다.

4. AWS Lambda로 디스코드에 알림 보내기

이제 AWS Lambda 함수를 실행하여 Discord에 메시지를 보내는 방법에 대해서 알아보자.

 

우선 디스코드에 채널을 생성하고 채널 설정에 들어가자.

그 후 연동에서 웹후크 만들기에 들어간다.

이후 웹후크 url을 복사한다.

복사한 url로 post 요청을 날리면 간단하게 해결할 수 있다.

 

한번 postman을 통해서 다음 JSON 형태로 body에 담아서 POST 요청을 보내보자.

{
	"content" : "안녕하세요"
}

디스코드에 알림이 오는 것을 확인할 수 있다.

이제 requests를 통해 해당 url로 post 요청을 보내는 코드를 작성하고 lambda에 올린다.

 

python 코드를 람다에 배포하기 참고

https://growth-coder.tistory.com/149

 

[AWS][Lambda] Lambda와 RDS 연동하기 (3)

https://growth-coder.tistory.com/148 이전 포스팅에서 Lambda와 API gateway를 사용하여 api를 배포하는 것을 배워보았다. 이번 시간에는 RDS를 연동하여 Lambda 함수에서 mysql 데이터베이스에 접근하는 방법에 대

growth-coder.tistory.com

<코드 예시>

import requests
def lambda_handler(event, context):
    req = requests.post('url 경로', json={
        'content' : "hello!"
    })
    print(req)

임시로 위와 같이 lambda에 올리고 잘 작동하는지 테스트를 해보자.

 

성공했다면 트리거를 추가하기 전에 sns가 lambda 함수를 실행할 수 있도록 lambda에 권한을 추가한다.

 

서비스는 SNS, ARN은 SNS의 ARN, 작업에는 InvokeFunction을 선택하고 저장한다.

 

 

테스트에 성공했다면 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 타입으로 바꾸면 된다.

 

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

 

<lambda_function.py>

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']}"
    })

메시지가 잘 온다.

반환 json 파일을 보고 메시지로 보내야 할 정보가 있으면 파싱해서 보내도록 하자.

 

참고로 CodeDeploy의 트리거를 설정할 때 트리거 대상이 중복되어서는 안 된다.

 

즉 추가로 배포 성공 메시지도 보내고 싶다면 새로운 SNS 주제를 만들어야 한다.

 

정리

  1. AWS CodeDeploy에 Amazon SNS 권한을 추가한다.
  2. Amazon SNS에서 주제를 생성한다.
  3. AWS CodeDeploy에서 2번에서 생성한 주제로 트리거를 설정한다.
  4. 디스코드 채널에서 훅을 만들고 url을 복사한다.
  5. 해당 url로 post 요청을 보내는 코드를 만들고 Lambda에 업로드한다.
  6. Lambda에서 SNS 주제를 선택하고 트리거를 등록한다. 

 

728x90
반응형

댓글