아마존 ECR 샘플 CodeBuild - AWS CodeBuild

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

아마존 ECR 샘플 CodeBuild

이 샘플은 Amazon Elastic 컨테이너 레지스트리 (AmazonECR) 이미지 리포지토리의 Docker 이미지를 사용하여 샘플 Go 프로젝트를 빌드합니다.

중요

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

아마존 ECR 샘플 실행

다음 지침에 따라 Amazon ECR 샘플을 CodeBuild 실행하십시오.

이 샘플을 실행하려면
  1. Docker 이미지를 생성하여 ECR Amazon의 이미지 리포지토리로 푸시하려면 ECR'Amazon에 Docker 이미지 게시' 샘플 실행 섹션의 ECR'아마존에 도커 이미지 공개' 샘플 단계를 완료하십시오.

  2. Go 프로젝트 만들기:

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

      중요

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

      S3 입력 버킷을 사용하는 경우 파일이 포함된 ZIP 파일을 만든 다음 입력 버킷에 업로드해야 합니다. ZIP파일에 (root directory name) 추가하지 말고 내부 파일만 (root directory name) 추가하세요.

    2. 빌드 프로젝트를 만들고, 빌드를 실행하고, 관련 빌드 정보를 확인하세요.

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

      { "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 수 ECR 있도록 Amazon의 이미지 리포지토리에 권한을 추가해야 합니다.

    • 프로젝트는 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 이미지를 사용하는 IDs 경우 AWS 계정에 액세스 권한을 부여하려는 AWS 계정을 입력합니다IDs.

    7. 모든 IAM 엔티티 목록은 건너뛰십시오.

    8. [액션] 에서 풀 전용 액션 (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. 저장(Save)을 선택합니다.

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

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

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

        다음 샘플 정책은 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 만드는 경우 create-project 명령에 대한 JSON -formatted 입력이 다음과 비슷할 수 있습니다. (자리 표시자는 사용자의 값으로 바꾸십시오.)

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