Como excluir imagens mais antigas e não marcadas do AWS ECR?

O Amazon ECR é integrado ao Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) e AWS Lambda, simplificando o fluxo de trabalho de desenvolvimento para produção.

O Amazon ECR hospeda as imagens em uma arquitetura altamente escalável e disponível, permitindo que você implante contêineres de forma confiável para seus aplicativos. É importante excluir imagens não marcadas e antigas para manter a higiene.

Hoje, os aplicativos são executados como microsserviços. O termo microsserviço nada mais é do que um container que empacota todo o código e suas dependências para que a aplicação possa rodar de forma rápida e confiável em qualquer ambiente computacional. Devido à sua portabilidade, tamanho pequeno e conveniência, os contêineres estão se tornando um método de escolha para o envio de aplicações modernas.

Os contêineres são projetados a partir de um modelo somente leitura chamado imagem. Essas imagens precisam ser armazenadas em algum lugar para que possam ser recuperadas por qualquer máquina autorizada a usá-las.

É aí que entra um registro de contêiner. Não muito tempo atrás, as pessoas usavam o DockerHub para armazenar essas imagens e artefatos. Mas, se você estiver usando os serviços de nuvem da AWS, tenho certeza de que já está usando o AWS ECR, que é uma alternativa ao DockerHub.

O AWS ECR é um registro de contêiner totalmente gerenciado que oferece hospedagem de alto desempenho, permitindo que você implante imagens e artefatos de aplicativos na forma de repositórios públicos e privados.

Todos os dias, vários aplicativos hospedados na AWS enviam e extraem milhões de imagens/artefatos de aplicativos de/para repositórios ECR específicos.

Neste artigo, discutiremos como limpar o AWS ECR antigo e obsoleto e manter os repositórios do ECR limpos.

A necessidade: excluir imagens antigas e não marcadas agora!

A principal razão para limpar os repositórios ECR é a higiene do desenvolvimento. A qualquer momento, ninguém gostaria de manter imagens com mais de dez implantações em seus ECRs. É também porque as reversões acontecem com frequência no setor, mas uma reversão que reverta a alteração de 5 artefatos anteriores é rara.

Em termos mais simples, quaisquer imagens/artefatos com mais de cinco implementações são inúteis. Ele está sujeito a alterações no relatório de estratégia de sua organização, mas não o recomendamos como prática recomendada.

  O que é MagSafe para iPhone 12 e o que ele pode fazer?

Em todo o setor, a marcação é usada para especificar as imagens mais recentes mais estáveis ​​ou as últimas cinco últimas imagens. Como parte do ciclo de vida de desenvolvimento de software, as imagens são geradas rapidamente e essas tags são substituídas por novas imagens, deixando as imagens mais antigas sem tags e inúteis.

Em situações como essa, em que as imagens/artefatos são grandes, ele também adicionará cobranças de armazenamento no ECR. O preço do AWS ECR é de “US$ 0,10 por GB/mês para dados armazenados em repositórios públicos ou privados”.

Este preço pode parecer pequeno para você, mas como dizem, as gotas compõem o oceano. Todas essas imagens, se armazenadas por um período mais longo, adicionarão contas mais altas às suas faturas da AWS.

A sugestão é limpar essas imagens antigas e não marcadas de seus repositórios ECR porque você não precisa delas! Simples! Por que mantê-lo e pagar por isso?

Excluir imagens do AWS ECR manualmente

Método 1: O Caminho da GUI!

Etapa 1: faça login na conta da Amazon Web Services e vá para o repositório que você deseja limpar.

Passo 2: Aqui, você pode ver que o repositório tem a tag mais recente para especificar a versão mais estável. As outras tags que você vê podem ser chamadas de não marcadas. Para excluir, basta selecionar a imagem e clicar em excluir.

Etapa 3: confirmar para excluir

Método 2: O jeito CLI!

Para excluir uma imagem usando a CLI, você precisará de todas as chaves de acesso do AWS IAM configuradas em sua máquina e da permissão necessária do IAM para fornecer acesso aos repositórios.

Neste caso, já o configuramos. Você pode fazer isso no guia básico de configuração da AWS, caso ainda não tenha feito isso.

Se não tiver certeza de que configurou a AWS CLI em sua máquina, use o comando a seguir para verificar.

aws sts get-caller-identity

Agora que confirmamos que podemos usar a AWS CLI, você pode usar o comando a seguir para excluir uma imagem ECR não marcada.

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

Aqui estamos fazendo algo semelhante ao que fizemos na GUI. Excluiremos a imagem marcada como custom-image-6 que reside no repositório test-ecr-policy.

Método 3: A maneira de script!

O pré-requisito para esse método é ter uma chave de acesso da AWS configurada na máquina em que você está executando.

Script para excluir imagens não marcadas.

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)

A resposta forneceria a lista de IDs de imagem excluídas, juntamente com uma falha, se houvesse alguma.

Método de agendamento para excluir imagens ECR

Se você é um engenheiro de DevOps ou gerencia regularmente o AWS ECR, já conhece as dificuldades de excluir essas imagens manualmente.

  Como sincronizar planilhas do Microsoft Excel

A execução do script/comando facilita as coisas, mas temos certeza de que você desejaria algo que excluísse automaticamente essas imagens por conta própria, sem que você tivesse que se preocupar com elas.

Boas notícias, o AWS ECR oferece uma política de ciclo de vida para suas imagens, que você pode definir para excluir essas imagens de maneira oportuna ou programada. Vamos ver como fazê-lo.

Método 1: O Caminho da GUI!

Etapa 1: Vá até o repositório onde você deseja definir a política de ciclo de vida. No painel esquerdo, você pode ver a Política de Ciclo de Vida. Você pode clicar nele para começar.

Passo 2: Você pode clicar nele e criar sua primeira regra.

Etapa 3: o ECR permite excluir imagens em duas condições, sendo uma delas se suas imagens tiverem dias especificados ou se forem marcadas/não marcadas, e você quiser retê-las apenas por, digamos, X dias.

Vamos ver como é feito. Agora você pode definir se deseja excluir imagens não marcadas se forem de um dia ou mais ou se a contagem de imagens não marcadas exceder um.

Escolha de acordo com o seu caso de uso. Não se esqueça; você pode aumentar esses números para o número de sua escolha. Salve para acionar a Regra de Ciclo de Vida.

Método 2: O jeito CLI!

O comando da AWS ECR CLI para definir a política de ciclo de vida é put-lifecycle-policy.

Vamos ver como fazê-lo. Para isso, você deve criar um arquivo JSON listando as condições da política. Você pode nomeá-lo policy.json ou qualquer nome de sua escolha.

Mas antes disso, vejamos os elementos da política de ciclo de vida.

rulePriority (Type: integer, Required: yes):

Ordem de regra de baixo para cima. Regras de política de ciclo de vida com prioridade um são aplicadas primeiro, depois 2, etc. Cada regra de política de ciclo de vida deve ter um valor de regra exclusivo.

As regras de política não precisam de valores consecutivos. As regras com qualquer tag devem ter o rulePriority mais alto e ser revisadas por último.

description (Type: string, Required: no):

Explica para que serve uma regra em uma política de ciclo de vida.

tagStatus (Type: string, Required: yes):

Ele verifica se a regra de política de ciclo de vida adicionada especifica uma tag de imagem. Marcado, não marcado ou qualquer um está OK. Se nenhum for especificado, todas as imagens serão avaliadas. Tagged requer um valor tagPrefixList. Untagged requer a omissão de tagPrefixList.

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

Se “tagStatus” for “marcado”, sua política de ciclo de vida exigirá uma lista separada por vírgulas de prefixos de tags de imagem.

  Como desligar o Walkie Talkie no Apple Watch

Usando o prefixo de tag prod, você pode especificar todas as imagens marcadas como prod, prod1, prod2, etc. Várias tags selecionam apenas imagens com todas as tags.

countType (Type: string, Required: yes):

Especifique countNumber se countType for imageCountMoreThan para limitar o número de imagens em seu repositório.

Especifique countUnit e countNumber se countType for sinceImagePushed para limitar as imagens do repositório.

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

Especifique uma unidade de contagem apenas quando countType for sinceImagePushed; caso contrário, ocorre um erro.

countNumber (Type: integer, Required: yes):

Somente inteiros positivos (0 não é um valor aceito). Se countType for imageCountMoreThan, o valor será o número máximo de fotografias a serem mantidas. Usar sinceImagePushed como countType determina a idade máxima da imagem.

 type (Type: string, Required: yes):

Escolha um tipo de ação. O valor que pode ser usado é “expire”.

Aqui está minha “policy.json”.

{

"rules": [

{

"rulePriority": 1,

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

"selection": {

"tagStatus": "untagged",

"countType": "sinceImagePushed",

"countUnit": "days",

"countNumber": 14

},

"action": {

"type": "expire"

}

}

]

}

De acordo com os requisitos da sua organização. “sinceImagePushed” pode ser substituído por “imageCountMoreThan”.

O comando CLI para definir esta política seria:

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

Método 3: A maneira de script!

Nós estaremos usando o comando boto3 para conseguir isso. Podemos usar o mesmo “policy.json” para configurar isso. Abaixo está o trecho de código usado.

import boto3

client = boto3.client('ecr')

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

print(response)

Como aplicar uma política única em vários repositórios ECR?

Muitas vezes, há dúvidas sobre como aplicar a mesma política em vários repositórios.

É uma tarefa repetitiva e chata definir políticas manualmente.

Aqui está um trecho de código que pode ser usado no sistema de produção para aplicar uma política em mais de 100 repositórios.

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)

Conclusão

Podemos construir facilmente uma política de ciclo de vida do ECR e destruir imagens mais antigas de acordo com os parâmetros especificados. A AWS fornece extensa documentação, bem como exemplos de políticas de ciclo de vida.

Você também pode experimentar políticas alternativas para imagens marcadas, como critérios de correspondência com a data em que a imagem foi carregada.

Você também pode explorar algumas terminologias de chave da AWS que aprimoram seu aprendizado da AWS.