AWS는 CodeCommit을 “AWS CodeCommit은 안전한 Git 기반 리포지토리를 호스팅하는 완전관리형 소스 제어 서비스입니다.” 라고 소개하고 있습니다. 즉 GitHub의 AWS 버전입니다. CodePipeline등 AWS의 CI/CD 서비스와도 긴밀하게 연결되었고 후술할 여러 이벤트 Hook이 있어 자동화도 편리하기까지 합니다. 그래서 현재 프로젝트는 모두 CodeCommit으로 형상관리를 하고 있습니다.
서론
Devops 업무를 하다보면 CodeCommit의 여러 이벤트를 자동화하여 처리하여 효율을 높히는 방법을 고민하게 됩니다.
예를들어 PR이 생성되거나 새로운 브렌치가 생성되면 관계자에게 슬랙으로 알림을 전달하는 것 부터 보안이 철저한 회사라면 허용된 IP이외에서 레포를 다운받는걸 알람으로 받는다던지(예시입니다. 사실 이 경우는 IAM Policy를 통해 원천적으로 차단이 가능합니다.) 여러 가지 시나리오를 처리할 수 있겠지요.
CodeCommit에서는 이러한 이벤트 알람을 처리하는 방법은 크게 3가지가 있습니다.
CodeCommit에서 제공하는 알람을 통해 SNS호출
CloudWatch(EventBridge) Event Rule로 CodeCommit 이벤트를 잡아 SNS 호출
CloudWatch “AWS API Call via CloudTrail” 로 API 호출을 잡아 SNS호출
각 케이스에 대해서 간단히 살펴보겠습니다.
CodeCommit 자체 이벤트 알람
CodeCommit에서는 자체적으로 소스가 업데이트 되거나 브렌치의 생성같은 이벤트가 일어날때 알람을 설정할 수 있는 기능이 있습니다. 간단하게 좌측 메뉴에서 설정->알림->알림 규칙 생성에서 생성이 가능합니다. 여기서는 SNS를 생성할 수 있고 해당 SNS에 보낼 알림이 트리거 되는 조건을 선택할 수 있습니다.
이 외에도 CodeCommit이 제공하는 여러 이벤트를 통해 CloudWatch(EventBridge) Event Rule을 생성해서 알람을 처리할 수 있습니다.
CloudWatch(EventBridge) Event Rule
AWS CodeCommit이 발생시키는 여러 Event 링크를 직접 CloudWatch Event Rule을 통해 잡아서 SNS를 호출할 수도 있습니다. 위에 언급한 자체 알람보다 더 많은 종류의 이벤트를 지원합니다.
CloudWatch “AWS API Call via CloudTrail”
CodeCommit에서 모든 종류의 이벤트를 발생시키지는 않습니다. 예를들어 누군가가 Pull을 받거나 하는 행동에 대해서는 정의된 이벤트가 없습니다. 이 경우에는 AWS의 모든 API 호출에 대해서 이벤트 형식으로 잡아 사용할 수 있는 AWS API Call via CloudTrail Rule을 사용하면 됩니다. 링크
이 방법은 List*, Get*, Describe*를 제외한 모든 AWS의 API 호출은 일종의 이벤트 형식으로 잡아내서 CloudWatch Rule을 발생시키는 이벤트 처럼 사용할 수 있습니다. 즉 위에 Pull의 경우 CloudTrail에서는 codecommit:GitPull API로 Pull을 처리하는데, 이 API의 호출을 잡아내서 관련 내용을 보고 알람을 처리할 수 있습니다.
따라서 CodeCommit의 GitPush, GitPull API 등의 API 호출을 잡아서 해당 API가 발생했을대 알람을 생성할 수 있습니다.
CodeCommit:GitPush/GitPull API는 성공시 CloudTrail에 두번씩 기록됩니다.따라서 dataTransferred:true인 API 호출을 기준으로 이벤트를 생성합니다.
다음은 지정한 이메일주소로
브렌치로 Push하였을때
누군가 Pull을 받았을때
PR이 생성되었을때
브렌치가 생성되었을때
PR이 머지되었을때
해당 내용을 알려주는 예시 CloudFormation 템플릿입니다.
템플릿에서는 간단한 문구만 전달하지만 실제로는 이벤트에서 다양한 정보(IP주소, AGENT 정보등)을 제공하기 때문에 원하는 작업을 수행할 수 있습니다.