

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

# 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)
}
```