필터링된 Amazon ECR 컨테이너 이미지를 계정 또는 리전 전반적으로 복제 - AWS 권장 가이드

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

필터링된 Amazon ECR 컨테이너 이미지를 계정 또는 리전 전반적으로 복제

작성자: Abdal Garuba

환경: 프로덕션

기술: 컨테이너 및 마이크로서비스, DevOps

AWS 서비스: 아마존 EC2 컨테이너 레지스트리, 아마존, AWS CodeBuild, CloudWatch AWS ID 및 액세스 관리, AWS CLI

요약

Amazon Elastic Container Registry(Amazon ECR)는 교차 리전교차 계정 복제 기능을 사용하여 기본적으로 Amazon Web Services(AWS) 리전 및 계정 전반적으로 이미지 리포지토리에 있는 모든 컨테이너 이미지를 복제할 수 있습니다. (자세한 내용은 Amazon ECR의 교차 리전 복제가 도입된 AWS 블로그 게시물을 참조하십시오.) 하지만 리전 또는 계정 전반적으로 복사되는 이미지를 어떤 기준으로도 필터링할 수 있는 방법은 없습니다. 

이 패턴은 이미지 태그 패턴을 기반으로 AWS 계정 및 리전 전반적으로 Amazon ECR에 저장된 컨테이너 이미지를 복제하는 방법을 설명합니다. 이 패턴은 Amazon CloudWatch Events를 사용하여 사전 정의된 사용자 지정 태그가 있는 이미지의 푸시 이벤트를 수신합니다. 푸시 이벤트는 AWS CodeBuild 프로젝트를 시작하고 이미지 세부 정보를 AWS 프로젝트에 전달합니다. CodeBuild 프로젝트는 제공된 세부 정보에 따라 원본 Amazon ECR 레지스트리에서 대상 레지스트리로 이미지를 복사합니다.

이 패턴은 계정 전반적으로 특정 태그가 있는 이미지를 복사합니다. 예를 들어 이 패턴을 사용하여 프로덕션 준비가 완료된 안전한 이미지만 프로덕션 계정에 복사할 수 있습니다. 개발 계정에서는 이미지를 철저하게 테스트한 후 안전한 이미지에 사전 정의된 태그를 추가하고, 이 패턴의 절차를 사용하여 표시된 이미지를 프로덕션 계정에 복사할 수 있습니다.

사전 조건 및 제한 사항

사전 조건

  • 소스 및 대상 Amazon ECR 레지스트리를 위한 활성 계정

  • 이 패턴에 사용된 도구에 대한 관리 권한

  • 테스트를 위해 로컬 시스템에 설치된 Docker

  • Amazon ECR에 인증하기 위한 Command Line Interface(CLI)

제한 사항

  • 이 패턴은 한 리전에서만 소스 레지스트리의 푸시 이벤트를 감시합니다. 이 패턴을 다른 리전에 배포하여 해당 리전의 레지스트리를 감시할 수 있습니다.

  • 이 패턴에서는 Amazon CloudWatch Events 규칙 하나가 단일 이미지 태그 패턴을 수신합니다. 여러 패턴을 확인하려는 경우 추가 이미지 태그 패턴을 수신 대기하도록 이벤트를 추가할 수 있습니다.

아키텍처

대상 아키텍처

필터링된 Amazon ECR 컨테이너 이미지를 계정 및 지역 간에 복제하기 위한 아키텍처.

자동화 및 규모 조정

이 패턴은 코드형 인프라(IaC) 스크립트로 자동화하고 대규모로 배포할 수 있습니다. AWS CloudFormation 템플릿을 사용하여 이 패턴을 배포하려면 첨부 파일을 다운로드하고 추가 정보 섹션의 지침을 따르십시오.

사용자 지정 이벤트 패턴이 다른 여러 Amazon Events CloudWatch 이벤트를 동일한 AWS CodeBuild 프로젝트로 지정하여 여러 이미지 태그 패턴을 복제할 수 있지만, 여러 패턴을 지원하려면 다음과 같이 buildspec.yaml 파일 (첨부 파일 및 도구 섹션에 포함되어 있음) 의 보조 검증을 업데이트해야 합니다.

... if [[ ${IMAGE_TAG} != release-* ]]; then ...

도구

Amazon 서비스

  • IAM — Identity and Access Management(IAM)를 사용하여 서비스와 리소스에 대한 액세스를 안전하게 관리할 수 있습니다. 이 패턴에서는 컨테이너 이미지를 대상 레지스트리로 푸시할 때 AWS가 CodeBuild 맡게 되는 교차 계정 IAM 역할을 생성해야 합니다.

  • Amazon ECR — Amazon Elastic Container Registry(Amazon ECR)는 컨테이너 이미지와 아티팩트를 어디서나 쉽게 저장, 관리, 공유, 배포할 수 있게 해주는 완전 관리형 컨테이너 레지스트리입니다. 소스 레지스트리로의 이미지 푸시 작업은 Amazon CloudWatch Events에서 픽업한 이벤트 버스로 시스템 이벤트 세부 정보를 전송합니다.

  • AWS CodeBuild — CodeBuild AWS는 소스 코드 컴파일, 테스트 실행, 배포 준비가 완료된 아티팩트 생성 등의 작업을 수행할 수 있는 컴퓨팅 파워를 제공하는 완전관리형 지속적 통합 서비스입니다. 이 패턴은 CodeBuild AWS를 사용하여 원본 Amazon ECR 레지스트리에서 대상 레지스트리로 복사 작업을 수행합니다.

  • CloudWatch 이벤트 — Amazon CloudWatch Events는 AWS 리소스의 변경 사항을 설명하는 시스템 이벤트 스트림을 제공합니다. 이 패턴은 규칙을 사용하여, Amazon ECR 푸시 작업을 특정 이미지 태그 패턴과 일치시킵니다.

도구

  • Docker CLI — Docker는 컨테이너를 더 쉽게 생성하고 관리할 수 있게 해주는 도구입니다. 컨테이너는 컨테이너 런타임을 지원하는 아무 플랫폼에서라도 쉽게 배포할 수 있는 하나의 장치 또는 패키지에 애플리케이션과 모든 종속성을 패키징합니다.

코드

다음과 같은 두 가지 방법으로 이 패턴을 구현할 수 있습니다.

  • 자동 설정: 첨부 파일에 제공된 두 개의 AWS CloudFormation 템플릿을 배포합니다. 지침은 추가 정보 섹션을 참조하세요.

  • 수동 설정: 에픽 섹션의 절차를 따릅니다. 

샘플 buildspec.yaml

이 패턴으로 제공된 CloudFormation 템플릿을 사용하는 경우 buildspec.yaml 파일이 CodeBuild 리소스에 포함됩니다.

version: 0.2 env: shell: bash phases: install: commands: - export CURRENT_ACCOUNT=$(echo ${CODEBUILD_BUILD_ARN} | cut -d':' -f5) - export CURRENT_ECR_REGISTRY=${CURRENT_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com - export DESTINATION_ECR_REGISTRY=${DESTINATION_ACCOUNT}.dkr.ecr.${DESTINATION_REGION}.amazonaws.com pre_build: on-failure: ABORT commands: - echo "Validating Image Tag ${IMAGE_TAG}" - | if [[ ${IMAGE_TAG} != release-* ]]; then aws codebuild stop-build --id ${CODEBUILD_BUILD_ID} sleep 60 exit 1 fi - aws ecr get-login-password --region ${AWS_REGION} | docker login -u AWS --password-stdin ${CURRENT_ECR_REGISTRY} - docker pull ${CURRENT_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} build: commands: - echo "Assume cross-account role" - CREDENTIALS=$(aws sts assume-role --role-arn ${CROSS_ACCOUNT_ROLE_ARN} --role-session-name Rolesession) - export AWS_DEFAULT_REGION=${DESTINATON_REGION} - export AWS_ACCESS_KEY_ID=$(echo ${CREDENTIALS} | jq -r '.Credentials.AccessKeyId') - export AWS_SECRET_ACCESS_KEY=$(echo ${CREDENTIALS} | jq -r '.Credentials.SecretAccessKey') - export AWS_SESSION_TOKEN=$(echo ${CREDENTIALS} | jq -r '.Credentials.SessionToken') - echo "Logging into cross-account registry" - aws ecr get-login-password --region ${DESTINATION_REGION} | docker login -u AWS --password-stdin ${DESTINATION_ECR_REGISTRY} - echo "Check if Destination Repository exists, else create" - | aws ecr describe-repositories --repository-names ${REPO_NAME} --region ${DESTINATION_REGION} \ || aws ecr create-repository --repository-name ${REPO_NAME} --region ${DESTINATION_REGION} - echo "retag image and push to destination" - docker tag ${CURRENT_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} ${DESTINATION_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} - docker push ${DESTINATION_ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG}

에픽

작업설명필요한 기술

CloudWatch 이벤트 역할을 생성합니다.

원본 AWS 계정에서 Amazon CloudWatch Events가 맡을 IAM 역할을 생성합니다. 역할에는 AWS CodeBuild 프로젝트를 시작할 수 있는 권한이 있어야 합니다.

CLI를 사용하여 역할을 생성하려면 IAM 설명서의 지침을 따릅니다.

예제 신뢰 정책(trustpolicy.json): 

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Service": "events.amazonaws.com"}, "Action": "sts:AssumeRole" } }

예제 권한 정책(permissionpolicy.json):

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "codebuild:StartBuild", "Resource": "<CodeBuild Project ARN>" } }
AWS 관리자, AWS DevOps, AWS 시스템 관리자, 클라우드 관리자, 클라우드 아키텍트, DevOps 엔지니어

CodeBuild 역할 생성.

IAM 설명서의 지침에 따라 AWS가 CodeBuild 맡을 IAM 역할을 생성합니다. 이 역할에는 다음과 같은 권한도 있어야 합니다.

  • 대상 교차 계정 역할을 떠맡을 수 있는 권한

  • 로그 그룹 및 로그 스트림을 생성하고 로그 이벤트를 게시할 수 있는 권한

  • 역할에 ContainerRegistryReadOnlyAmazonEC2 관리형 정책을 추가하여 모든 Amazon ECR 리포지토리에 대한 읽기 전용 권한 부여

  • 중지할 수 있는 권한 CodeBuild

예제 신뢰 정책(trustpolicy.json):

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "codebuild.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

예제 권한 정책(permissionpolicy.json):

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codebuild:StartBuild", "codebuild:StopBuild", "codebuild:Get*", "codebuild:List*", "codebuild:BatchGet*" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*", "Effect": "Allow" }, { "Action": "sts:AssumeRole", "Resource": "<ARN of destination role>", "Effect": "Allow", "Sid": "AssumeCrossAccountArn" } ] }

다음과 같이 관리형 정책 AmazonEC2ContainerRegistryReadOnly(을)를 CLI 명령에 연결합니다.

~$ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \ --role-name <name of CodeBuild Role>
AWS 관리자, AWS DevOps, AWS 시스템 관리자, 클라우드 관리자, 클라우드 아키텍트, DevOps 엔지니어

교차 계정 역할을 생성합니다.

대상 AWS 계정에서 원본 계정이 위임할 AWS CodeBuild 역할에 대한 IAM 역할을 생성합니다. 교차 계정 역할은 컨테이너 이미지가 새 리포지토리를 생성할 수 있게 하고, 컨테이너 이미지를 Amazon ECR에 업로드해야 합니다.

CLI를 사용하여 IAM역할을 생성하려면 IAM 설명서의 지침을 따릅니다. 

이전 단계의 AWS CodeBuild 프로젝트를 허용하려면 다음 신뢰 정책을 사용하십시오.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "<ARN of source codebuild role>" }, "Action": "sts:AssumeRole" } }

이전 단계의 AWS CodeBuild 프로젝트가 대상 레지스트리에 이미지를 저장하도록 허용하려면 다음 권한 정책을 사용하십시오.

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchCheckLayerAvailability", "ecr:PutImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload", "ecr:GetRepositoryPolicy", "ecr:DescribeRepositories", "ecr:GetAuthorizationToken", "ecr:CreateRepository" ], "Resource": "*", "Effect": "Allow" } ] }
AWS 관리자, AWS DevOps, 클라우드 관리자, 클라우드 아키텍트, DevOps 엔지니어, AWS 시스템 관리자
작업설명필요한 기술

CodeBuild 프로젝트 생성.

AWS CodeBuild 설명서의 지침에 따라 소스 계정에서 AWS CodeBuild 프로젝트를 생성합니다. 프로젝트는 소스 레지스트리와 동일한 리전에 있어야 합니다. 

다음과 같이 프로젝트를 구성합니다.

  • 환경 유형: LINUX CONTAINER

  • 서비스 역할: CodeBuild Role

  • 권한이 있는 모드: true

  • 환경 이미지: aws/codebuild/standard:x.x (이용 가능한 최신 이미지 사용)

  • 환경 변수:

    • CROSS_ACCOUNT_ROLE_ARN: 교차 계정 역할의 Amazon 리소스 이름(ARN)

    • DESTINATION_REGION: 교차 계정 리전의 이름

    • DESTINATION_ACCOUNT: 대상 계정의 번호

  • 빌드 사양: 도구 섹션에 나열된 buildspec.yaml 파일을 사용합니다.

AWS 관리자, AWS DevOps, AWS 시스템 관리자, 클라우드 관리자, 클라우드 아키텍트, DevOps 엔지니어
작업설명필요한 기술

이벤트 규칙을 생성합니다.

패턴은 콘텐츠 필터링 기능을 사용하므로 Amazon을 사용하여 이벤트를 생성해야 EventBridge 합니다. EventBridge 설명서의 지침에 따라 몇 가지 수정을 거쳐 이벤트와 대상을 생성합니다.

  • 패턴 정의에 대하여 이벤트 패턴을 선택한 다음 사용자 정의 패턴을 선택합니다.

  • 다음 사용자 지정 이벤트 패턴 샘플 코드를 제공되는 텍스트 상자에 복사합니다.

    {   "source": ["aws.ecr"],   "detail-type": ["ECR Image Action"],   "detail": {     "action-type": ["PUSH"],     "result": ["SUCCESS"],     "image-tag": [{ "prefix": "release-"}]   } }
  • Select target (대상 선택) 에서 AWS CodeBuild 프로젝트를 선택하고 이전 에픽에서 생성한 AWS CodeBuild 프로젝트의 ARN을 붙여넣습니다.

  • Configure input(입력 구성)에서 입력 변환기를 선택합니다.

    • 입력 경로 텍스트 상자에서 다음을 붙여넣습니다.

      {"IMAGE_TAG":"$.detail.image-tag","REPO_NAME":"$.detail.repository-name"}
    • 입력 템플릿 텍스트 상자에서 다음을 붙여넣습니다.

      {"environmentVariablesOverride": [ {"name": "IMAGE_TAG", "value":<IMAGE_TAG>},{"name":"REPO_NAME","value":<REPO_NAME>}]}
  • 기존 역할 사용을 선택하고 IAM 역할 생성 에픽에서 이전에 생성한 CloudWatch 이벤트 역할의 이름을 선택합니다.

AWS 관리자, AWS DevOps, AWS 시스템 관리자, 클라우드 관리자, 클라우드 아키텍트, DevOps 엔지니어
작업설명필요한 기술

Amazon ECR을 사용하여 인증합니다.

Amazon ECR 설명서의 절차에 따라 소스 및 대상 레지스트리를 모두 인증합니다.

AWS 관리자, AWS DevOps, AWS 시스템 관리자, 클라우드 관리자, DevOps 엔지니어, 클라우드 아키텍트

이미지 복제를 테스트합니다.

소스 계정에서, release-로 접두사가 붙은 이미지 태그를 사용하여 컨테이너 이미지를 새 Amazon ECR 소스 리포지토리 또는 기존 Amazon ECR 소스 리포지토리에 푸시합니다. 이미지를 푸시하려면 Amazon ECR 설명서의 절차를 따릅니다. 

CodeBuild 콘솔에서 CodeBuild 프로젝트 진행 상황을 모니터링할 수 있습니다. 

CodeBuild 프로젝트가 성공적으로 완료되면 대상 AWS 계정에 로그인하고 Amazon ECR 콘솔을 열고 대상 Amazon ECR 레지스트리에 이미지가 있는지 확인합니다.

AWS 관리자, AWS DevOps, AWS 시스템 관리자, 클라우드 관리자, 클라우드 아키텍트, DevOps 엔지니어

이미지 제외를 테스트합니다.

소스 계정에서, 사용자 지정 접두사가 없는 이미지 태그를 사용하여 컨테이너 이미지를 신규 또는 기존 Amazon ECR 소스 리포지토리에 푸시합니다. 

CodeBuild 프로젝트가 시작되지 않았는지, 대상 레지스트리에 컨테이너 이미지가 표시되지 않는지 확인합니다.

AWS 관리자, AWS DevOps, AWS 시스템 관리자, 클라우드 관리자, 클라우드 아키텍트, DevOps 엔지니어

관련 리소스

추가 정보

이 패턴에 맞게 리소스를 자동으로 배포하려면 다음 절차를 따릅니다.

  1. 첨부 파일을 다운로드하고 두 개의 CloudFormation 템플릿 (및) 을 추출하십시오. part-1-copy-tagged-images.yaml part-2-destination-account-role.yaml

  2. AWS CloudFormation 콘솔에 로그인하여 원본 Amazon ECR 레지스트리와 동일한 AWS 계정 및 part-1-copy-tagged-images.yaml 지역에 배포하십시오. 필요에 따라 파라미터를 업데이트합니다. 템플릿은 다음 리소스를 배포합니다.

    • 아마존 CloudWatch 이벤트 IAM 역할

    • AWS CodeBuild 프로젝트 IAM 역할

    • AWS CodeBuild 프로젝트

    • AWS CloudWatch 이벤트 규칙

  3. 출력 탭에서 SourceRoleName의 값을 기록해 둡니다. 다음 단계에서 이 값이 필요합니다.

  4. Amazon ECR 컨테이너 이미지를 복사하려는 AWS 계정에 두 번째 CloudFormation 템플릿인 을 배포합니다. part-2-destination-account-role.yaml 필요에 따라 파라미터를 업데이트합니다. SourceRoleName 파라미터에 단계 3의 값을 지정합니다. 이 템플릿은 교차 계정 IAM 역할을 배포합니다.

  5. 에픽 섹션의 마지막 단계에 설명된 대로 이미지 복제 및 제외를 검증합니다.

첨부

이 문서와 관련된 추가 콘텐츠에 액세스하려면 attachment.zip 파일의 압축을 풉니다.