CodeBuild의 빌드 알림 샘플 - AWS CodeBuild

CodeBuild의 빌드 알림 샘플

Amazon CloudWatch Events는 AWS CodeBuild를 기본적으로 지원합니다. CloudWatch 이벤트는 AWS 리소스의 변경 사항을 설명하는 시스템 이벤트의 스트림입니다. CloudWatch 이벤트를 사용하여 관심 이벤트를 자동화된 작업과 연결하는 선언적 규칙을 작성합니다. 이 샘플에서는 Amazon CloudWatch Events 및 Amazon Simple Notification Service(Amazon SNS)를 사용하여 빌드가 성공하거나, 실패하거나, 다른 빌드 단계로 이동할 때마다 또는 이러한 이벤트를 조합할 때마다 구독자에게 빌드 알림을 보내 줍니다.

중요

이 샘플을 실행하면 AWS 계정에 요금이 발생할 수 있습니다. 여기에는 CodeBuild 및 AWS 리소스에 대한 가능 요금과 Amazon CloudWatch 및 Amazon SNS와 관련된 작업이 포함됩니다. 자세한 내용은 CodeBuild 요금, Amazon CloudWatch 요금Amazon SNS 요금을 참조하십시오.

샘플 실행

이 샘플을 실행하려면

  1. 이미 주제를 설정했으며 이 샘플에 사용하려는 Amazon SNS에서 구독을 설정한 경우 4단계로 이동합니다. 그렇지 않고 AWS 루트 계정이나 관리자 IAM 사용자 대신 IAM 사용자를 사용하여 Amazon SNS로 작업하고 있는 경우 다음 명령문(### BEGIN ADDING STATEMENT HERE ###### END ADDING STATEMENT HERE ### 사이)을 사용자(또는 사용자가 연결되어 있는 IAM 그룹)에 추가하십시오. AWS 루트 계정을 사용하는 것은 권장되지 않습니다. 이 명령문은 알림을 보고 생성하고 구독하고 Amazon SNS의 주제로 알림을 전송하는 것을 테스트하도록 해줍니다. 간결하게 나타내고 명령문 추가 위치를 알 수 있도록 줄임표(...)가 사용되었습니다. 어떤 명령문도 제거하지 않아야 하며, 이러한 줄임표는 기존 정책에 입력하지 않아야 합니다.

    { "Statement": [ ### BEGIN ADDING STATEMENT HERE ### { "Action": [ "sns:CreateTopic", "sns:GetTopicAttributes", "sns:List*", "sns:Publish", "sns:SetTopicAttributes", "sns:Subscribe" ], "Resource": "*", "Effect": "Allow" }, ### END ADDING STATEMENT HERE ### ... ], "Version": "2012-10-17" }
    참고

    이 정책을 수정하는 IAM 엔터티에는 정책을 수정하는 IAM의 권한이 있어야 합니다.

    자세한 정보는 IAM 사용 설명서인라인 정책 작업(콘솔)에 있는 고객 관리형 정책 편집 또는 "그룹, 사용자 또는 역할에 대한 인라인 정책을 편집하거나 삭제" 단원을 참조하십시오.

  2. Amazon SNS에서 주제를 생성하거나 지정합니다. AWS CodeBuild가 CloudWatch 이벤트를 사용하여 Amazon SNS를 통해 이 주제에 빌드 알림을 보냅니다.

    주제를 생성하려면 다음과 같이 합니다.

    1. https://console.aws.amazon.com/sns에서 Amazon SNS 콘솔을 엽니다.

    2. [Create topic]을 선택합니다.

    3. 새로운 주제 생성주제 이름에 주제 이름(예: CodeBuildDemoTopic)을 입력합니다. (다른 이름을 선택하는 경우 이 샘플 전체에서 해당 이름으로 바꿉니다.)

    4. [Create topic]을 선택합니다.

    5. 주제 세부 정보: CodeBuildDemoTopic 페이지에서 주제 ARN 값을 복사합니다. 다음 단계에서 이 값을 사용합니다.

    자세한 내용은 Amazon SNS 개발자 안내서주제 생성 단원을 참조하십시오.

  3. 한 명 이상의 수신자가 주제를 구독하여 이메일 알림을 수신하게 합니다.

    수신자가 주제를 구독하게 하려면 다음과 같이 합니다.

    1. 이전 단계에서 Amazon SNS 콘솔을 연 상태로 탐색 창에서 구독을 선택한 다음 구독 생성을 선택합니다.

    2. 구독 생성주제 ARN에 이전 단계에서 복사한 주제 ARN을 붙여 넣습니다.

    3. 프로토콜에서 이메일을 선택합니다.

    4. 엔드포인트에 수신자의 전체 이메일 주소를 입력합니다.

    5. 구독 생성을 선택합니다.

    6. Amazon SNS가 수신자에게 구독 확인 이메일을 보냅니다. 이메일 알림 수신을 시작하려면, 수신자는 확인 이메일에서 구독 확인 링크를 선택해야 합니다. 수신자가 링크를 클릭한 후 구독에 성공하면 Amazon SNS가 해당 수신자의 웹 브라우저에 확인 메시지를 표시합니다.

    자세한 내용은 Amazon SNS 개발자 안내서주제 구독을 참조하십시오.

  4. AWS 루트 계정이나 관리자 IAM 사용자 대신 IAM 사용자를 사용하여 CloudWatch 이벤트로 작업하고 있는 경우 다음 명령문(### BEGIN ADDING STATEMENT HERE ###### END ADDING STATEMENT HERE ### 사이)을 사용자(또는 사용자가 연결되어 있는 IAM 그룹)에 추가하십시오. AWS 루트 계정을 사용하는 것은 권장되지 않습니다. 이 문은 사용자가 CloudWatch 이벤트에서 작업할 수 있도록 하는 데 사용됩니다. 간결하게 나타내고 명령문 추가 위치를 알 수 있도록 줄임표(...)가 사용되었습니다. 어떤 명령문도 제거하지 않아야 하며, 이러한 줄임표는 기존 정책에 입력하지 않아야 합니다.

    { "Statement": [ ### BEGIN ADDING STATEMENT HERE ### { "Action": [ "events:*", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" }, ### END ADDING STATEMENT HERE ### ... ], "Version": "2012-10-17" }
    참고

    이 정책을 수정하는 IAM 엔터티에는 정책을 수정하는 IAM의 권한이 있어야 합니다.

    자세한 정보는 IAM 사용 설명서인라인 정책 작업(콘솔)에 있는 고객 관리형 정책 편집 또는 "그룹, 사용자 또는 역할에 대한 인라인 정책을 편집하거나 삭제" 단원을 참조하십시오.

  5. CloudWatch 이벤트에 규칙을 생성합니다. 이렇게 하려면 https://console.aws.amazon.com/cloudwatch에서 CloudWatch 콘솔을 엽니다.

  6. 탐색 창의 이벤트에서 규칙을 선택한 다음 규칙 생성을 선택합니다.

  7. 1단계: 규칙 생성 페이지에서 이벤트 패턴서비스별 이벤트와 일치시킬 이벤트 패턴 빌드가 선택된 상태여야 합니다.

  8. 서비스 이름에서 CodeBuild을 선택합니다. 이벤트 유형에서 모든 이벤트가 이미 선택된 상태여야 합니다.

  9. 이벤트 패턴 미리 보기에 다음 코드가 표시되어야 합니다.

    { "source": [ "aws.codebuild" ] }

    결과 비교:

  10. 편집을 선택하여 이벤트 패턴 미리 보기를 다음 두 가지 규칙 패턴 중 하나로 교체합니다.

    이 첫 번째 규칙 패턴은 빌드가 시작되거나 완료될 때 AWS CodeBuild에 지정된 빌드 프로젝트에 대해 이벤트를 트리거합니다.

    { "source": [ "aws.codebuild" ], "detail-type": [ "CodeBuild Build State Change" ], "detail": { "build-status": [ "IN_PROGRESS", "SUCCEEDED", "FAILED", "STOPPED" ], "project-name": [ "my-demo-project-1", "my-demo-project-2" ] } }

    위의 규칙에서 필요에 따라 다음 코드를 변경합니다.

    • 빌드가 시작되거나 완료될 때 이벤트를 트리거하려면 build-status 어레이에 표시된 모든 값을 그대로 두거나 build-status 어레이를 모두 제거합니다.

    • 빌드가 완료될 때만 이벤트를 트리거하려면 IN_PROGRESS 어레이에서 build-status를 제거합니다.

    • 빌드가 시작될 때만 이벤트를 트리거하려면 IN_PROGRESS 어레이에서 build-status를 제외한 모든 값을 제거합니다.

    • 모든 빌드 프로젝트에 대한 이벤트를 트리거하려면 project-name 어레이를 모두 제거합니다.

    • 개별 빌드 프로젝트에 대해서만 이벤트를 트리거하려면 project-name 어레이에 각 빌드 프로젝트의 이름을 지정합니다.

    이 두 번째 규칙 패턴은 AWS CodeBuild에 지정된 빌드 프로젝트에 대해 빌드가 한 빌드 단계에서 다른 빌드 단계로 이동할 때마다 이벤트를 트리거합니다.

    { "source": [ "aws.codebuild" ], "detail-type": [ "CodeBuild Build Phase Change" ], "detail": { "completed-phase": [ "SUBMITTED", "PROVISIONING", "DOWNLOAD_SOURCE", "INSTALL", "PRE_BUILD", "BUILD", "POST_BUILD", "UPLOAD_ARTIFACTS", "FINALIZING" ], "completed-phase-status": [ "TIMED_OUT", "STOPPED", "FAILED", "SUCCEEDED", "FAULT", "CLIENT_ERROR" ], "project-name": [ "my-demo-project-1", "my-demo-project-2" ] } }

    위의 규칙에서 필요에 따라 다음 코드를 변경합니다.

    • 모든 빌드 단계 변경(각 빌드에 대해 최대 9개의 알림을 보낼 수 있음)에 대해 이벤트를 트리거하려면 completed-phase 어레이에 표시된 모든 값을 그대로 두거나 completed-phase 어레이를 모두 제거합니다.

    • 개별 빌드 단계 변경에 대해서만 이벤트를 트리거하려면 이벤트를 트리거하지 않으려는 completed-phase 어레이에서 각 빌드 단계의 이름을 제거합니다.

    • 모든 빌드 단계 변경에 대해 이벤트를 트리거하려면 completed-phase-status 어레이에 표시된 모든 값을 그대로 두거나 completed-phase-status 어레이를 모두 제거합니다.

    • 개별 빌드 단계 상태 변경에 대해서만 이벤트를 트리거하려면 이벤트를 트리거하지 않으려는 completed-phase-status 어레이에서 각 빌드 단계 상태의 이름을 제거합니다.

    • 모든 빌드 프로젝트에 대한 이벤트를 트리거하려면 project-name 어레이를 제거합니다.

    • 개별 빌드 프로젝트에 대해 이벤트를 트리거하려면 project-name 어레이에 각 빌드 프로젝트의 이름을 지정합니다.

    참고

    빌드 상태 변경 및 빌드 단계 변경에 대한 이벤트를 트리거하려는 경우, 빌드 상태 변경에 대한 규칙 및 빌드 단계 변경을 위한 규칙이라는 두 가지 별도의 규칙을 생성해야 합니다. 두 가지 규칙을 단일 규칙으로 결합하려고 하면 결합된 해당 규칙으로 인해 예기치 않은 결과가 발생하거나 작업이 모두 중단될 수 있습니다.

    코드 교체를 완료했으면 저장을 선택합니다.

  11. 대상에서 대상 추가를 선택합니다.

  12. 대상 목록에서 SNS 주제를 선택합니다.

  13. 주제에서 이전에 식별했거나 생성한 주제를 선택합니다.

  14. 입력 구성을 확장한 후 입력 변환기를 선택합니다.

  15. 입력 경로 상자에 다음 입력 경로 중 하나를 입력합니다.

    CodeBuild Build State Changedetail-type 값을 사용하는 규칙에 대해 다음을 입력합니다.

    {"build-id":"$.detail.build-id","project-name":"$.detail.project-name","build-status":"$.detail.build-status"}

    CodeBuild Build Phase Changedetail-type 값을 사용하는 규칙에 대해 다음을 입력합니다.

    {"build-id":"$.detail.build-id","project-name":"$.detail.project-name","completed-phase":"$.detail.completed-phase","completed-phase-status":"$.detail.completed-phase-status"}

    다른 정보 유형을 얻으려면 빌드 알림 입력 형식 참조 단원을 참조하십시오.

  16. 입력 템플릿 상자에 다음 입력 템플릿 중 하나를 입력합니다.

    CodeBuild Build State Changedetail-type 값을 사용하는 규칙에 대해 다음을 입력합니다.

    "Build '<build-id>' for build project '<project-name>' has reached the build status of '<build-status>'."

    CodeBuild Build Phase Changedetail-type 값을 사용하는 규칙에 대해 다음을 입력합니다.

    "Build '<build-id>' for build project '<project-name>' has completed the build phase of '<completed-phase>' with a status of '<completed-phase-status>'."

    지금까지의 결과를 다음과 비교합니다. 이는 CodeBuild Build State Changedetail-type 값을 사용하는 규칙을 보여 줍니다.

  17. 세부 정보 구성을 선택합니다.

  18. 2단계: 규칙 세부 정보 구성 페이지에 이름 및 선택적인 설명을 입력합니다. 상태에 대해 사용을 선택한 상태로 둡니다.

    지금까지의 결과를 다음 스크린샷과 비교합니다.

  19. [Create rule]을 선택합니다.

  20. AWS CodeBuild 직접 실행에 있는 단계를 수행하여 빌드 프로젝트를 생성하고, 빌드를 실행하고, 빌드 정보를 확인합니다.

  21. CodeBuild이 현재 빌드 알림을 보내고 있는지 확인합니다. 예를 들어 빌드 알림 이메일이 현재 받은 편지함에 있는지 확인합니다.

규칙의 동작을 변경하려면 CloudWatch 콘솔에서 변경하려는 규칙을 선택한 후 작업, 편집을 차례로 선택합니다. 규칙을 변경하고 구성 세부 정보를 선택한 후 규칙 업데이트를 선택합니다.

규칙을 사용하여 빌드 알림을 보내는 것을 중지하려면 CloudWatch 콘솔에서 사용을 중지하려는 규칙을 선택한 후 작업, 비활성을 차례로 선택합니다.

규칙을 모두 삭제하려면 CloudWatch 콘솔에서 삭제하려는 규칙을 선택한 후 작업, 삭제를 차례로 선택합니다.

관련 리소스

빌드 알림 입력 형식 참조

CloudWatch는 JSON 형식의 알림을 제공합니다.

빌드 상태 변경 알림은 다음 형식을 사용합니다.

{ "version": "0", "id": "c030038d-8c4d-6141-9545-00ff7b7153EX", "detail-type": "CodeBuild Build State Change", "source": "aws.codebuild", "account": "123456789012", "time": "2017-09-01T16:14:28Z", "region": "us-west-2", "resources":[ "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX" ], "detail":{ "build-status": "SUCCEEDED", "project-name": "my-sample-project", "build-id": "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX", "additional-information": { "artifact": { "md5sum": "da9c44c8a9a3cd4b443126e823168fEX", "sha256sum": "6ccc2ae1df9d155ba83c597051611c42d60e09c6329dcb14a312cecc0a8e39EX", "location": "arn:aws:s3:::codebuild-123456789012-output-bucket/my-output-artifact.zip" }, "environment": { "image": "aws/codebuild/standard:4.0", "privileged-mode": false, "compute-type": "BUILD_GENERAL1_SMALL", "type": "LINUX_CONTAINER", "environment-variables": [] }, "timeout-in-minutes": 60, "build-complete": true, "initiator": "MyCodeBuildDemoUser", "build-start-time": "Sep 1, 2017 4:12:29 PM", "source": { "location": "codebuild-123456789012-input-bucket/my-input-artifact.zip", "type": "S3" }, "logs": { "group-name": "/aws/codebuild/my-sample-project", "stream-name": "8745a7a9-c340-456a-9166-edf953571bEX", "deep-link": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEvent:group=/aws/codebuild/my-sample-project;stream=8745a7a9-c340-456a-9166-edf953571bEX" }, "phases": [ { "phase-context": [], "start-time": "Sep 1, 2017 4:12:29 PM", "end-time": "Sep 1, 2017 4:12:29 PM", "duration-in-seconds": 0, "phase-type": "SUBMITTED", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:12:29 PM", "end-time": "Sep 1, 2017 4:13:05 PM", "duration-in-seconds": 36, "phase-type": "PROVISIONING", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:05 PM", "end-time": "Sep 1, 2017 4:13:10 PM", "duration-in-seconds": 4, "phase-type": "DOWNLOAD_SOURCE", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:10 PM", "end-time": "Sep 1, 2017 4:13:10 PM", "duration-in-seconds": 0, "phase-type": "INSTALL", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:10 PM", "end-time": "Sep 1, 2017 4:13:10 PM", "duration-in-seconds": 0, "phase-type": "PRE_BUILD", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:10 PM", "end-time": "Sep 1, 2017 4:14:21 PM", "duration-in-seconds": 70, "phase-type": "BUILD", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:14:21 PM", "end-time": "Sep 1, 2017 4:14:21 PM", "duration-in-seconds": 0, "phase-type": "POST_BUILD", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:14:21 PM", "end-time": "Sep 1, 2017 4:14:21 PM", "duration-in-seconds": 0, "phase-type": "UPLOAD_ARTIFACTS", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:14:21 PM", "end-time": "Sep 1, 2017 4:14:26 PM", "duration-in-seconds": 4, "phase-type": "FINALIZING", "phase-status": "SUCCEEDED" }, { "start-time": "Sep 1, 2017 4:14:26 PM", "phase-type": "COMPLETED" } ] }, "current-phase": "COMPLETED", "current-phase-context": "[]", "version": "1" } }

빌드 단계 변경 알림은 다음 형식을 사용합니다.

{ "version": "0", "id": "43ddc2bd-af76-9ca5-2dc7-b695e15adeEX", "detail-type": "CodeBuild Build Phase Change", "source": "aws.codebuild", "account": "123456789012", "time": "2017-09-01T16:14:21Z", "region": "us-west-2", "resources":[ "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX" ], "detail":{ "completed-phase": "COMPLETED", "project-name": "my-sample-project", "build-id": "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX", "completed-phase-context": "[]", "additional-information": { "artifact": { "md5sum": "da9c44c8a9a3cd4b443126e823168fEX", "sha256sum": "6ccc2ae1df9d155ba83c597051611c42d60e09c6329dcb14a312cecc0a8e39EX", "location": "arn:aws:s3:::codebuild-123456789012-output-bucket/my-output-artifact.zip" }, "environment": { "image": "aws/codebuild/standard:4.0", "privileged-mode": false, "compute-type": "BUILD_GENERAL1_SMALL", "type": "LINUX_CONTAINER", "environment-variables": [] }, "timeout-in-minutes": 60, "build-complete": true, "initiator": "MyCodeBuildDemoUser", "build-start-time": "Sep 1, 2017 4:12:29 PM", "source": { "location": "codebuild-123456789012-input-bucket/my-input-artifact.zip", "type": "S3" }, "logs": { "group-name": "/aws/codebuild/my-sample-project", "stream-name": "8745a7a9-c340-456a-9166-edf953571bEX", "deep-link": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEvent:group=/aws/codebuild/my-sample-project;stream=8745a7a9-c340-456a-9166-edf953571bEX" }, "phases": [ { "phase-context": [], "start-time": "Sep 1, 2017 4:12:29 PM", "end-time": "Sep 1, 2017 4:12:29 PM", "duration-in-seconds": 0, "phase-type": "SUBMITTED", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:12:29 PM", "end-time": "Sep 1, 2017 4:13:05 PM", "duration-in-seconds": 36, "phase-type": "PROVISIONING", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:05 PM", "end-time": "Sep 1, 2017 4:13:10 PM", "duration-in-seconds": 4, "phase-type": "DOWNLOAD_SOURCE", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:10 PM", "end-time": "Sep 1, 2017 4:13:10 PM", "duration-in-seconds": 0, "phase-type": "INSTALL", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:10 PM", "end-time": "Sep 1, 2017 4:13:10 PM", "duration-in-seconds": 0, "phase-type": "PRE_BUILD", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:10 PM", "end-time": "Sep 1, 2017 4:14:21 PM", "duration-in-seconds": 70, "phase-type": "BUILD", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:14:21 PM", "end-time": "Sep 1, 2017 4:14:21 PM", "duration-in-seconds": 0, "phase-type": "POST_BUILD", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:14:21 PM", "end-time": "Sep 1, 2017 4:14:21 PM", "duration-in-seconds": 0, "phase-type": "UPLOAD_ARTIFACTS", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:14:21 PM", "end-time": "Sep 1, 2017 4:14:26 PM", "duration-in-seconds": 4, "phase-type": "FINALIZING", "phase-status": "SUCCEEDED" }, { "start-time": "Sep 1, 2017 4:14:26 PM", "phase-type": "COMPLETED" } ] }, "completed-phase-status": "SUCCEEDED", "completed-phase-duration-seconds": 4, "version": "1", "completed-phase-start": "Sep 1, 2017 4:14:21 PM", "completed-phase-end": "Sep 1, 2017 4:14:26 PM" } }