

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# CodeBuild에 대한 교차 서비스 샘플
<a name="cross-service-samples"></a>

이러한 교차 서비스 샘플을 사용하여 AWS CodeBuild다음을 실험할 수 있습니다.

[Amazon ECR 샘플](sample-ecr.md)  
Amazon ECR 리포지토리의 도커 이미지를 사용하여 Apache Maven을 사용하여 단일 JAR 파일을 생성합니다. 샘플 지침은 Docker 이미지를 생성하여 Amazon ECR에 푸시하고, Go 프로젝트를 생성하고, 프로젝트를 빌드하고, 프로젝트를 실행하고, CodeBuild가 Amazon ECR에 연결할 수 있는 권한을 설정하는 방법을 보여줍니다.

[Amazon EFS 샘플](sample-efs.md)  
CodeBuild 프로젝트가 Amazon EFS 파일 시스템에 마운트 및 빌드하도록 buildspec 파일을 구성하는 방법을 보여 줍니다. 샘플 지침은 Amazon VPC를 생성하고, Amazon VPC에서 파일 시스템을 생성하고, Amazon VPC를 사용하는 프로젝트를 생성 및 빌드한 다음 생성된 프로젝트 파일 및 변수를 검토하는 방법을 보여줍니다.

[AWS CodePipeline 샘플](sample-codepipeline.md)  
를 AWS CodePipeline 사용하여 배치 빌드와 여러 입력 소스 및 여러 출력 아티팩트가 포함된 빌드를 생성하는 방법을 보여줍니다. 이 섹션에는 별도의 아티팩트와 결합된 아티팩트를 사용하여 배치 빌드를 생성하는 파이프라인 구조를 보여주는 예제 JSON 파일이 포함되어 있습니다. 여러 입력 소스와 여러 출력 아티팩트가 있는 파이프라인 구조를 보여주는 추가 JSON 샘플이 제공됩니다.

[AWS Config 샘플](how-to-integrate-config.md)  
설정 방법을 보여줍니다 AWS Config. 추적되는 CodeBuild 리소스를 나열하고 CodeBuild 프로젝트를 조회하는 방법을 설명합니다 AWS Config. 샘플 지침은와 통합하기 위한 사전 조건 AWS Config, 설정 단계 AWS Config, CodeBuild 프로젝트 및 데이터를 조회하는 단계를 보여줍니다 AWS Config.

[빌드 알림 샘플](sample-build-notifications.md)  
Apache Maven을 사용하여 단일 JAR 파일을 생성합니다. Amazon SNS 주제 구독자에게 빌드 알림을 보냅니다. 샘플 지침은 CodeBuild가 Amazon SNS 및 CloudWatch와 통신할 수 있도록 권한을 설정하는 방법, Amazon SNS에서 CodeBuild 주제를 생성하고 식별하는 방법, 주제에 대한 수신자를 구독하는 방법, CloudWatch에서 규칙을 설정하는 방법을 보여줍니다.

# CodeBuild용 Amazon ECR 샘플
<a name="sample-ecr"></a>

이 샘플에서는 Amazon Elastic Container Registry(Amazon ECR) 이미지 리포지토리에 있는 도커 이미지를 사용하여 샘플 Go 프로젝트를 빌드합니다.

**중요**  
이 샘플을 실행하면 AWS 계정에 요금이 부과될 수 있습니다. 여기에는 Amazon S3, , AWS KMS CloudWatch Logs AWS CodeBuild 및 Amazon ECR과 관련된 AWS 리소스 및 작업에 대한 및 요금이 포함됩니다. 자세한 내용은 [CodeBuild 요금](https://aws.amazon.com/codebuild/pricing), [Amazon S3 요금](https://aws.amazon.com/s3/pricing), [AWS Key Management Service 요금](https://aws.amazon.com/kms/pricing), [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing), [Amazon Elastic Container Registry 요금](https://aws.amazon.com/ecr/pricing)을 참조하세요.

**Topics**
+ [Amazon ECR 샘플 실행](#sample-ecr-running)

## Amazon ECR 샘플 실행
<a name="sample-ecr-running"></a>

다음 지침에 따라 CodeBuild용 Amazon ECR 샘플을 실행합니다.

**이 샘플을 실행하려면**

1. Docker 이미지를 생성하고 Amazon ECR의 이미지 리포지토리에 푸시하려면, ['Amazon ECR에 Docker 이미지 게시' 샘플](sample-docker.md)의 ['Amazon ECR에 Docker 이미지 게시' 샘플 실행](sample-docker.md#sample-docker-running) 섹션에 있는 단계를 수행하세요.

1. Go 프로젝트 만들기: 

   1. 이 주제의 [Go 프로젝트 구조](#ecr-sample-go-project-file-structure) 및 [Go 프로젝트 파일](#sample-ecr-go-project-files) 섹션에 설명된 대로 파일을 생성한 다음 S3 입력 버킷 또는 AWS CodeCommit, GitHub 또는 Bitbucket 리포지토리에 업로드합니다.
**중요**  
`(root directory name)`은 업로드하지 말고, `(root directory name)` 안에 있는 파일만 업로드하십시오.  
S3 입력 버킷을 사용하고 있는 경우, 파일을 포함하는 ZIP 파일을 생성한 다음, 이를 입력 버킷에 업로드하십시오. `(root directory name)`을 ZIP 파일에 추가하지 말고, `(root directory name)` 안에 있는 파일만 추가하십시오.

   1. 빌드 프로젝트를 생성하고, 빌드를 실행하고, 관련 빌드 정보를 확인합니다.

       AWS CLI 를 사용하여 빌드 프로젝트를 생성하는 경우 `create-project` 명령에 대한 JSON 형식의 입력이 이와 비슷할 수 있습니다. (자리 표시자는 사용자의 값으로 바꾸십시오.)

      ```
      {
        "name": "sample-go-project",
        "source": {
          "type": "S3",
          "location": "codebuild-region-ID-account-ID-input-bucket/GoSample.zip"
        },
        "artifacts": {
          "type": "S3",
          "location": "codebuild-region-ID-account-ID-output-bucket",
          "packaging": "ZIP",
          "name": "GoOutputArtifact.zip"
        },
        "environment": {
          "type": "LINUX_CONTAINER",
          "image": "aws/codebuild/standard:5.0",
          "computeType": "BUILD_GENERAL1_SMALL"
        },
        "serviceRole": "arn:aws:iam::account-ID:role/role-name",
        "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"
      }
      ```

   1. 빌드 출력 아티팩트를 가져오려면 S3 출력 버킷을 엽니다.

   1. `GoOutputArtifact.zip` 파일을 로컬 컴퓨터나 인스턴스에 다운로드한 다음 파일의 내용을 추출합니다. 추출한 내용에서 `hello` 파일을 가져옵니다.

1.  다음 중 하나가 true인 경우가 도커 이미지를 빌드 환경으로 가져올 AWS CodeBuild 수 있도록 Amazon ECR의 이미지 리포지토리에 권한을 추가해야 합니다.
   +  프로젝트에서는 CodeBuild 보안 인증을 사용하여 Amazon ECR 이미지를 끌어옵니다. 이는 `ProjectEnvironment`의 `imagePullCredentialsType` 속성에 `CODEBUILD` 값으로 표시됩니다.
   +  프로젝트에서는 교차 계정 Amazon ECR 이미지를 사용합니다. 이 경우에는 프로젝트에서 서비스 역할을 사용하여 Amazon ECR 이미지를 끌어와야 합니다. 이 동작을 활성화하려면 `ProjectEnvironment`의 `imagePullCredentialsType` 속성을 `SERVICE_ROLE`로 설정합니다.

   1. Amazon ECR 콘솔([https://console.aws.amazon.com/ecr/](https://console.aws.amazon.com/ecr/))을 엽니다.

   1. 리포지토리 이름 목록에서 생성했거나 선택한 리포지토리의 이름을 선택합니다.

   1. 탐색 창에서 **권한**을 선택하고, **편집**을 선택한 다음 **설명문 추가**를 선택합니다.

   1. **Statement name(설명문 이름)**에 식별자(예: **CodeBuildAccess**)를 입력합니다.

   1. **효과**에 대해 **허용**이 선택된 채로 둡니다. 이는 다른 AWS 계정으로의 액세스를 허용하겠다는 의미입니다.

   1. **보안 주체**에 대해 다음 중 하나를 실시합니다.
      + 프로젝트에서 CodeBuild 보안 인증을 사용하여 Amazon ECR 이미지를 끌어오는 경우 **서비스 보안 주체**에 **codebuild.amazonaws.com**을 입력합니다.
      + 프로젝트에서 교차 계정 Amazon ECR 이미지를 사용할 경우에는 **AWS 계정 ID**에 액세스 권한을 부여할 AWS 계정의 ID를 입력합니다.

   1. **All IAM entities(모든 IAM 엔터티)** 목록을 건너뜁니다.

   1. **작업**은 가져오기 전용 작업인 **ecr:GetDownloadUrlForLayer**, **ecr:BatchGetImage** 및 **ecr:BatchCheckLayerAvailability**를 선택합니다.

   1. **조건**에 다음을 추가합니다.

      ```
      {
         "StringEquals":{
            "aws:SourceAccount":"<AWS-account-ID>",
            "aws:SourceArn":"arn:aws:codebuild:<region>:<AWS-account-ID>:project/<project-name>"
         }
      }
      ```

   1. **저장**을 선택합니다.

      이 정책이 **Permissions(권한)**에 표시됩니다. 보안 주체는 이 절차의 3단계에서 **보안 주체**에 입력한 내용입니다.
      + 프로젝트에서 CodeBuild 보안 인증을 사용하여 Amazon ECR 이미지를 끌어오는 경우 **서비스 보안 주체** 아래에 `"codebuild.amazonaws.com"`이 나타납니다.
      + 프로젝트에서 교차 계정 Amazon ECR 이미지를 사용하는 경우 액세스 권한을 부여하려는 AWS 계정의 ID가 **AWS 계정 IDs** 아래에 나타납니다.

        다음 샘플 정책은 CodeBuild 보안 인증과 교차 계정 Amazon ECR 이미지를 모두 사용합니다.

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "CodeBuildAccessPrincipal",
                  "Effect": "Allow",
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ],
                  "Resource": "*",
                  "Condition": {
                      "StringEquals": {
                          "aws:SourceArn": "arn:aws:codebuild:us-east-1:111122223333:project/MyProject",
                          "aws:SourceAccount": "111122223333"
                      }
                  }
              },
              {
                  "Sid": "CodeBuildAccessCrossAccount",
                  "Effect": "Allow",
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ],
                  "Resource": "*"
              }
          ]
      }
      ```

------
      + 프로젝트에서 CodeBuild 보안 인증을 사용하고 CodeBuild 프로젝트에서 Amazon ECR 리포지토리에 대한 퍼블릭 액세스 권한을 갖도록 하려면 `Condition` 키를 생략하고 다음 샘플 정책을 추가할 수 있습니다.

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "CodeBuildAccessPrincipal",
                  "Effect": "Allow",
                  "Resource": [
                      "arn:aws:codecommit:us-east-2:111122223333:MySharedDemoRepo"
                  ],
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ]
              },
              {
                  "Sid": "CodeBuildAccessCrossAccount",
                  "Effect": "Allow",
                  "Resource": [
                      "arn:aws:codecommit:us-east-2:111122223333:MySharedDemoRepo"
                  ],
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ]
              }
          ]
      }
      ```

------

1. 빌드 프로젝트를 생성하고, 빌드를 실행하고, 빌드 정보를 확인합니다.

    AWS CLI 를 사용하여 빌드 프로젝트를 생성하는 경우 `create-project` 명령에 대한 JSON 형식의 입력이 이와 비슷할 수 있습니다. (자리 표시자는 사용자의 값으로 바꾸십시오.)

   ```
   {
     "name": "amazon-ecr-sample-project",
     "source": {
       "type": "S3",
       "location": "codebuild-region-ID-account-ID-input-bucket/GoSample.zip"
     },
     "artifacts": {
       "type": "S3",
       "location": "codebuild-region-ID-account-ID-output-bucket",
       "packaging": "ZIP",
       "name": "GoOutputArtifact.zip"
     },
     "environment": {
       "type": "LINUX_CONTAINER",
       "image": "account-ID.dkr.ecr.region-ID.amazonaws.com/your-Amazon-ECR-repo-name:tag",
       "computeType": "BUILD_GENERAL1_SMALL"
     },
     "serviceRole": "arn:aws:iam::account-ID:role/role-name",
     "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"
   }
   ```

1. 빌드 출력 아티팩트를 가져오려면 S3 출력 버킷을 엽니다.

1. `GoOutputArtifact.zip` 파일을 로컬 컴퓨터나 인스턴스에 다운로드한 다음 `GoOutputArtifact.zip` 파일의 내용을 추출합니다. 추출한 내용에서 `hello` 파일을 가져옵니다.

### Go 프로젝트 구조
<a name="ecr-sample-go-project-file-structure"></a>

이 샘플에서는 다음 디렉터리 구조를 가정합니다.

```
(root directory name)
├── buildspec.yml
└── hello.go
```

### Go 프로젝트 파일
<a name="sample-ecr-go-project-files"></a>

이 샘플은 다음 파일을 사용합니다.

`buildspec.yml`(`(root directory name)`에 있음)

```
version: 0.2

phases:
  install: 
   runtime-versions: 
     golang: 1.13 
  build:
    commands:
      - echo Build started on `date`
      - echo Compiling the Go code
      - go build hello.go 
  post_build:
    commands:
      - echo Build completed on `date`
artifacts:
  files:
    - hello
```

`hello.go`(`(root directory name)`에 있음)

```
package main
import "fmt"

func main() {
  fmt.Println("hello world")
  fmt.Println("1+1 =", 1+1)
  fmt.Println("7.0/3.0 =", 7.0/3.0)
  fmt.Println(true && false)
  fmt.Println(true || false)
  fmt.Println(!true)
}
```

# 용 Amazon Elastic File System 샘플 AWS CodeBuild
<a name="sample-efs"></a>

 Amazon EC2 인스턴스에 대한 확장 가능한 공유 파일 서비스인 Amazon Elastic File System에서 AWS CodeBuild 빌드를 생성할 수 있습니다. Amazon EC2 Amazon EFS를 통한 스토리지 용량은 탄력적이므로 파일이 추가 및 제거될 때 확장되거나 축소됩니다. 또한 파일 시스템을 만들고 구성할 수 있는 간편한 웹 서비스 인터페이스를 제공합니다. 이 서비스는 모든 파일 스토리지 인프라를 관리하므로, 파일 시스템 구성을 배포하거나 패치를 적용하거나 유지 보수하는 데 신경을 쓸 필요가 없습니다. 자세한 내용은 Amazon Elastic File System 사용 설명서에서 [Amazon Elastic File System이란?](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html)을 참조하세요.**

 이 예제는 Amazon EFS 파일 시스템에 Java 애플리케이션을 마운트 및 빌드하도록 CodeBuild 프로젝트를 구성하는 방법을 보여 줍니다. 시작하기 전에 S3 입력 버킷 또는 AWS CodeCommit GitHub, GitHub Enterprise Server 또는 Bitbucket 리포지토리에 업로드되는 Java 애플리케이션을 빌드할 준비가 되어 있어야 합니다.

파일 시스템에 전송되는 데이터는 암호화됩니다. 다른 이미지를 사용하여 전송 중인 데이터를 암호화하려면 [전송 중 데이터 암호화](https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html)를 참조하십시오.

**Topics**
+ [Amazon Elastic File System과 AWS CodeBuild 함께 사용](#sample-efs-high-level-steps)
+ [Amazon EFS 통합 문제 해결](sample-efs-troubleshooting.md)

## Amazon Elastic File System과 AWS CodeBuild 함께 사용
<a name="sample-efs-high-level-steps"></a>

이 샘플에서는 Amazon EFS를와 함께 사용하는 데 필요한 4가지 상위 수준 단계를 다룹니다 AWS CodeBuild. 스크립트는 다음과 같습니다.

1.  AWS 계정에서 Virtual Private Cloud(VPC)를 생성합니다.

1. 이 VPC를 사용하는 파일 시스템을 생성합니다.

1. VPC를 사용하는 CodeBuild 프로젝트를 생성하고 빌드합니다. CodeBuild 프로젝트는 다음을 사용하여 파일 시스템을 식별합니다.
   +  고유한 파일 시스템 식별자. 식별자는 빌드 프로젝트에서 파일 시스템을 지정할 때 선택합니다.
   + 파일 시스템 ID. Amazon EFS 콘솔에서 파일 시스템을 볼 때 ID가 표시됩니다.
   +  탑재 지점. 파일 시스템을 탑재하는 Docker 컨테이너에 있는 디렉터리입니다.
   + 탑재 옵션. 여기에는 파일 시스템을 탑재하는 방법에 대한 세부 정보가 포함됩니다.

1. 빌드 프로젝트를 검토하여 올바른 프로젝트 파일과 변수가 생성되었는지 확인합니다.

**참고**  
 Amazon EFS에서 생성한 파일 시스템은 Linux 플랫폼에서만 지원됩니다.

 

**Topics**
+ [1단계:를 사용하여 VPC 생성 CloudFormation](#sample-efs-create-vpc)
+ [2단계: VPC에서 Amazon Elastic File System 파일 시스템 생성](#sample-efs-create-efs)
+ [3단계: Amazon EFS에서 사용할 CodeBuild 프로젝트 생성](#sample-efs-create-acb)
+ [4단계: 빌드 프로젝트 검토](#sample-efs-summary)

### 1단계:를 사용하여 VPC 생성 CloudFormation
<a name="sample-efs-create-vpc"></a>

 CloudFormation 템플릿을 사용하여 VPC를 생성합니다.

1.  의 지침에 따라 [CloudFormation VPC 템플릿](cloudformation-vpc-template.md)를 CloudFormation 사용하여 VPC를 생성합니다.
**참고**  
 이 CloudFormation 템플릿으로 생성된 VPC에는 프라이빗 서브넷 2개와 퍼블릭 서브넷 2개가 있습니다. AWS CodeBuild 을 사용하여 Amazon EFS에서 생성한 파일 시스템을 탑재할 때는 프라이빗 서브넷만 사용해야 합니다. 퍼블릭 서브넷 중 하나를 사용할 경우 빌드가 실패합니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) Amazon VPC 콘솔을 엽니다.

1.  생성한 VPC를 선택합니다 CloudFormation.

1. **설명** 탭에 표시된 VPC의 이름과 ID를 기록해 둡니다. VPC 이름과 ID 모두 이 예제 뒷부분에서 AWS CodeBuild 프로젝트를 만들 때 필요합니다.

### 2단계: VPC에서 Amazon Elastic File System 파일 시스템 생성
<a name="sample-efs-create-efs"></a>

 이 예제를 위해 앞에서 만든 VPC를 사용하여 간단한 Amazon EFS 파일 시스템을 생성합니다.

1. 에 로그인 AWS Management Console 하고 [ https://console.aws.amazon.com/efs/](https://console.aws.amazon.com/efs/) Amazon EFS 콘솔을 엽니다.

1.  **파일 시스템 생성**을 선택합니다.

1.  이 예제 앞부분에서 기록해 둔 VPC 이름을 **VPC**에서 선택합니다.

1.  가용 영역은 선택한 서브넷과 연결된 채로 둡니다.

1.  **다음 단계**를 선택합니다.

1.  **태그 추가**에서 기본 **이름** 키의 **값**에 Amazon EFS 파일 시스템의 이름을 입력합니다.

1.  기본 성능 및 처리량 모드로 선택한 **Bursting(버스팅)** 및 **범용** 모드를 그대로 두고 **다음 단계**를 선택합니다.

1. **클라이언트 액세스 구성**에서 **다음 단계**를 선택합니다.

1.  **파일 시스템 생성**을 선택합니다.

1.  (선택 사항) 전송 중 데이터를 암호화하는 정책을 Amazon EFS 파일 시스템에 추가하는 것이 좋습니다. Amazon EFS 콘솔에서 **파일 시스템 정책**을 선택하고 **편집**을 선택한 다음, **모든 클라이언트에 전송 중 암호화 적용**이라는 레이블이 붙은 상자를 선택하고 **저장**을 선택합니다.

### 3단계: Amazon EFS에서 사용할 CodeBuild 프로젝트 생성
<a name="sample-efs-create-acb"></a>

 이 샘플의 앞부분에서 생성한 VPC를 사용하는 AWS CodeBuild 프로젝트를 생성합니다. 빌드가 실행되면 이전에 생성된 Amazon EFS 파일 시스템을 탑재합니다. 그런 다음 Java 애플리케이션에서 생성된 .jar 파일을 파일 시스템의 탑재 지점 디렉터리에 저장합니다.

1. [https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) AWS CodeBuild 콘솔을 엽니다.

1.  탐색 창에서 **빌드 프로젝트**를 선택한 후 **빌드 프로젝트 생성**을 선택합니다.

1.  **프로젝트 이름**에 프로젝트의 이름을 입력합니다.

1.  **소스 공급자**에서 빌드하려는 Java 애플리케이션을 포함하는 리포지토리를 선택합니다.

1.  CodeBuild가 애플리케이션을 찾기 위해 사용하는 리포지토리 URL 등과 같은 정보를 입력합니다. 옵션은 소스 공급자마다 다릅니다. 자세한 내용은 [Choose source provider](create-project.md#create-project-source-provider) 단원을 참조하십시오.

1.  **환경 이미지**에서 **관리형 이미지**를 선택합니다.

1.  **운영 체제**에서 **Amazon Linux 2**를 선택합니다.

1. **런타임**에서 **표준**을 선택합니다.

1.  **이미지**에서 **aws/codebuild/amazonlinux-x86\$164-standard:4.0**을 선택합니다.

1.  **환경 유형**에서 **Linux**를 선택합니다.

1.  **서비스 역할**에서 **새 서비스 역할**을 선택합니다. **역할 이름**에 CodeBuild가 생성할 역할 이름을 입력합니다.

1. **추가 구성**을 확장합니다.

1.  **Docker 이미지를 빌드하거나 빌드에서 승격된 권한을 얻으려는 경우 이 플래그 활성화**를 선택합니다.
**참고**  
기본적으로 비 VPC 빌드에는 Docker 데몬이 활성화됩니다. VPC 빌드에 Docker 컨테이너를 사용하려면 Docker Docs 웹 사이트의 [런타임 권한 및 Linux 기능](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)을 참조하고 권한 부여 모드를 활성화합니다. 또한 Windows는 권한 모드를 지원하지 않습니다.

1.  **VPC**에서 VPC ID를 선택합니다.

1.  **서브넷**에서 VPC에 연결된 프라이빗 서브넷을 한 개 이상 선택합니다. Amazon EFS 파일 시스템을 마운트하는 빌드에 프라이빗 서브넷을 사용해야 합니다. 퍼블릭 서브넷을 사용할 경우 빌드가 실패합니다.

1.  **보안 그룹**에서 기본 보안 그룹을 선택합니다.

1.  **파일 시스템**에 다음 정보를 입력합니다.
   + **식별자**에 고유한 파일 시스템 식별자를 입력합니다. 길이는 129자 미만이어야 하고 영숫자 문자와 밑줄만 사용할 수 있습니다. CodeBuild는 이 식별자를 사용하여 탄력적 파일 시스템을 식별하는 환경 변수를 생성합니다. 환경 변수 형식은 `CODEBUILD_<file_system_identifier>`(대문자)입니다. 예를 들어 `my_efs`을 입력하면 환경 변수는 `CODEBUILD_MY_EFS`입니다.
   + **ID**에서 파일 시스템 ID를 선택합니다.
   + (선택 사항) 파일 시스템에 디렉터리를 입력합니다. CodeBuild는 이 디렉터리를 탑재합니다. **디렉터리 경로**를 비워 두면 CodeBuild에서 전체 파일 시스템을 탑재합니다. 경로는 파일 시스템의 루트와 관련이 있습니다.
   + **탑재 지점**에 파일 시스템을 탑재하는 빌드 컨테이너의 디렉터리 절대 경로를 입력합니다. 이 디렉터리가 없으면 CodeBuild에서 빌드 중에 생성됩니다.
   + (선택 사항) 탑재 옵션을 입력합니다. **탑재 옵션**을 비워 두면 CodeBuild에서는 기본 탑재 옵션을 사용합니다.

     ```
     nfsvers=4.1
     rsize=1048576
     wsize=1048576
     hard
     timeo=600
     retrans=2
     ```

     자세한 내용은 Amazon Elastic File System 사용 설명서의 [권장되는 NFS 탑재 옵션](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs-nfs-mount-settings.html)을 참조하세요.**

1.  **빌드 사양**에서 **빌드 명령 삽입**을 선택한 후 **편집기로 전환**을 선택합니다.

1.  편집기에 다음 buildspec 명령을 입력합니다. 17단계에서 입력한 식별자로 `<file_system_identifier>`를 바꿉니다. 대문자(예: `CODEBUILD_MY_EFS`)를 사용합니다.

   ```
   version: 0.2
   phases:
     install:
       runtime-versions:
         java: corretto11    
     build:
       commands:
         - mvn compile -Dgpg.skip=true -Dmaven.repo.local=$CODEBUILD_<file_system_identifier>
   ```

1.  기타 모든 설정에 대해 기본값을 사용하고 **빌드 프로젝트 생성**을 선택합니다. 빌드가 완료되면 프로젝트의 콘솔 페이지가 표시됩니다.

1.  **빌드 시작**를 선택합니다.

### 4단계: 빌드 프로젝트 검토
<a name="sample-efs-summary"></a>



 AWS CodeBuild 프로젝트를 빌드한 후: 
+  Amazon EFS 파일 시스템에 빌드된 Java 애플리케이션에서 생성된 .jar 파일을 탑재 지점 디렉터리에 저장합니다.
+  파일 시스템을 식별하는 환경 변수는 프로젝트를 만들 때 입력한 파일 시스템 식별자를 사용하여 생성됩니다.

 자세한 내용은 Amazon Elastic File System 사용 설명서에서 [파일 시스템 탑재](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs.html)를 참조하세요.**

# Amazon EFS 통합 문제 해결
<a name="sample-efs-troubleshooting"></a>

CodeBuild로 Amazon EFS를 설정할 때 발생할 수 있는 오류는 다음과 같습니다.

**Topics**
+ [CLIENT\$1ERROR: '127.0.0.1:/' 탑재에 실패했습니다. 권한이 거부되었습니다.](#sample-efs-troubleshooting.permission-denied)
+ [CLIENT\$1ERROR: '127.0.0.1:/' 탑재에 실패했습니다. 피어에서 연결을 재설정했습니다.](#sample-efs-troubleshooting.connection-reset)
+ [VPC\$1CLIENT\$1ERROR: 예상치 못한 EC2 오류: UnauthorizedOperation](#sample-efs-troubleshooting.unauthorized-operation)

## CLIENT\$1ERROR: '127.0.0.1:/' 탑재에 실패했습니다. 권한이 거부되었습니다.
<a name="sample-efs-troubleshooting.permission-denied"></a>

CodeBuild로 Amazon EFS를 탑재하는 데는 IAM 인증이 지원되지 않습니다. 사용자 지정 Amazon EFS 파일 시스템 정책을 사용하는 경우 모든 IAM 보안 주체에 읽기 및 쓰기 액세스 권한을 부여해야 합니다. 예제:

```
"Principal": {
  "AWS": "*"
}
```

## CLIENT\$1ERROR: '127.0.0.1:/' 탑재에 실패했습니다. 피어에서 연결을 재설정했습니다.
<a name="sample-efs-troubleshooting.connection-reset"></a>

이 오류의 가능한 두 가지 원인은 다음과 같습니다.
+ CodeBuild VPC 서브넷은 Amazon EFS 탑재 대상과 다른 가용 영역에 있습니다. Amazon EFS 탑재 대상과 동일한 가용 영역에 VPC 서브넷을 추가하여 이 문제를 해결할 수 있습니다.
+ 보안 그룹에는 Amazon EFS와 통신할 권한이 없습니다. VPC(VPC의 기본 CIDR 블록 추가) 또는 보안 그룹 자체에서 들어오는 모든 트래픽을 허용하는 인바운드 규칙을 추가하여 이 문제를 해결할 수 있습니다.

## VPC\$1CLIENT\$1ERROR: 예상치 못한 EC2 오류: UnauthorizedOperation
<a name="sample-efs-troubleshooting.unauthorized-operation"></a>

이 오류는 CodeBuild 프로젝트의 VPC 구성에 있는 모든 서브넷이 퍼블릭 서브넷일 때 발생합니다. 네트워크 연결을 보장하려면 VPC에 프라이빗 서브넷이 하나 이상 있어야 합니다.

# AWS CodePipeline CodeBuild용 샘플
<a name="sample-codepipeline"></a>

이 섹션에서는 CodePipeline과 CodeBuild 간의 샘플 통합에 대해 설명합니다.


| 샘플 | 설명 | 
| --- | --- | 
|  [CodePipeline/CodeBuild 통합 및 배치 빌드 샘플](#sample-pipeline-batch)  |  이 샘플은를 AWS CodePipeline 사용하여 배치 빌드를 사용하는 빌드 프로젝트를 생성하는 방법을 보여줍니다.  | 
|  [CodePipeline/CodeBuild와 다중 입력 소스 및 출력 아티팩트 통합 샘플](#sample-pipeline-multi-input-output)  |  이 샘플은를 AWS CodePipeline 사용하여 여러 입력 소스를 사용하여 여러 출력 아티팩트를 생성하는 빌드 프로젝트를 생성하는 방법을 보여줍니다.  | 

## CodePipeline/CodeBuild 통합 및 배치 빌드 샘플
<a name="sample-pipeline-batch"></a>

AWS CodeBuild 는 배치 빌드를 지원합니다. 다음 샘플은를 AWS CodePipeline 사용하여 배치 빌드를 사용하는 빌드 프로젝트를 생성하는 방법을 보여줍니다.

파이프라인의 구조를 정의하는 JSON 형식 파일을 사용한 다음와 함께 사용하여 파이프라인 AWS CLI 을 생성할 수 있습니다. 자세한 내용은AWS CodePipeline 사용 설명서의 [AWS CodePipeline 파이프라인 구조 참조](https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html)를 참조하세요.**

### 개별 아티팩트를 사용한 배치 빌드
<a name="sample-pipeline-batch.separate-artifacts"></a>

다음 JSON 파일을 별도의 아티팩트가 있는 배치 빌드를 생성하는 파이프라인 구조의 예로 사용하세요. CodePipeline에서 배치 빌드를 활성화하려면 `configuration` 객체의 `BatchEnabled` 파라미터를 `true`로 설정합니다.

```
{
  "pipeline": {
    "roleArn": "arn:aws:iam::account-id:role/my-AWS-CodePipeline-service-role-name",
    "stages": [
      {
        "name": "Source",
        "actions": [
          {
            "inputArtifacts": [],
            "name": "Source1",
            "actionTypeId": {
              "category": "Source",
              "owner": "AWS",
              "version": "1",
              "provider": "S3"
            },
            "outputArtifacts": [
              {
                "name": "source1"
              }
            ],
            "configuration": {
              "S3Bucket": "<my-input-bucket-name>",
              "S3ObjectKey": "my-source-code-file-name.zip"
            },
            "runOrder": 1
          },
          {
            "inputArtifacts": [],
            "name": "Source2",
            "actionTypeId": {
              "category": "Source",
              "owner": "AWS",
              "version": "1",
              "provider": "S3"
            },
            "outputArtifacts": [
              {
                "name": "source2"
              }
            ],
            "configuration": {
              "S3Bucket": "<my-other-input-bucket-name>",
              "S3ObjectKey": "my-other-source-code-file-name.zip"
            },
            "runOrder": 1
          }
        ]
      },
      {
        "name": "Build",
        "actions": [
          {
            "inputArtifacts": [
              {
                "name": "source1"
              },
              {
                "name": "source2"
              }
            ],
            "name": "Build",
            "actionTypeId": {
              "category": "Build",
              "owner": "AWS",
              "version": "1",
              "provider": "CodeBuild"
            },
            "outputArtifacts": [
              {
                "name": "build1"
              },
              {
                "name": "build1_artifact1"
              },
              {
                "name": "build1_artifact2"
              },
              {
                "name": "build2_artifact1"
              },
              {
                "name": "build2_artifact2"
              }
            ],
            "configuration": {
              "ProjectName": "my-build-project-name",
              "PrimarySource": "source1",
              "BatchEnabled": "true"
            },
            "runOrder": 1
          }
        ]
      }
    ],
    "artifactStore": {
      "type": "S3",
      "location": "<AWS-CodePipeline-internal-bucket-name>"
    },
    "name": "my-pipeline-name",
    "version": 1
  }
}
```

다음은 이 파이프라인 구성과 함께 작동하는 CodeBuild buildspec 파일의 예입니다.

```
version: 0.2
batch:
  build-list:
    - identifier: build1
      env:
        compute-type: BUILD_GENERAL1_SMALL
    - identifier: build2
      env:
        compute-type: BUILD_GENERAL1_MEDIUM

phases:
  build:
    commands:
      - echo 'file' > output_file

artifacts:
  files:
    - output_file
  secondary-artifacts:
    artifact1:
      files:
        - output_file
    artifact2:
      files:
        - output_file
```

파이프라인의 JSON 파일에서 지정하는 출력 아티팩트의 이름은 buildspec 파일에서 정의하는 빌드 및 아티팩트의 식별자와 일치해야 합니다. 구문은 기본 아티팩트의 경우 *buildIdentifier*이고 보조 아티팩트의 경우 *buildIdentifier*\$1*artifactIdentifier*입니다.

예를 들어 출력 아티팩트 이름 `build1`의 경우 CodeBuild는 `build1`의 기본 아티팩트를 `build1`의 위치에 업로드합니다. 출력 이름 `build1_artifact1`의 경우 CodeBuild는 `build1`의 보조 아티팩트 `artifact1`을 `build1_artifact1` 위치에 업로드하는 방식으로 진행됩니다. 출력 위치를 하나만 지정하는 경우 이름은 *buildIdentifier*입니다.

JSON 파일을 생성하였으면 이제 파이프라인을 만들 수 있습니다. AWS CLI 를 사용하여 **create-pipeline** 명령을 실행하고 파일을 `--cli-input-json` 파라미터에 전달합니다. 자세한 내용은AWS CodePipeline 사용 설명서의 [파이프라인 생성(CLI)](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html#pipelines-create-cli)을 참조하세요.**

### 결합된 아티팩트를 사용한 배치 빌드
<a name="sample-pipeline-batch.combined-artifacts"></a>

다음 JSON 파일을 결합된 아티팩트가 있는 배치 빌드를 생성하는 파이프라인 구조의 예로 사용하세요. CodePipeline에서 배치 빌드를 활성화하려면 `configuration` 객체의 `BatchEnabled` 파라미터를 `true`로 설정합니다. 빌드 아티팩트를 같은 위치에 결합하려면 `configuration` 객체의 `CombineArtifacts` 파라미터를 `true`로 설정합니다.

```
{
 "pipeline": {
  "roleArn": "arn:aws:iam::account-id:role/my-AWS-CodePipeline-service-role-name",
  "stages": [
    {
      "name": "Source",
      "actions": [
        {
          "inputArtifacts": [],
          "name": "Source1",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source1"
            }
          ],
          "configuration": {
            "S3Bucket": "<my-input-bucket-name>",
            "S3ObjectKey": "my-source-code-file-name.zip"
          },
          "runOrder": 1
        },
        {
          "inputArtifacts": [],
          "name": "Source2",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source2"
            }
          ],
          "configuration": {
            "S3Bucket": "<my-other-input-bucket-name>",
            "S3ObjectKey": "my-other-source-code-file-name.zip"
          },
          "runOrder": 1
        }
      ]
    },
    {
      "name": "Build",
      "actions": [
        {
          "inputArtifacts": [
            {
              "name": "source1"
            },
            {
              "name": "source2"
            }
          ],
          "name": "Build",
          "actionTypeId": {
            "category": "Build",
            "owner": "AWS",
            "version": "1",
            "provider": "CodeBuild"
          },
          "outputArtifacts": [
            {
              "name": "output1 "
            }
          ],
          "configuration": {
            "ProjectName": "my-build-project-name",
            "PrimarySource": "source1",
             "BatchEnabled": "true",
             "CombineArtifacts": "true"
          },
          "runOrder": 1
        }
      ]
    }
  ],
  "artifactStore": {
    "type": "S3",
    "location": "<AWS-CodePipeline-internal-bucket-name>"
  },
  "name": "my-pipeline-name",
  "version": 1
 }
}
```

다음은 이 파이프라인 구성과 함께 작동하는 CodeBuild buildspec 파일의 예입니다.

```
version: 0.2
batch:
  build-list:
    - identifier: build1
      env:
        compute-type: BUILD_GENERAL1_SMALL
    - identifier: build2
      env:
        compute-type: BUILD_GENERAL1_MEDIUM

phases:
  build:
    commands:
      - echo 'file' > output_file

artifacts:
  files:
    - output_file
```

배치 빌드에 대해 결합된 아티팩트가 활성화된 경우 출력은 하나만 허용됩니다. CodeBuild는 모든 빌드의 기본 아티팩트를 하나의 ZIP 파일로 결합합니다.

JSON 파일을 생성하였으면 이제 파이프라인을 만들 수 있습니다. AWS CLI 를 사용하여 **create-pipeline** 명령을 실행하고 파일을 `--cli-input-json` 파라미터에 전달합니다. 자세한 내용은AWS CodePipeline 사용 설명서의 [파이프라인 생성(CLI)](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html#pipelines-create-cli)을 참조하세요.**

## CodePipeline/CodeBuild와 다중 입력 소스 및 출력 아티팩트 통합 샘플
<a name="sample-pipeline-multi-input-output"></a>

 AWS CodeBuild 프로젝트는 둘 이상의 입력 소스를 사용할 수 있습니다. 이에 따라 출력 아티팩트도 다수를 생성할 수 있습니다. 이 샘플은를 AWS CodePipeline 사용하여 여러 입력 소스를 사용하여 여러 출력 아티팩트를 생성하는 빌드 프로젝트를 생성하는 방법을 보여줍니다. 자세한 내용은 [다중 입력 소스 및 출력 아티팩트 샘플](sample-multi-in-out.md) 단원을 참조하십시오.

파이프라인의 구조를 정의하는 JSON 형식 파일을 사용한 다음와 함께 사용하여 파이프라인 AWS CLI 을 생성할 수 있습니다. 다음 JSON 파일을 입력 소스 1개 이상과 출력 아티팩트 1개 이상을 사용해 빌드를 생성하는 파이프라인 구조의 예로 사용합니다. 이번 샘플 후반에서 이 파일이 다중 입력 및 출력을 어떻게 지정하는지 확인할 수 있습니다. 자세한 내용은AWS CodePipeline 사용 설명서의 [CodePipeline 파이프라인 구조 참조](https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html)를 참조하세요.**

```
{
 "pipeline": {
  "roleArn": "arn:aws:iam::account-id:role/my-AWS-CodePipeline-service-role-name",
  "stages": [
    {
      "name": "Source",
      "actions": [
        {
          "inputArtifacts": [],
          "name": "Source1",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source1"
            }
          ],
          "configuration": {
            "S3Bucket": "my-input-bucket-name",
            "S3ObjectKey": "my-source-code-file-name.zip"
          },
          "runOrder": 1
        },
        {
          "inputArtifacts": [],
          "name": "Source2",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source2"
            }
          ],
          "configuration": {
            "S3Bucket": "my-other-input-bucket-name",
            "S3ObjectKey": "my-other-source-code-file-name.zip"
          },
          "runOrder": 1
        }
      ]
    },
    {
      "name": "Build",
      "actions": [
        {
          "inputArtifacts": [
            {
              "name": "source1"
            },
            {
              "name": "source2"
            }
          ],
          "name": "Build",
          "actionTypeId": {
            "category": "Build",
            "owner": "AWS",
            "version": "1",
            "provider": "AWS CodeBuild"
          },
          "outputArtifacts": [
            {
              "name": "artifact1"
            },
            {
              "name": "artifact2"
            }
          ],
          "configuration": {
            "ProjectName": "my-build-project-name",
            "PrimarySource": "source1"
          },
          "runOrder": 1
        }
      ]
    }
  ],
  "artifactStore": {
    "type": "S3",
    "location": "AWS-CodePipeline-internal-bucket-name"
  },
  "name": "my-pipeline-name",
  "version": 1
 }
}
```

 위 JSON 파일에서,
+ 입력 소스 중 하나는 `PrimarySource`로 지정되어야 합니다. 이 소스는 CodeBuild가 buildspec 파일을 찾아서 실행하는 디렉터리를 말합니다. 키워드 `PrimarySource`는 JSON 파일 CodeBuild 단계의 `configuration` 섹션에서 기본 소스를 지정하는 데 사용됩니다.
+ 각 입력 소스는 자체 디렉터리에 설치됩니다. 이 디렉터리는 기본 소스의 경우 기본 제공 환경 변수 `$CODEBUILD_SRC_DIR`에, 기타 모든 소스의 경우 `$CODEBUILD_SRC_DIR_yourInputArtifactName`에 저장됩니다. 위 샘플의 파이프라인에서는 2개의 입력 소스 디렉터리가 `$CODEBUILD_SRC_DIR`과 `$CODEBUILD_SRC_DIR_source2`입니다. 자세한 내용은 [빌드 환경의 환경 변수](build-env-ref-env-vars.md) 단원을 참조하십시오.
+ 파이프라인의 JSON 파일에서 지정하는 출력 아티팩트의 이름은 buildspec 파일에서 정의하는 보조 아티팩트의 이름과 일치해야 합니다. 이 파이프라인에서 사용하는 buildspec 파일은 다음과 같습니다. 자세한 내용은 [buildspec 구문](build-spec-ref.md#build-spec-ref-syntax) 단원을 참조하십시오.

  ```
  version: 0.2
  
  phases:
    build:
      commands:
        - touch source1_file
        - cd $CODEBUILD_SRC_DIR_source2
        - touch source2_file
  
  artifacts:
    files:
      - '**/*'
    secondary-artifacts:
      artifact1:
        base-directory: $CODEBUILD_SRC_DIR
        files:
          - source1_file
      artifact2:
        base-directory: $CODEBUILD_SRC_DIR_source2
        files:
          - source2_file
  ```

 JSON 파일을 생성하였으면 이제 파이프라인을 만들 수 있습니다. AWS CLI 를 사용하여 **create-pipeline** 명령을 실행하고 파일을 `--cli-input-json` 파라미터에 전달합니다. 자세한 내용은AWS CodePipeline 사용 설명서의 [파이프라인 생성(CLI)](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html#pipelines-create-cli)을 참조하세요.**

# AWS Config CodeBuild를 사용한 샘플
<a name="how-to-integrate-config"></a>

AWS Config 는 AWS 리소스 인벤토리와 이러한 리소스에 대한 구성 변경 기록을 제공합니다.는 AWS Config 이제를 AWS 리소스 AWS CodeBuild 로 지원하므로 서비스가 CodeBuild 프로젝트를 추적할 수 있습니다. 에 대한 자세한 내용은 *AWS Config 개발자 안내서*의 [란 무엇입니까 AWS Config?](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html)를 AWS Config참조하세요.

 AWS Config 콘솔의 리소스 **인벤토리** 페이지에서 CodeBuild 리소스에 대한 다음 정보를 볼 수 있습니다.
+ CodeBuild 구성 변경의 타임라인
+ 각 CodeBuild 프로젝트의 구성 세부 정보
+ 다른 AWS 리소스와의 관계.
+ CodeBuild 프로젝트의 변경 사항 목록

**Topics**
+ [에서 CodeBuild 사용 AWS Config](#how-to-integrate-config-run)
+ [3단계: AWS Config 콘솔에서 AWS CodeBuild 데이터 보기](#viewing-config-details)

## 에서 CodeBuild 사용 AWS Config
<a name="how-to-integrate-config-run"></a>

이 주제의 절차에서는 CodeBuild 프로젝트를 설정하고 AWS Config 조회하는 방법을 보여줍니다.

**Topics**
+ [사전 조건](#how-to-create-a-build-project)
+ [1단계: 설정 AWS Config](#setup-config)
+ [2단계: AWS CodeBuild 프로젝트 조회](#lookup-projects)

### 사전 조건
<a name="how-to-create-a-build-project"></a>

 AWS CodeBuild 프로젝트를 생성합니다. 지침은 [빌드 프로젝트 생성](create-project.md) 섹션을 참조하세요.

### 1단계: 설정 AWS Config
<a name="setup-config"></a>
+ [AWS Config 설정(콘솔)](https://docs.aws.amazon.com/config/latest/developerguide/gs-console.html)
+ [AWS Config 설정(AWS CLI)](https://docs.aws.amazon.com/config/latest/developerguide/gs-cli.html)

**참고**  
설정을 완료한 후 AWS Config 콘솔에서 AWS CodeBuild 프로젝트를 보려면 최대 10분이 걸릴 수 있습니다.

### 2단계: AWS CodeBuild 프로젝트 조회
<a name="lookup-projects"></a>

1.  AWS Management Console에 로그인하고 [https://console.aws.amazon.com/config](https://console.aws.amazon.com/config) AWS Config 콘솔을 엽니다.

1. **리소스 인벤토리** 페이지의 **리소스 유형**에서 **AWS CodeBuild 프로젝트**를 선택합니다. 아래로 스크롤하여 **CodeBuild 프로젝트** 확인란을 선택합니다.

1. **Look up(조회)**을 선택합니다.

1. CodeBuild 프로젝트 목록을 추가한 후 **Config 타임라인** 열에서 CodeBuild 프로젝트 이름 링크를 선택합니다.

## 3단계: AWS Config 콘솔에서 AWS CodeBuild 데이터 보기
<a name="viewing-config-details"></a>

**리소스 인벤토리** 페이지에서 리소스를 조회할 때 AWS Config 타임라인을 선택하여 CodeBuild 프로젝트에 대한 세부 정보를 볼 수 있습니다. 리소스에 대한 세부 정보 페이지에서는 구성, 관계, 리소스 변경 사항 수에 대한 정보를 확인할 수 있습니다.

페이지 상단에 있는 블록을 타임라인이라고 합니다. 타임라인은 기록이 생성된 날짜와 시간을 표시합니다.

자세한 내용은 *AWS Config 개발자 안내서*[의 AWS Config 콘솔에서 구성 세부 정보 보기를](https://docs.aws.amazon.com/config/latest/developerguide/view-manage-resource-console.html) 참조하세요.

# CodeBuild의 빌드 알림 샘플
<a name="sample-build-notifications"></a>

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

**중요**  
이 샘플을 실행하면 AWS 계정에 요금이 부과될 수 있습니다. 여기에는 CodeBuild 및 Amazon CloudWatch 및 Amazon SNS와 관련된 AWS 리소스 및 작업에 대해 발생할 수 있는 요금이 포함됩니다. 자세한 내용은 [CodeBuild 요금](https://aws.amazon.com/codebuild/pricing), [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing) 및 [Amazon SNS 요금](https://aws.amazon.com/sns/pricing)을 참조하세요.

**Topics**
+ [빌드 알림 샘플 실행](#sample-build-notifications-running)
+ [빌드 알림 입력 형식 참조](sample-build-notifications-ref.md)

## 빌드 알림 샘플 실행
<a name="sample-build-notifications-running"></a>

다음 절차에 따라 빌드 알림 샘플을 실행합니다.

**이 샘플을 실행하려면**

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

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "sns:CreateTopic",
                   "sns:GetTopicAttributes",
                   "sns:List*",
                   "sns:Publish",
                   "sns:SetTopicAttributes",
                   "sns:Subscribe"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------
**참고**  
이 정책을 수정하는 IAM 엔터티에는 정책을 수정하는 IAM의 권한이 있어야 합니다.  
자세한 내용은 [고객 관리형 정책 편집](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#edit-managed-policy-console) 또는 IAM 사용 설명서의 [인라인 정책 작업(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html#AddingPermissions_Console)에서 “그룹, 사용자 또는 역할에 대한 인라인 정책을 편집 또는 삭제하려면” 섹션을 참조하세요.**

1. Amazon SNS에서 주제를 생성하거나 식별합니다. CloudWatch Events를 AWS CodeBuild 사용하여 Amazon SNS를 통해이 주제에 빌드 알림을 보냅니다.

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

   1. [https://console.aws.amazon.com/sns](https://console.aws.amazon.com/sns) Amazon SNS 콘솔을 엽니다.

   1. **주제 생성**을 선택합니다.

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

   1. **주제 생성**을 선택합니다.

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

        
![\[주제 ARN 값입니다.\]](http://docs.aws.amazon.com/ko_kr/codebuild/latest/userguide/images/topic-arn.png)

      

   자세한 내용은 *Amazon SNS 개발자 안내서*의 [주제 생성](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)을 참조하세요.

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

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

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

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

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

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

        
![\[구독 구성입니다.\]](http://docs.aws.amazon.com/ko_kr/codebuild/latest/userguide/images/create-subscription.png)

      

   1. **구독 생성**을 선택합니다.

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

   자세한 내용은 *Amazon SNS 개발자 가이드*의 [주제 구독](https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html)을 참조하세요.

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

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "events:*",
                   "iam:PassRole"
               ],
               "Resource": "arn:aws:iam::*:role/Service*"
           }
       ]
   }
   ```

------
**참고**  
이 정책을 수정하는 IAM 엔터티에는 정책을 수정하는 IAM의 권한이 있어야 합니다.  
자세한 내용은 [고객 관리형 정책 편집](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#edit-managed-policy-console) 또는 IAM 사용 설명서의 [인라인 정책 작업(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html#AddingPermissions_Console)에서 “그룹, 사용자 또는 역할에 대한 인라인 정책을 편집 또는 삭제하려면” 섹션을 참조하세요.**

1. CloudWatch Events에서 규칙을 생성합니다. 이 작업을 수행하려면 [https://console.aws.amazon.com/cloudwatch](https://console.aws.amazon.com/cloudwatch)에서 CloudWatch 콘솔을 엽니다.

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

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

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

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

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

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

   이 첫 번째 규칙 패턴은 빌드가 시작되거나 완료될 때 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` 어레이를 모두 제거합니다.
   + 빌드가 완료될 때만 이벤트를 트리거하려면 `build-status` 배열에서 `IN_PROGRESS`를 제거합니다.
   + 빌드가 시작될 때만 이벤트를 트리거하려면 `build-status` 배열에서 `IN_PROGRESS`를 제외한 모든 값을 제거합니다.
   + 모든 빌드 프로젝트에 대해 이벤트를 트리거하려면 `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` 배열에 각 빌드 프로젝트의 이름을 지정합니다.

   이벤트 패턴에 대한 자세한 내용은 Amazon EventBridge 사용 설명서에서 [이벤트 패턴](https://docs.aws.amazon.com/eventbridge/latest/userguide/filtering-examples-structure.html)을 참조하세요.

   이벤트 패턴을 사용한 필터링에 대한 자세한 내용은 Amazon EventBridge 사용 설명서에서 [이벤트 패턴을 사용한 콘텐츠 기반 필터링](https://docs.aws.amazon.com/eventbridge/latest/userguide/content-filtering-with-event-patterns.html)을 참조하세요.
**참고**  
빌드 상태 변경 및 빌드 단계 변경에 대한 이벤트를 트리거하려는 경우, 빌드 상태 변경에 대한 규칙 및 빌드 단계 변경을 위한 규칙이라는 두 가지 별도의 규칙을 생성해야 합니다. 두 가지 규칙을 단일 규칙으로 결합하려고 하면 결합된 해당 규칙으로 인해 예기치 않은 결과가 발생하거나 작업이 모두 중단될 수 있습니다.

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

1. **대상(Targets)**에서 **대상 추가(Add target)**를 선택합니다.

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

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

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

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

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

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

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

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

   다른 유형의 정보를 보려면 [빌드 알림 입력 형식 참조](sample-build-notifications-ref.md) 섹션을 참조하세요.

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

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

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

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

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

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

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

1. **규칙 생성**을 선택합니다.

1. 빌드 프로젝트를 생성하고, 빌드를 실행하고, 빌드 정보를 확인합니다.

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

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

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

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

# 빌드 알림 입력 형식 참조
<a name="sample-build-notifications-ref"></a>

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:5.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:5.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"
  }
}
```