진짜 개발자
본문 바로가기

Software Engineering/CICD (jenkins, etc)

CICD - Jenkins와 CodeDeploy를 이용한 CICD 구축하기 - 3 (Slack 채널에 메시지 보내기)

728x90
httpsgalid1

https://galid1.tistory.com/746 Jenkins와 CodeDeploy를 이용한 CICD 구축하기 - 1 (아키텍처, 과정 소개)

https://galid1.tistory.com/747 CodeDeploy를 이용한 CICD 구축하기 - 2 (구축)

 

지난 포스팅에 이어 이번 시간에는 CodeDeploy의 배포상태에 따라서, Slack의 개발팀에 메시지를 전송하는 과정을 진행하려고 합니다.

 

 

목차

 

 

1. 메시지 전달과정

  1. SNS에서 주제를 생성합니다.
  2. CodeDeploy에서 배포상태에(배포 생성,성공,실패,취소) 따라서, 1에서 생성한 SNS의 주제에 트리거를 합니다.
  3. 1에서 생성한 주제를 구독하고 있던 lambda가 트리거되고, Slack에 메시지를 전송합니다.

 

 

 

2. SNS 주제 생성

Lambda를 트리거 하기위해, 주제를 생성합니다.

 

AWS SNS -> 주제 -> 주제 생성을 클릭합니다

 

적절한 이름을 부여하고, 나머지 선택사항은 건너띕니다.

 

 

 

3. Code Deploy에서 SNS주제에 트리거하도록 설정

지난 포스팅에서 생성한 Code Deploy에서 배포시, 2.에서 생성한 SNS주제에 트리거하도록 변경해야 합니다.

 

AWS CodeDeploy -> 애플리케이션 -> 애플리케이션 -> 배포그룹탭을 클릭한뒤, 지난 포스팅에서 생성한 배포그룹을 선택합니다.

 

우측 상단의 편집을 클릭합니다.

 

하단으로 스크롤하여, 고급탭을 확장한 뒤, 트리거 생성을 클릭합니다.

 

적절한 이름을 부여하고, 이벤트에서는 배포시작, 성공, 실패, 중지를 선택합니다.

SNS주제에서는 앞서 생성한 cicd-deploy-complete를 선택합니다.

 

 

 

4. 메시지를 전달받을 Slack Workspace & App 생성

Lambda를 생성하기전, 메시지를 전달받을 Slack workpacke & App을 생성합니다.

 

4.1 Workspace 생성

slack.com으로 접속하여 + Create a Slack Workspace를 클릭합니다.

 

 

workspace의 계정을 생성합니다.

 

자신이 입력한 이메일로 이동하면 위와 같이 확인 코드를 확인할 수 있습니다. 확인 코드를 입력합니다.

 

Slack Workspace가 생성되었습니다.

 

 

4.2 Slack App 생성

https://api.slack.com/messaging/webhooks 로 이동합니다. app이 없으실테니 Create yout Slack app을 클릭합니다.

 

App이름을 정하고, Slack Workspace에는 3.1에서 생성한 workspace를 지정합니다.

 

Incoming Webhooks탭을 클릭한뒤, On으로 만든뒤, 하단의 Add New Webhook to Workspace를 클릭합니다.

 

post를 요청할 workspace의 channel을 선택합니다.

 

생성된 Webhook URL을 복사합니다.

 

 

 

5. Lambda 생성

5.1 함수생성

이제 2.에서 생성한 SNS주제를 구독하고, Slack에 메시지를 전송할 Lambda 함수를 생성합니다.

 

AWS Lambda -> 함수를 선택합니다.

 

새로 작성을 체크하고, 런타임에는 Python 3.6을 선택합니다.

 

 

5.2 SNS 주제 구독

트리거 추가를 클릭합니다.

 

SNS를 선택하고, cicd-deploy-complete주제를 선택합니다.

 

 

5.3 Slack에 메시지를 전송하는 Python 스크립트 생성

https://github.com/beibeiyang/sns-to-slack

위의 링크를 참고하시면, slack에 메시지를 전송하는 python script를 찾을 수 있습니다.

하지만, aws에서 업데이트를 했는지, 몇가지 설정이 달라져서 직접 스크립트를 작성했습니다.

 

lambda.cfg

endpoint를 앞서 복사한 WebHookUrl의 /services~ 이하로 변경합니다. channel은 project로 변경합니다.

*위 파일의 이름은 꼭 lambda.cfg어야 합니다.

 

lambda_function.py

init은 위의 lambda.cfg파일을 로드하여, url, host, channel등을 설정합니다.

lambda가 트리거되어 실질적으로 slack에 메시지를 전송하는 메소드는 lambda_handler입니다.

 

앞서 3.에서 SNS에 트리거할 이벤트로 배포 시작, 성공, 중지, 실패를 선택했는데요, 이 이벤트들은 lambda_handler 메소드의 매개변수인 event에 담겨있습니다.

 

이 각 배포의 상태값은 event["Records"][0]["Sns"]["Message"]로 가져온 데이터를 json으로 변경하여, json_message['status']로 가져올수 있습니다.

 

확인한 결과 아래와 같습니다.

배포 시작 - CREATED

배포 성공 - SUCCEEDED

배포 중지 - ABORTED

배포 실패 - FAILED

 

 

6. 테스트

code를 GitHub Repository에 push하여, Jenkins 서버를 동작시킵니다. 우선 appspec.yml을 조작하여 고의적으로 배포가 실패되도록 합니다.

 

 

lambda 동작 확인

lambda에 모니터링 탭에서 CloudWatch에서 로그보기를 클릭합니다.

 

LogStream이 생성되었다면 lambda가 동작된 것입니다. 클릭하면, python 스크립트에서 작성한 log들을 자세히 확인하실 수 있습니다.

 

 

Slack 채널 확인

project채널에 메시지가 전달되었음을 볼 수 있습니다.