본문 바로가기
IT

아마존 ECR에서 이미지 안전하게 제거하기

by PICK BANK 2022. 9. 1.

[Amazon ECS ECR을 사용한 이미지 작업]

카약은 주로 컨테이너 오케스트레이션을 위해 Amazon ECS를 사용합니다. ECS에 작업을 배포할 때 이미지 태그에 애플리케이션의 Git 리포지토리의 커밋 해시(계산됨)를 제공하고 Amazon ECR에 푸시한 다음 작업 정의에 태그가 포함된 URL을 지정합니다.git log -1 --format=%H

 

: 작업 정의에 지정할 이미지 URL 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/app:5ff700463f8852c8556fbf9d11dd041eb7234016

 

각 배포에 대한 이 고유한 태그는 응용 프로그램이 이미지에 포함된 시점을 명확하게 합니다. 배포에 문제가 있고 ECS 서비스를 롤백하는 데 문제가 있는 경우에도 이전에 작동하던 이미지로 되돌릴 수 있습니다.

 

그러나 이러한 방식으로 작업하면 각 배포마다 이미지가 ECR에 누적됩니다. ECR 용량이 증가함에 따라 비용도 증가하므로 더 이상 필요하지 않은 이미지를 삭제해야합니다.

 

ECR에 저장된 이미지에는 GB0.10 USD가 부과됩니다. 예를 들어 하루에 10(한 달에 20) 1GB의 이미지를 저장하면 한 달에 200GB(20USD)의 이미지가 누적됩니다. 전혀 삭제하지 않고 1 년 동안이 작업을 계속하면 2 개월째에는 40 USD, 3 개월은 60 USD입니다 ...... 누적되면 1 년 동안 총 1560 USD가 부과됩니다.

 

[ECR 수명 주기 정책의 삭제로 인해 발생하는 문제]

ECR은 수명 주기 정책을 설정하여 조건과 일치하는 이미지를 자동으로 삭제할 수 있습니다. 푸시된 이후의 일 수와 태그 접두사당 세대 수를 지정하여 삭제할 설정을 지정하여 불필요한 이미지를 삭제할 수 있습니다.

 

그러나 수명 주기 정책이 설정된 제품에는 ECS 서비스에서 사용 중인 이미지가 삭제되어 새 작업이 시작되지 않는 문제가 발생했습니다.

 

조사 결과, 실제로 실행 중인 ECS 작업에 사용되는 이미지가 삭제되어 다음과 같은 상황이 발생한 것으로 나타났습니다.

 

이 제품에는 동일한 AWS 계정에 여러 마이크로 서비스가 있으며 각 서비스에는 ECS 서비스와 작업 정의가 있습니다.

여러 마이크로 서비스가 일반적으로 사용하는 사이드카 이미지(: 로그 전달을 위해 Fluentd)는 공통 ECR 저장소를 참조합니다.

각 마이크로 서비스가 배포될 때마다 이미지가 새 태그로 ECR로 푸시됩니다.

자주 배포하는 서비스 A는 이미지 태그를 업데이트하고 세대가 쌓입니다.

드물게 배포되지 않는 서비스 B에서 사용하는 이미지 태그는 세대 관리에서 제거되었습니다.

수명 주기 규칙 삭제는 이미지가 ECS에서 실제로 사용되는지 여부를 고려하지 않습니다. (한 번 가져온 이미지가 사용되는 방법은 컨테이너 레지스트리와 관련 될 수있는 것이 아니므로 자연스러운 것입니다.)

 

따라서 단순히 이미지를 생성별로 관리하면 실제로 사용중인 이미지가 삭제 될 수 있습니다.

푸시 후 일 단위로 삭제하는 경우 자주 배포되지 않는 서비스의 이미지를 유지하기 위해 많은 세대(자주 배포되는 서비스에 의해 업데이트됨)를 남겨두어야 합니다.

 

각 배포에 대해 커밋 해시 대신 특정 접두사가 있는 태그(: service-a-20220830-112233, service-b-20220830-112233 )를 추가하고 해당 태그에 대한 세대 관리를 고려했습니다.

 

그러나 라이프 사이클 정책에서 여러 tagPrefixList 설정을 설정하면 그 중 하나와 일치하면 삭제 될 수 있으므로 이미지를 안정적으로 사용할 수없는 것처럼 보입니다. 여러 서비스가 동시에 배포된 경우 동일한 이미지를 참조할 수 있으므로 서비스 중 하나가 조건과 일치하면 삭제됩니다.

 

[만든 ecrm]

따라서 수명 주기 정책에 관계없이 ECR에서 "사용되지 않은"이미지를 제거하는 CLI 도구를 만들었습니다.

GitHub - fujiwara/ecrm: A command line tool for managing ECR repositories.

 

GitHub - fujiwara/ecrm: A command line tool for managing ECR repositories.

A command line tool for managing ECR repositories. - GitHub - fujiwara/ecrm: A command line tool for managing ECR repositories.

github.com

여기서, ECR 영상이 "사용"되는 경우는 다음과 같은 조건을 의미한다.

 

ECS 클러스터에서 현재 실행 중인 작업에 포함된 이미지

ECS 서비스에 지정된 태스크 정의에 포함된 이미지

ECS 임무 정의에 지정된 이미지(최신 개정판에서 지정된 세대 수)

Lambda 함수에 지정된 이미지(최신 버전에서 지정된 세대 수)

이러한 이미지는 현재 사용 중이거나 롤백되어 배포에서 사용될 수 있으므로 삭제해서는 안 됩니다.

 

해당 이미지 이외의 이미지를 안전하게 삭제할 수있는 것처럼 삭제를 수행하는 도구이며 푸시 이후 특정 일 이상 지났습니다.

 

ECRM 사용

구성 파일 생성

환경 변수 등으로 올바르게 설정된 AWS 계정의 자격 증명으로 실행하면 계정에 존재하는 ECR, ECS Lambda 리소스를 기반으로 구성 파일()이 자동으로 생성됩니다.ecrm generateecrm.yaml

 

클러스터 및 작업 정의는 와일드카드 패턴으로 지정할 수 있으므로 기호()로 구분하여 함께 그룹화할 가능성이 있는 클러스터는 그에 따라 요약된 패턴이 있는 구성 파일에 생성됩니다.[_/-]

 

기본적으로 다음 조건과 일치하는 이미지를 남기고 나머지는 삭제하는 구성을 생성합니다.

 

ECS 태스크 정의에 포함된 내용

최신 5 세대

ECS 서비스 및 작업에 실제로 사용되는 것이 있으면

Lambda 함수에 지정된 것은 무엇입니까?

최신 버전의 5 세대

별칭이 설정된 버전

이미지를 푸시한 후 30일 이내

태그가 지정된 이미지latest

대상 리포지토리, ECS 클러스터 및 태스크 정의, Lambda 함수의 이름, 저장할 생성, ECR로 푸시된 이후의 일수, 보호할 태그 패턴은 구성 파일에서 그에 따라 사용자 지정할 수 있습니다.

 

[삭제 가능한 이미지 검토 및 삭제]

ecrm plan AWS 계정에 존재하는 ECS Lambda를 검색하고, ECR에서 안전하게 삭제할 수 있는 이미지를 감지하고, 정보를 표시합니다.

 

EXPIRED 열에는 안전하게 삭제할 수 있는 이미지의 수와 용량이 표시됩니다.

ecrm delete ECR에서 삭제해도 안전하다고 보이는 계획에서 감지 된 이미지를 실제로 제거합니다.

 

[ECRM 사용에 대한 주의 사항]

현재 ecrmECS(작업, 작업 정의 및 서비스) Lambda 함수를 스캔하여 사용 중인 이미지를 감지하지만 AWS App Runner 또는 Amazon EKS에서 사용하는 이미지에 대해서는 아무것도 알지 못합니다. App Ruuner 또는 EKS를 사용할 때는 주의하시기 바랍니다.

 

댓글