반응형

프로젝트에서 따로 GitLab이나 Github를 사용하지 않고 AWS CodeCommit을 통해 소스 형상 관리를 하고 있다. 회사에서 팀즈를 많이 사용하고 있는데, 팀즈에서 다른 개발자가 커밋 시 알림을 받고 싶어 Webhook을 이용하여 팀즈 채널에서 알림이 오도록 연동하려고 한다.

 

1. 먼저, 팀즈에서 AWS라는 팀을 생성하고, CodeCommit!이라는 채널을 생성한다.

 

 

2. 팀즈 좌측 [앱]에서 webhook 검색 후 [Incoming Webhook] 추가를 한다.

 

 

3. 추가를 하고 나면 [팀에 추가] 버튼을 누른다.

 

 

4. 팀에 추가를 하면 팀에서 채널들을 선택할 수 있는데, 팀에서 채널을 선택해도 되고, 그냥 팀만 선택할 경우 Default로 일반 채널로 설정이 된다.

 

 

5. Incoming Webhook에 대한 이름을 넣고 만들기를 눌러 완료 버튼을 누른다.

- 여기서 Webhook URL 저장해 둔다.

 

 

6. 그리고 나서, CodeCommit! 채널을 보면 Incoming Webhook과 연결이 됐다고 알림이 뜬다.

 

 

7. 추가적으로, 정상적으로 연결이 됐는지 확인하는 방법은 아래의 명령어에 Webhook URL을 추가하여 명령프롬프트 창에서 실행하면 채널에 알림이 뜬다.

curl -H "Content-Type: application/json" -d "{\"text\": \"Hi\"}" WebHookURL

 

정상적으로 실행이 되면 1을 리턴한다.

 

 

팀즈 채널을 보면 이렇게 알림이 뜬다.

 

8. AWS Console에서 [Simple Notification Service]를 들어간다.

 

 

9. 좌측에 주제에 들어가서 주제 생성을 한다.

 

 

10. 주제 생성 시 표준으로 설정하고 이름을 넣는다.

 

 

11. AWS Lambda를 통해 트리거를 생성할 것이다. Lambda를 들어간다.

 

 

12. Lambda에서 함수 생성을 한다.

 

 

13. 함수 새로 작성하여 함수 이름, 런타임은 Python으로 하였고 아키텍처는 x86_64로 선택했다.

 

 

14. 이제 트리거를 생성할 건데, 트리거는 SNS와 CodeCommit 2개를 추가할 것이다.

 

 

15. 트리거 추가 시 SNS와 SNS topic으로 만들어놨던 CommitAlert를 추가한다.

 

 

16. 그리고, 다시 트리거 추가를 하는데 CodeCommit과 CodeCommit에 있는 리포지토리, 브랜치 등 설정을 한다.

 

 

17. 그렇게 하면, 함수 개요에서 1개의 Lambda인 CommitAlert에 2개의 트리거(SNS, CodeCommit)가 생성이 된 것을 볼 수 있다.

 

 

18. 해당 Lambda에서 소스 코드를 붙여주는데, 추가적으로 커스터마이징을 하기 위해 records와 codecommit에서 어떻게 데이터가 오는지를 보기 위해 res_text에 추가를 했다. 추후에 변경할 예정이다. 작성 후, Deploy 버튼을 누른다.

#!/usr/bin/python3.8
import urllib3
import json
import boto3
from datetime import datetime

http = urllib3.PoolManager()
codecommit = boto3.client('codecommit')

def lambda_handler(event, context):
	records = json.loads(event['Records'][0]['Sns']['Message'])['Records'][0]
	webhook_url = records['customData']
	repository = records['eventSourceARN'].split(':')[5]
	commitId = records['codecommit']['references'][0]['commit']
	branch = records['codecommit']['references'][0]['ref']
	
	try:
		commit = codecommit.get_commit(repositoryName=repository, commitId=commitId)['commit']
		commit_author_name = commit['author']['name']
		commit_author_email = commit['author']['email']
		commit_date = commit['author']['date']
		commit_msg = commit['message']
		res_text = "Author: " + commit_author_name + " <" + commit_author_email + "> \nBranch: " + branch + " \nCommitMessage: " + commit_msg + " \nDate: " + commit_date + "\nCommit : " + str(commit) + "\nrecord : " + str(records)
		response = { "@context": "https://schema.org/extensions", "@type": "MessageCard", "themeColor": "0072C6", "title": "The core has been updated.", "text": res_text }
		encoded_msg = json.dumps(response).encode('utf-8')
		http.request('POST', webhook_url, body = encoded_msg)
	except Exception as e:
		encoded_msg = json.dumps({"text": str(e)}).encode('utf-8')
		http.request('POST', webhook_url, body = encoded_msg)
		raise e

19. 이제 다시, AWS CodeCommit 서비스로 접속하여 해당 리포지토리를 클릭하면 [소스] - [리포지토리] - [설정]을 들어가서 해당 리포지토리의 트리거를 확인할 수 있다.

 

 

20. 해당 트리거를 클릭하고 [서비스 세부 정보]에서 Amazon SNS를 선택 후, SNS 주제와 그리고 WebHook URL을 넣으면 된다. 근데, 이미 사전에 다 등록을 했으므로 다 등록이 되어 있을 것이다.

 

21. 화면 아래에 있는 트리거 테스트를 눌러서 정상적으로 작동하는지 확인하면 됐는데, AccessDeniedException이 발생했다.

 

이 문제를 해결하는 방법은 아래의 링크에 정리를 해뒀으니 진행하면 된다.

2024.03.07 - [IT/AWS] - [AWS] an error occurred AccessDeniedException when calling the GetCommit operation 에러 문제 해결 방법

 

[AWS] an error occurred AccessDeniedException when calling the GetCommit operation 에러 문제 해결 방법

팀즈(Teams)에서 AWS 코드커밋(CodeCommit)에 커밋을 할 때마다 팀즈 채널에 알림이 오도록 설정하는 와중에 an error occurred AccessDeniedException when calling the GetCommit operation 에러가 발생했다. 에러 원문 An er

yongku.tistory.com

 

이 문제를 해결하고 나면 팀즈 채널에 정상적으로 알림이 오는 것을 확인할 수 있다.


참고

https://dvlpr-chan.tistory.com/42

https://docs.aws.amazon.com/ko_kr/codepipeline/latest/userguide/action-reference-CodeCommit.html

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기