AWS ECR 태그가 지정되지 않은 오래된 이미지를 삭제하는 방법은 무엇입니까?

Amazon ECR은 Amazon Elastic Kubernetes Service(Amazon EKS), Amazon Elastic Container Service(Amazon ECS) 및 AWS Lambda와 통합되어 개발에서 프로덕션으로의 워크플로를 단순화합니다.

Amazon ECR은 확장성과 가용성이 뛰어난 아키텍처에서 이미지를 호스팅하므로 애플리케이션을 위한 컨테이너를 안정적으로 배포할 수 있습니다. 위생을 유지하려면 태그가 지정되지 않은 오래된 이미지를 삭제하는 것이 중요합니다.

오늘날 애플리케이션은 마이크로 서비스로 실행됩니다. 마이크로 서비스라는 용어는 애플리케이션이 모든 컴퓨팅 환경에서 빠르고 안정적으로 실행될 수 있도록 모든 코드와 해당 종속성을 패키징하는 컨테이너에 불과합니다. 휴대성, 작은 크기 및 편의성으로 인해 컨테이너는 현대적인 애플리케이션을 선적하기 위한 선택 방법이 되고 있습니다.

컨테이너는 이미지라는 읽기 전용 템플릿으로 설계되었습니다. 이러한 이미지는 사용 권한이 있는 모든 시스템에서 검색할 수 있도록 어딘가에 저장해야 합니다.

이것이 컨테이너 레지스트리가 필요한 곳입니다. 얼마 전 사람들은 DockerHub를 사용하여 이러한 이미지와 아티팩트를 저장했습니다. 하지만 AWS 클라우드 서비스를 사용 중이라면 DockerHub의 대안인 AWS ECR을 이미 사용 중이라고 확신합니다.

AWS ECR은 고성능 호스팅을 제공하는 완전 관리형 컨테이너 레지스트리로, 이를 통해 애플리케이션 이미지와 아티팩트를 퍼블릭 및 프라이빗 리포지토리 형태로 배포할 수 있습니다.

매일 여러 AWS 호스팅 애플리케이션이 수백만 개의 이미지/애플리케이션 아티팩트를 특정 ECR 리포지토리로 내보내고 끌어옵니다.

이 기사에서는 오래되고 사용되지 않는 AWS ECR을 지우고 ECR 리포지토리를 깨끗하게 유지하는 방법에 대해 설명합니다.

필요: 태그가 지정되지 않은 오래된 이미지를 지금 삭제하십시오!

ECR 리포지토리를 청소하는 주된 이유는 개발 위생입니다. 어느 누구도 ECR에 배포된 10개보다 오래된 이미지를 유지하고 싶지 않을 것입니다. 롤백이 업계에서 자주 발생하기 때문이기도 하지만 이전에 5개의 아티팩트에서 변경 사항을 되돌리는 롤백은 드물기 때문입니다.

간단히 말해서 배포가 5년 이상 된 이미지/아티팩트는 쓸모가 없습니다. 조직의 전략 보고서에서 변경될 수 있지만 모범 사례로 권장하지 않습니다.

  Google 스프레드시트에서 그래프를 만드는 방법

업계 전반에 걸쳐 태깅은 가장 안정적인 최신 또는 마지막 5개의 최신 이미지를 지정하는 데 사용됩니다. 소프트웨어 개발 수명 주기의 일부로 이미지가 빠르게 생성되고 이러한 태그가 새 이미지로 대체되어 이전 이미지에 태그가 지정되지 않고 쓸모가 없게 됩니다.

이미지/아티팩트가 큰 이와 같은 상황에서는 ECR에 대한 스토리지 요금도 추가됩니다. AWS ECR의 요금은 “프라이빗 또는 퍼블릭 리포지토리에 저장된 데이터의 경우 GB당 월 $0.10″입니다.

이 가격은 당신에게 작게 보일지 모르지만 그들이 말했듯이 물방울이 바다를 구성합니다. 이러한 모든 이미지를 장기간 보관하면 AWS 인보이스에 더 많은 비용이 추가됩니다.

필요하지 않기 때문에 ECR 저장소에서 이러한 오래되고 태그가 지정되지 않은 이미지를 지우는 것이 좋습니다! 단순한! 왜 유지하고 비용을 지불합니까?

수동으로 AWS ECR 이미지 삭제

방법 1: GUI 방식!

1단계: Amazon Web Services 계정에 로그인하고 지우려는 리포지토리로 이동합니다.

2단계: 여기에서 저장소에 가장 안정적인 버전을 지정하는 최신 태그가 있음을 알 수 있습니다. 표시되는 다른 태그는 태그가 지정되지 않은 태그라고 할 수 있습니다. 삭제하려면 이미지를 선택하고 삭제를 클릭하기만 하면 됩니다.

3단계: 삭제 확인

방법 2: CLI 방식!

CLI를 사용하여 이미지를 삭제하려면 머신에 구성된 모든 AWS IAM 액세스 키와 리포지토리에 대한 액세스 권한을 부여하는 데 필요한 IAM 권한이 필요합니다.

이 경우 이미 구성했습니다. 아직 수행하지 않은 경우 AWS 구성 기본 안내서에서 수행할 수 있습니다.

머신에 AWS CLI를 구성했는지 확실하지 않은 경우 다음 명령을 사용하여 확인하십시오.

aws sts get-caller-identity

이제 AWS CLI를 사용할 수 있음을 확인했으므로 다음 명령을 사용하여 태그가 지정되지 않은 ECR 이미지를 삭제할 수 있습니다.

aws ecr batch-delete-image --repository-name test-ecr-policy --image-ids imageTag=custom-image-6

여기서 우리는 GUI에서 했던 것과 비슷한 일을 하고 있습니다. test-ecr-policy 리포지토리에 있는 custom-image-6으로 태그가 지정된 이미지를 삭제합니다.

방법 3: 스크립팅 방식!

이 방법의 전제 조건은 실행 중인 시스템에 AWS 액세스 키를 구성하는 것입니다.

태그가 지정되지 않은 이미지를 삭제하는 스크립트입니다.

import boto3

client = boto3.client('ecr')

response = client.list_images(repositoryName="test-ecr-policy")

untaggedImageList = [image for image in response['imageIds'] if image['imageTag'] == 'custom-build-4']

response2 = client.batch_delete_image(repositoryName="aws-test-ecrpolicy", imageIds=untaggedImageList)

print(response2)

응답은 삭제된 이미지 ID 목록과 함께 오류가 있는 경우 이를 제공합니다.

  Linux에서 Dead Rising을 플레이하는 방법

ECR 이미지 삭제 예약 방법

DevOps 엔지니어이거나 AWS ECR을 정기적으로 관리하는 경우 이러한 이미지를 수동으로 삭제하는 어려움을 이미 알고 있을 것입니다.

스크립트/명령을 실행하면 작업이 더 쉬워지지만 걱정할 필요 없이 이러한 이미지를 자동으로 삭제하는 기능을 원했을 것입니다.

좋은 소식입니다. AWS ECR은 이미지에 대한 수명 주기 정책을 제공합니다. 이 정책은 이러한 이미지를 적시에 또는 예약된 방식으로 삭제하도록 설정할 수 있습니다. 어떻게 하는지 봅시다.

방법 1: GUI 방식!

1단계: 수명 주기 정책을 설정하려는 저장소로 이동합니다. 왼쪽 패널에서 수명 주기 정책을 볼 수 있습니다. 클릭하여 시작할 수 있습니다.

2단계: 이를 클릭하고 첫 번째 규칙을 만들 수 있습니다.

3단계: ECR을 사용하면 두 가지 조건에서 이미지를 삭제할 수 있습니다. 하나는 이미지가 지정된 날짜가 지난 경우 또는 태그가 지정되거나 태그가 지정되지 않고 X일 동안만 유지하려는 경우입니다.

어떻게 하는지 봅시다. 이제 태그 없는 이미지가 하루 이상 지난 경우 또는 태그 없는 이미지의 이미지 수가 1개를 초과하는 경우 태그 없는 이미지를 삭제할지 여부를 설정할 수 있습니다.

사용 사례에 따라 선택하십시오. 잊지 마세요. 이 숫자를 원하는 숫자로 늘릴 수 있습니다. 저장하여 수명 주기 규칙을 트리거합니다.

방법 2: CLI 방식!

수명 주기 정책을 설정하는 AWS ECR CLI 명령은 put-lifecycle-policy입니다.

어떻게 하는지 봅시다. 이를 위해 정책 조건을 나열하는 JSON 파일을 생성해야 합니다. 이름을 policy.json 또는 원하는 이름으로 지정할 수 있습니다.

그러나 그 전에 수명 주기 정책 요소를 살펴보겠습니다.

rulePriority (Type: integer, Required: yes):

낮은에서 높은 규칙 순서입니다. 우선 순위가 1인 수명 주기 정책 규칙이 먼저 적용된 다음 2와 같은 방식으로 적용됩니다. 수명 주기 정책 규칙은 각각 고유한 규칙 값을 가져야 합니다.

정책 규칙에는 연속 값이 필요하지 않습니다. 태그가 있는 규칙은 가장 높은 rulePriority를 ​​가지며 마지막에 검토되어야 합니다.

description (Type: string, Required: no):

수명 주기 정책의 규칙이 무엇을 위한 것인지 설명합니다.

tagStatus (Type: string, Required: yes):

추가된 수명 주기 정책 규칙이 이미지 태그를 지정하는지 확인합니다. 태그가 지정되었거나, 태그가 지정되지 않았거나, 아무거나 괜찮습니다. 아무 것도 지정하지 않으면 모든 이미지가 평가됩니다. 태그를 지정하려면 tagPrefixList 값이 필요합니다. 태그가 지정되지 않은 경우 tagPrefixList를 생략해야 합니다.

tagPrefixList (Type: list[string], Required: yes, only if tagStatus is set to tagged):

“tagStatus”가 “태그 지정”된 경우 수명 주기 정책에 쉼표로 구분된 이미지 태그 접두사 목록이 필요합니다.

  Xtreme Download Manager를 사용하여 Linux에서 500% 더 빠른 다운로드 속도 얻기

태그 접두사 prod를 사용하여 prod, prod1, prod2 등으로 표시된 모든 이미지를 지정할 수 있습니다. 여러 태그는 모든 태그가 있는 이미지만 선택합니다.

countType (Type: string, Required: yes):

countType이 imageCountMoreThan인 경우 countNumber를 지정하여 저장소의 이미지 수를 제한합니다.

countType이 sinceImagePushed인 경우 countUnit 및 countNumber를 지정하여 저장소의 이미지를 제한합니다.

countUnit (Type: string, Required: yes, only if countType is set to sinceImagePushed):

countType이 sinceImagePushed인 경우에만 카운트 단위를 지정하십시오. 그렇지 않으면 오류가 발생합니다.

countNumber (Type: integer, Required: yes):

양의 정수만 가능(0은 허용되는 값이 아님). countType이 imageCountMoreThan인 경우 값은 보관할 최대 사진 수입니다. countType으로 sinceImagePushed를 사용하면 최대 이미지 수명이 결정됩니다.

 type (Type: string, Required: yes):

작업 유형을 선택합니다. 사용할 수 있는 값은 “만료”입니다.

여기 내 “policy.json”이 있습니다.

{

"rules": [

{

"rulePriority": 1,

"description": "Expire images older than 10 days",

"selection": {

"tagStatus": "untagged",

"countType": "sinceImagePushed",

"countUnit": "days",

"countNumber": 14

},

"action": {

"type": "expire"

}

}

]

}

조직의 요구 사항에 따라. “sinceImagePushed”는 “imageCountMoreThan”으로 대체될 수 있습니다.

이 정책을 설정하는 CLI 명령은 다음과 같습니다.

aws ecr put-lifecycle-policy --repository-name "test-ecr-polict" --lifecycle-policy-text "file://policy.json"

방법 3: 스크립팅 방식!

이를 위해 boto3 명령을 사용할 것입니다. 동일한 “policy.json”을 사용하여 이를 설정할 수 있습니다. 아래는 사용된 코드 스니펫입니다.

import boto3

client = boto3.client('ecr')

response = client.put_lifecycle_policy(
registryId='PODES12342',
repositoryName="test-ecr-policy",
lifecyclePolicyText="plicy.json"
)

print(response)

여러 ECR 리포지토리에 단일 정책을 적용하려면 어떻게 합니까?

종종 여러 저장소에 동일한 정책을 적용하는 방법에 대한 질문이 있습니다.

수동으로 정책을 설정하는 것은 반복적이고 지루한 작업입니다.

다음은 프로덕션 시스템에서 100개 이상의 저장소에 정책을 적용하는 데 사용할 수 있는 코드 조각입니다.

from boto3 import Session,client

from os import getenv
AWS_ACCESS_KEY_ID = getenv("ACCESSKEY")


AWS_SECRET_ACCESS_KEY = getenv("SECRETKEY")
session = Session(
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY
)

client = client('ecr')

response = client.describe_repositories()

repositories = response['repositories']

globalLifecyclePolicy = 'put your policy here’’

for repo in repositories:

repoName = repo['repositoryName']

client.put_lifecycle_policy( repositoryName = repoName,lifecyclePolicyText = globalLifecyclePolicy)

결론

ECR 수명 주기 정책을 쉽게 구성하고 지정된 매개변수에 따라 오래된 이미지를 삭제할 수 있습니다. AWS는 광범위한 문서와 수명 주기 정책 샘플을 제공합니다.

이미지가 업로드된 날짜와 기준을 일치시키는 것과 같이 태그가 지정된 이미지에 대한 대체 정책을 실험할 수도 있습니다.

AWS 학습을 발전시키는 몇 가지 AWS 주요 용어를 살펴볼 수도 있습니다.