에 대한 아마존 ECR 샘플 CodeBuild - AWS CodeBuild

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

에 대한 아마존 ECR 샘플 CodeBuild

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

중요

이 샘플을 실행하면 AWS 계정에 요금이 청구될 수 있습니다. 여기에는 Amazon S3 AWS KMS, CloudWatch 로그 및 Amazon ECR과 관련된 AWS 리소스 및 작업에 대한 가능한 요금이 포함됩니다. AWS CodeBuild 자세한 내용은 요금, Amazon S3 CodeBuild 요금, 요금, Amazon AWS Key Management Service 요금Amazon CloudWatch Elastic 컨테이너 레지스트리 요금을 참조하십시오.

샘플 실행

이 샘플을 실행하려면
  1. 도커 이미지를 생성하고 Amazon ECR의 이미지 리포지토리에 푸시하려면, 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 만드는 경우 JSON 형식의 create-project 명령 입력이 이와 비슷해 보일 수 있습니다. (자리 표시자는 사용자의 값으로 바꾸십시오.)

      { "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. 다음 중 하나에 해당하는 경우 Docker 이미지를 빌드 환경으로 가져올 AWS CodeBuild 수 있도록 Amazon ECR의 이미지 리포지토리에 권한을 추가해야 합니다.

    • 프로젝트는 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:, ecr:GetDownloadUrlForLayer, ecr:ecr:BatchGetImage) 을 선택합니다. BatchCheckLayerAvailability

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

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

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

      • 프로젝트에서 CodeBuild 자격 증명을 사용하여 Amazon ECR 이미지를 가져오는 경우 서비스 주체 아래에 "codebuild.amazonaws.com" 표시됩니다.

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

        다음 샘플 정책은 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 자격 증명을 사용하고 프로젝트에서 Amazon ECR 리포지토리에 대한 공개 액세스 권한을 갖도록 하려면 Condition 키를 생략하고 다음 샘플 정책을 추가할 수 있습니다. CodeBuild

      { "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 만드는 경우 JSON 형식의 create-project 명령 입력이 다음과 비슷할 수 있습니다. (자리 표시자는 사용자의 값으로 바꾸십시오.)

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

관련 리소스