CodeBuild용 Amazon ECR 샘플 - AWS CodeBuild

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

CodeBuild용 Amazon ECR 샘플

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

중요

이 샘플을 실행하면 AWS 계정에 요금이 발생할 수 있습니다. 여기에는 AWS CodeBuild 및 AWS 리소스에 대한 가능한 요금, Amazon S3, AWS KMS, CloudWatch Logs 및 Amazon ECR과 관련된 작업이 포함됩니다. 자세한 내용은 CodeBuild 요금, Amazon S3 요금, AWS Key Management Service 요금, Amazon CloudWatch 요금, Amazon Elastic Container Registry 요금을 참조하세요.

Amazon ECR 샘플 실행

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

이 샘플을 실행하려면
  1. Docker 이미지를 생성하고 Amazon ECR의 이미지 리포지토리에 푸시하려면, 'Amazon ECR에 Docker 이미지 게시' 샘플'Amazon ECR에 Docker 이미지 게시' 샘플 실행 섹션에 있는 단계를 수행하세요.

  2. Go 프로젝트 만들기:

    1. 이 주제의 Go 프로젝트 구조Go 프로젝트 파일 섹션에 설명된 대로 파일을 생성한 다음, 이를 S3 입력 버킷이나 AWS CodeCommit, GitHub 또는 Bitbucket 리포지토리에 업로드합니다.

      중요

      (root directory name)은 업로드하지 말고, (root directory name) 안에 있는 파일만 업로드하십시오.

      S3 입력 버킷을 사용하고 있는 경우, 파일을 포함하는 ZIP 파일을 생성한 다음, 이를 입력 버킷에 업로드하십시오. (root directory name)을 ZIP 파일에 추가하지 말고, (root directory name) 안에 있는 파일만 추가하십시오.

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

      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" }
    3. 빌드 출력 아티팩트를 가져오려면 S3 출력 버킷을 엽니다.

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

  3. 다음 중 하나가 true일 경우, Amazon ECR의 이미지 리포지토리에 대한 권한을 추가하여 AWS CodeBuild가 빌드 환경에 리포지토리의 도커 이미지를 끌어올 수 있어야 합니다.

    • 프로젝트에서는 CodeBuild 보안 인증을 사용하여 Amazon ECR 이미지를 끌어옵니다. 이는 ProjectEnvironmentimagePullCredentialsType 속성에 CODEBUILD 값으로 표시됩니다.

    • 프로젝트에서는 교차 계정 Amazon ECR 이미지를 사용합니다. 이 경우에는 프로젝트에서 서비스 역할을 사용하여 Amazon ECR 이미지를 끌어와야 합니다. 이 동작을 활성화하려면 ProjectEnvironmentimagePullCredentialsType 속성을 SERVICE_ROLE로 설정합니다.

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

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

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

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

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

    6. 보안 주체에 대해 다음 중 하나를 실시합니다.

      • 프로젝트에서 CodeBuild 보안 인증을 사용하여 Amazon ECR 이미지를 끌어오는 경우 서비스 보안 주체codebuild.amazonaws.com을 입력합니다.

      • 프로젝트에서 교차 계정 Amazon ECR 이미지를 사용할 경우에는 AWS 계정 ID에 액세스 권한을 부여할 AWS 계정의 ID를 입력합니다.

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

    8. 작업은 가져오기 전용 작업인 ecr:GetDownloadUrlForLayer, ecr:BatchGetImageecr:BatchCheckLayerAvailability를 선택합니다.

    9. 조건에 다음을 추가합니다.

      { "StringEquals":{ "aws:SourceAccount":"<AWS-account-ID>", "aws:SourceArn":"arn:aws:codebuild:<region>:<AWS-account-ID>:project/<project-name>" } }
    10. Save(저장)를 선택합니다.

      이 정책이 Permissions(권한)에 표시됩니다. 보안 주체는 이 절차의 3단계에서 보안 주체에 입력한 내용입니다.

      • 프로젝트에서 CodeBuild 보안 인증을 사용하여 Amazon ECR 이미지를 끌어오는 경우 서비스 보안 주체 아래에 "codebuild.amazonaws.com"이 나타납니다.

      • 프로젝트에서 교차 계정 Amazon ECR 이미지를 사용할 경우 AWS 계정 ID 아래에 액세스 권한을 부여할 AWS 계정의 ID가 있습니다.

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

      { "Version":"2012-10-17", "Statement":[ { "Sid":"CodeBuildAccessPrincipal", "Effect":"Allow", "Principal":{ "Service":"codebuild.amazonaws.com" }, "Action":[ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ], "Condition":{ "StringEquals":{ "aws:SourceArn":"arn:aws:codebuild:<region>:<aws-account-id>:project/<project-name>", "aws:SourceAccount":"<aws-account-id>" } } }, { "Sid":"CodeBuildAccessCrossAccount", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::<AWS-account-ID>:root" }, "Action":[ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] } ] }
      • 프로젝트에서 CodeBuild 보안 인증을 사용하고 CodeBuild 프로젝트에서 Amazon ECR 리포지토리에 대한 퍼블릭 액세스 권한을 갖도록 하려면 Condition 키를 생략하고 다음 샘플 정책을 추가할 수 있습니다.

      { "Version":"2012-10-17", "Statement":[ { "Sid":"CodeBuildAccessPrincipal", "Effect":"Allow", "Principal":{ "Service":"codebuild.amazonaws.com" }, "Action":[ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] }, { "Sid":"CodeBuildAccessCrossAccount", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::<AWS-account-ID>:root" }, "Action":[ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] } ] }
  4. 빌드 프로젝트를 생성하고, 빌드를 실행하고, 빌드 정보를 확인합니다.

    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" }
  5. 빌드 출력 아티팩트를 가져오려면 S3 출력 버킷을 엽니다.

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

Go 프로젝트 구조

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

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

Go 프로젝트 파일

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

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