튜토리얼: Amazon ECR에서 GitLab으로 컨테이너 이미지 마이그레이션
레지스트리 간에 컨테이너 이미지를 수동으로 마이그레이션하는 것은 시간이 많이 걸립니다. ECR에서 컨테이너 이미지를 마이그레이션하려면: 모든 것을 합치면 .gitlab-ci.yml은 이 튜토리얼 끝에 제공된 샘플 구성과 비슷해야 합니다.
레지스트리 간에 컨테이너 이미지를 수동으로 마이그레이션하는 것은 시간이 많이 걸립니다. 이 튜토리얼에서는 Amazon Elastic Container Registry (ECR)에서 GitLab 컨테이너 레지스트리로 컨테이너 이미지를 대량 마이그레이션하는 작업을 자동화하는 CI/CD 파이프라인을 설정하는 방법을 설명합니다.
ECR에서 컨테이너 이미지를 마이그레이션하려면:
모든 것을 합치면 .gitlab-ci.yml은 이 튜토리얼 끝에 제공된 샘플 구성과 비슷해야 합니다.
시작하기 전에#
다음이 필요합니다:
- GitLab 프로젝트에서 Maintainer 또는 Owner 역할
- IAM 사용자를 생성할 권한이 있는 AWS 계정 액세스
- AWS 계정 ID
- ECR 저장소가 위치한 AWS 리전
- GitLab 컨테이너 레지스트리의 충분한 스토리지 공간
AWS 권한 구성#
AWS IAM에서 ECR에 대한 읽기 전용 액세스를 가진 새 정책과 사용자를 생성합니다:
-
AWS Management Console에서 IAM으로 이동합니다.
-
새 정책을 생성합니다:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:DescribeRepositories", "ecr:ListImages", "ecr:DescribeImages", "ecr:BatchGetImage" ], "Resource": "*" } ] } -
새 IAM 사용자를 생성하고 정책을 연결합니다.
-
IAM 사용자의 액세스 키를 생성하고 저장합니다.
UI에서 AWS 자격 증명을 변수로 추가#
GitLab 프로젝트에 필요한 AWS 자격 증명을 변수로 구성합니다:
- 왼쪽 사이드바에서 설정 > CI/CD를 선택합니다.
- 변수를 확장합니다.
- 변수 추가를 선택하고 다음을 추가합니다:
AWS_ACCOUNT_ID: AWS 계정 번호.AWS_DEFAULT_REGION: ECR 리전. 예:us-east-1.AWS_ACCESS_KEY_ID: IAM 사용자의 액세스 키 ID.- 변수 마스킹을 선택합니다.
AWS_SECRET_ACCESS_KEY: IAM 사용자의 시크릿 액세스 키.- 변수 마스킹을 선택합니다.
마이그레이션 파이프라인 생성#
다음 구성으로 저장소에 새 .gitlab-ci.yml 파일을 생성합니다:
이미지 및 서비스 설정#
컨테이너 작업을 처리하기 위해 Docker-in-Docker를 사용합니다:
image: docker:20.10
services:
- docker:20.10-dind
파이프라인 변수 정의#
파이프라인에 필요한 변수를 설정합니다:
variables:
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
BULK_MIGRATE: "true"
마이그레이션 작업 구성#
전송을 처리하는 마이그레이션 작업을 생성합니다:
migration:
stage: deploy
script:
# Install required tools
- apk add --no-cache aws-cli jq
# Verify AWS credentials
- aws sts get-caller-identity
# Log in to registries
- aws ecr get-login-password | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com
- docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
# Get list of ECR repositories
- REPOS=$(aws ecr describe-repositories --query 'repositories[*].repositoryName' --output text)
# Process each repository
- |
for repo in $REPOS; do
echo "Processing repository: $repo"
# Get all tags for this repository
TAGS=$(aws ecr describe-images --repository-name $repo --query 'imageDetails[*].imageTags[]' --output text)
# Process each tag
for tag in $TAGS; do
echo "Processing tag: $tag"
# Pull image from ECR
docker pull ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${repo}:${tag}
# Tag for GitLab registry
docker tag ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${repo}:${tag} ${CI_REGISTRY_IMAGE}/${repo}:${tag}
# Push to GitLab
docker push ${CI_REGISTRY_IMAGE}/${repo}:${tag}
done
done
마이그레이션 실행 및 검증#
파이프라인을 설정한 후:
.gitlab-ci.yml파일을 저장소에 커밋하고 푸시합니다.- CI/CD > 파이프라인으로 이동하여 마이그레이션 진행 상황을 모니터링합니다.
- 완료 후 마이그레이션을 검증합니다:
- 패키지 및 레지스트리 > 컨테이너 레지스트리로 이동합니다.
- 모든 저장소와 태그가 있는지 확인합니다.
- 마이그레이션된 이미지 일부를 가져와 테스트합니다.
.gitlab-ci.yml 구성 예시#
이전 모든 단계를 따르면 .gitlab-ci.yml 파일은 다음과 같아야 합니다:
image: docker:20.10
services:
- docker:20.10-dind
variables:
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
BULK_MIGRATE: "true"
migration:
stage: deploy
script:
# Install required tools
- apk add --no-cache aws-cli jq
# Verify AWS credentials
- aws sts get-caller-identity
# Log in to registries
- aws ecr get-login-password | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com
- docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
# Get list of ECR repositories
- REPOS=$(aws ecr describe-repositories --query 'repositories[*].repositoryName' --output text)
# Process each repository
- |
for repo in $REPOS; do
echo "Processing repository: $repo"
# Get all tags for this repository
TAGS=$(aws ecr describe-images --repository-name $repo --query 'imageDetails[*].imageTags[]' --output text)
# Process each tag
for tag in $TAGS; do
echo "Processing tag: $tag"
# Pull image from ECR
docker pull ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${repo}:${tag}
# Tag for GitLab registry
docker tag ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${repo}:${tag} ${CI_REGISTRY_IMAGE}/${repo}:${tag}
# Push to GitLab
docker push ${CI_REGISTRY_IMAGE}/${repo}:${tag}
done
done
rules:
- if: $BULK_MIGRATE == "true"
