Gerenciamento Eficiente de Imagens no Amazon ECR
O Amazon ECR (Elastic Container Registry) opera em perfeita sinergia com serviços como Amazon EKS (Elastic Kubernetes Service), Amazon ECS (Elastic Container Service) e AWS Lambda, o que agiliza o fluxo de trabalho desde o desenvolvimento até a produção.
O ECR oferece um ambiente robusto e escalável para hospedar imagens de contêineres, assegurando implantações confiáveis de aplicações. Para manter a organização e a eficiência, é crucial remover imagens sem tags e versões antigas.
Hoje em dia, aplicações são frequentemente construídas como microsserviços. Um microsserviço, em essência, é um contêiner que encapsula o código e suas dependências, permitindo que a aplicação funcione de forma consistente em diferentes ambientes. Devido à sua portabilidade, tamanho reduzido e praticidade, os contêineres são a opção preferencial para a distribuição de aplicações modernas.
Os contêineres são criados a partir de um modelo de leitura, conhecido como imagem. Estas imagens precisam de um local para armazenamento, de modo que possam ser acessadas por qualquer máquina autorizada a utilizá-las.
É nesse ponto que entra em cena um registro de contêiner. Anteriormente, o DockerHub era usado para armazenar essas imagens e artefatos. No entanto, se você utiliza os serviços de nuvem da AWS, o AWS ECR, uma alternativa ao DockerHub, provavelmente já faz parte do seu dia a dia.
O AWS ECR é um registro de contêineres totalmente administrado, que oferece hospedagem de alto desempenho, permitindo a implantação de imagens e artefatos de aplicações através de repositórios públicos e privados.
Diariamente, inúmeras aplicações hospedadas na AWS enviam e recuperam milhões de imagens e artefatos de aplicações de/para repositórios ECR específicos.
Neste artigo, vamos explorar como realizar a limpeza de imagens antigas e obsoletas no AWS ECR, mantendo seus repositórios sempre organizados.
A Importância da Remoção de Imagens Antigas e sem Tags
A principal razão para a manutenção dos repositórios ECR é a higiene do desenvolvimento. É essencial evitar o acúmulo de imagens desatualizadas nos ECRs, geralmente aquelas que não são utilizadas em mais de dez implantações. Embora reversões sejam comuns no setor, é raro reverter uma mudança para mais de cinco artefatos anteriores.
De forma mais simples, imagens ou artefatos que não são usados há mais de cinco implantações são, geralmente, inúteis. Essa diretriz pode variar de acordo com as políticas da sua organização, mas, de modo geral, é uma prática recomendada.
A utilização de tags é uma prática comum no setor, para identificar imagens mais recentes, estáveis ou as últimas cinco versões. Durante o ciclo de vida do desenvolvimento de software, novas imagens são criadas rapidamente e suas tags substituem versões anteriores, o que deixa imagens antigas sem tags e sem utilidade.
Imagens e artefatos de grande tamanho podem gerar custos de armazenamento no ECR. A precificação do AWS ECR é de “US$ 0,10 por GB/mês para dados armazenados em repositórios públicos ou privados”.
Embora esse valor possa parecer pequeno, o acúmulo de imagens ao longo do tempo pode gerar contas mais altas em suas faturas da AWS.
Portanto, a sugestão é clara: remova as imagens antigas e não marcadas de seus repositórios ECR. Não há motivo para mantê-las e continuar pagando por elas!
Remoção Manual de Imagens do AWS ECR
Método 1: Através da Interface Gráfica (GUI)
Passo 1: Acesse sua conta da Amazon Web Services e navegue até o repositório que precisa ser limpo.
Passo 2: Verifique que o repositório possui uma tag para a versão mais recente e estável. As outras tags podem ser consideradas não marcadas. Para excluir, selecione a imagem desejada e clique em “excluir”.
Passo 3: Confirme a exclusão.
Método 2: Utilizando a Linha de Comando (CLI)
Para excluir uma imagem usando a CLI, é preciso ter as chaves de acesso do AWS IAM configuradas em sua máquina e as permissões necessárias para acesso aos repositórios.
Nesse caso, já temos essa configuração. Consulte o guia de configuração da AWS, se você ainda não tiver isso configurado.
Para verificar se a AWS CLI está configurada corretamente na sua máquina, utilize o seguinte comando:
aws sts get-caller-identity
Com a confirmação da funcionalidade da AWS CLI, podemos usar o seguinte comando para excluir uma imagem ECR sem tag:
aws ecr batch-delete-image --repository-name test-ecr-policy --image-ids imageTag=custom-image-6
Essa ação é semelhante ao que foi feito via GUI. A imagem com a tag “custom-image-6”, no repositório “test-ecr-policy”, será excluída.
Método 3: Utilizando um Script
Para este método, é necessário ter as chaves de acesso da AWS configuradas na máquina onde o script será executado.
Script para exclusão de 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 retornará a lista de IDs de imagem excluídas, bem como qualquer falha que possa ter ocorrido.
Agendamento da Remoção de Imagens do ECR
Para engenheiros DevOps e administradores de AWS ECR, a exclusão manual de imagens pode ser um processo trabalhoso.
O uso de scripts/comandos simplifica o processo, mas o ideal seria uma solução que exclua automaticamente as imagens, sem a necessidade de intervenção manual.
O AWS ECR oferece políticas de ciclo de vida para imagens, permitindo agendar a exclusão automática de imagens. Veja como configurá-las.
Método 1: Configuração da Política de Ciclo de Vida via GUI
Passo 1: Acesse o repositório e clique na opção “Política de Ciclo de Vida”, localizada no painel esquerdo.
Passo 2: Crie sua primeira regra de política.
Passo 3: O ECR permite excluir imagens com base em duas condições: idade ou status de marcação. Você pode definir o tempo de retenção de imagens ou optar por excluir imagens sem tag, após um determinado período.
Para imagens não marcadas, pode-se definir a exclusão após um dia ou quando o número de imagens não marcadas exceder um determinado valor. Escolha a configuração que melhor se adapta às suas necessidades. Salve as alterações para ativar a regra.
Método 2: Configuração da Política de Ciclo de Vida via CLI
O comando da AWS ECR CLI para configurar a política de ciclo de vida é “put-lifecycle-policy”.
Para isso, é necessário criar um arquivo JSON contendo as condições da política. O nome do arquivo pode ser definido como “policy.json” ou outro de sua preferência.
Vamos analisar os elementos da política de ciclo de vida:
rulePriority (Tipo: inteiro, Obrigatório: sim):
Define a ordem de aplicação das regras, sendo 1 a mais alta prioridade. Cada regra deve ter um valor de prioridade único. As regras não precisam ter valores consecutivos. Regras com qualquer tag devem ter a maior prioridade e serem avaliadas por último.
description (Tipo: string, Obrigatório: não):
Descreve o objetivo da regra na política de ciclo de vida.
tagStatus (Tipo: string, Obrigatório: sim):
Especifica se a regra se aplica a imagens marcadas, não marcadas ou ambas. “Tagged” requer um valor “tagPrefixList”. “Untagged” não requer um valor “tagPrefixList”.
tagPrefixList (Tipo: lista[string], Obrigatório: sim, apenas se tagStatus estiver definido como tagged):
Se “tagStatus” for “tagged”, a política exigirá uma lista de prefixos de tags de imagem separada por vírgulas. Por exemplo, o prefixo “prod” seleciona imagens como “prod”, “prod1”, “prod2”, etc.
countType (Tipo: string, Obrigatório: sim):
Use “imageCountMoreThan” para limitar o número de imagens no repositório ou “sinceImagePushed” para limitar as imagens por idade.
countUnit (Tipo: string, Obrigatório: sim, apenas se countType estiver definido como sinceImagePushed):
Especifica a unidade de tempo para contagem de imagens (ex: dias), quando “countType” for “sinceImagePushed”.
countNumber (Tipo: inteiro, Obrigatório: sim):
Valor inteiro positivo (0 não é aceito). Se “countType” for “imageCountMoreThan”, o valor é o número máximo de imagens a serem mantidas. Se “countType” for “sinceImagePushed”, o valor determina a idade máxima da imagem.
type (Tipo: string, Obrigatório: sim):
Define a ação a ser realizada. O valor padrão é “expire”.
Este é um exemplo de arquivo “policy.json”:
{ "rules": [ { "rulePriority": 1, "description": "Expire images older than 10 days", "selection": { "tagStatus": "untagged", "countType": "sinceImagePushed", "countUnit": "days", "countNumber": 14 }, "action": { "type": "expire" } } ] }
Adapte as configurações de acordo com os requisitos da sua organização. “sinceImagePushed” pode ser substituído por “imageCountMoreThan”.
O comando CLI para aplicar essa política é:
aws ecr put-lifecycle-policy --repository-name "test-ecr-polict" --lifecycle-policy-text "file://policy.json"
Método 3: Configuração da Política de Ciclo de Vida via Script
O comando “boto3” pode ser usado para configurar a política de ciclo de vida. O mesmo arquivo “policy.json” pode ser usado. O código a seguir demonstra como:
import boto3 client = boto3.client('ecr') response = client.put_lifecycle_policy( registryId='PODES12342', repositoryName="test-ecr-policy", lifecyclePolicyText="plicy.json" ) print(response)
Aplicação de uma Política Única em Múltiplos Repositórios ECR
A aplicação da mesma política em vários repositórios pode ser uma tarefa repetitiva.
O script abaixo automatiza a aplicação de políticas 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
A criação de políticas de ciclo de vida no ECR é uma maneira eficiente de remover imagens antigas e não utilizadas, seguindo os critérios definidos. A AWS oferece documentação detalhada e exemplos de políticas de ciclo de vida.
Você pode explorar outras opções, como políticas para imagens marcadas, ou combinar critérios de correspondência com a data de upload da imagem.
Aproveite também para conhecer as terminologias chave da AWS, que podem aprimorar seu aprendizado da plataforma.