Automatizando a Limpeza de Imagens ECR com Bash

Gerenciar imagens de container no Amazon ECR (Elastic Container Registry) e crucial para manter seu registro limpo e com boa relacao custo-beneficio. Com o tempo, imagens nao utilizadas ou depreciadas podem se acumular, potencialmente levando a custos de armazenamento mais altos e sobrecarga operacional. Um cenario comum e remover imagens que seguem um padrao de tag especifico, neste caso, qualquer imagem com tag seguindo o formato "9.x.x", onde x representa um ou mais digitos.
Este artigo apresenta um script Bash projetado para automatizar a limpeza de imagens ECR. O script oferece dois modos principais: dry-run e apply, permitindo simular ou executar exclusoes conforme sua necessidade.
Visao Geral do Script
O script Bash utiliza a AWS CLI e o jq (um processador JSON leve e flexivel para linha de comando) para:
- Listar Todos os Repositorios ECR:
Consulta a AWS ECR por todos os repositorios disponiveis na sua conta. - Obter Imagens e Tags:
Para cada repositorio, lista os detalhes das imagens (incluindo digests e tags). - Aplicar Filtro de Tags:
Usa uma expressao regular (^9\.[0-9]+\.[0-9]+$) para encontrar imagens cujas tags correspondem ao formato "9.x.x" (ex.: "9.0.1" ou "9.12.3"). - Modos Operacionais:
- Dry Run (
--dry-run): O script apenas lista as imagens que seriam excluidas, oferecendo a oportunidade de verificar quais imagens se qualificam sem nenhum risco. - Apply (
--apply): Executa a exclusao das imagens identificadas dos repositorios.
- Dry Run (
- Informacoes de Uso:
Se o script for executado sem um argumento valido, ele exibe uma mensagem de ajuda explicando as opcoes disponiveis.
Funcionalidades Principais
1. Descoberta Automatica de Repositorios
- O que faz:
O script recupera dinamicamente todos os repositorios ECR disponiveis, em vez de exigir entrada manual ou nomes de repositorio fixos no codigo. - Beneficio:
Isso garante que o script permaneca escalavel e adaptavel, lidando com mudancas na lista de repositorios da sua conta sem configuracao extra.
2. Filtro Flexivel de Tags com Regex
- O que faz:
Usa uma expressao regular para corresponder a tags de versao que comecam com9.seguido por mais dois grupos de digitos separados por ponto. - Beneficio:
A abordagem baseada em regex fornece controle preciso sobre quais imagens devem ser alvejadas. Permite manter uma convencao de nomenclatura e limpar imagens que se encaixam em um padrao especifico de versionamento obsoleto ou depreciado.
3. Operacao em Modo Duplo (Dry-Run vs. Apply)
- O que faz:
O script aceita argumentos de linha de comando para simular a exclusao (--dry-run) ou realmente executa-la (--apply). - Beneficio:
Esta abordagem de modo duplo oferece seguranca ao permitir que voce verifique o impacto antes de realizar acoes destrutivas. E um recurso valioso para administradores que precisam testar scripts em ambientes similares a producao primeiro.
4. Tratamento Robusto de Erros e Modo Estrito
- O que faz:
O script usaset -euo pipefaildo Bash para impor verificacao estrita de erros. Esta configuracao faz o script parar a execucao quando ocorrem erros, ao referenciar variaveis nao definidas ou quando qualquer comando em um pipeline falha. - Beneficio:
Isso minimiza o risco de operacoes incompletas ou comportamento imprevisivel do script, promovendo um ambiente de execucao mais confiavel.
5. Documentacao de Uso Clara
- O que faz:
Se um argumento incorreto ou nenhum argumento for fornecido, exibe uma mensagem de ajuda com instrucoes claras de uso e descricoes de cada modo. - Beneficio:
Isso ajuda a reduzir erros do usuario e esclarece como operar o script, tornando-o mais acessivel ate mesmo para usuarios menos experientes.
Pros e Contras
Pros
- Seguranca e Previsibilidade:
A inclusao de um modo dry-run ajuda os administradores a visualizar as alteracoes antes de confirmar a exclusao, reduzindo o risco de perda acidental de dados. - Descoberta Automatizada:
A consulta automatica de todos os repositorios simplifica a administracao e garante limpeza abrangente. - Filtro Baseado em Regex:
Uma expressao regular robusta para filtragem de tags facilita alvejar imagens especificas com base em padroes de versao. - Simplicidade e Extensibilidade:
Escrito em Bash, o script e simples de entender e modificar. Sua estrutura direta o torna acessivel para customizacao adicional para atender necessidades extras. - Tratamento Robusto de Erros:
Os mecanismos de tratamento de erros do script (usandoset -euo pipefail) aumentam a confiabilidade interrompendo a execucao em erros inesperados.
Contras
- Dependencia da AWS CLI e jq:
O script requer que tanto a AWS CLI quanto ojqestejam instalados e configurados corretamente. Em ambientes onde essas ferramentas nao estao pre-instaladas, configuracao extra e necessaria. - Flexibilidade Limitada do Regex:
O regex atual e especificamente ajustado para corresponder a versoes "9.x.x". Se o seu esquema de versionamento mudar, voce pode precisar ajustar o regex, tornando o script menos flexivel a menos que seja atualizado. - Potencial para Exclusao Excessiva:
Se uma imagem tiver multiplas tags e uma delas corresponder ao regex, o comando de exclusao agira sobre essa imagem. E necessario cuidado extra ao usar o modo de exclusao em um ambiente de producao. - Sem Mecanismo de Rollback:
Uma vez que uma imagem e excluida (no modo--apply), a recuperacao nao e simples. Os administradores precisam ter medidas de backup ou controle de versao implementadas se a exclusao for acidental. - Log Verboso:
O script imprime mensagens para cada imagem processada, o que pode ser excessivo em ambientes com um grande numero de imagens. Isso poderia ser refinado para uma abordagem de log mais concisa.
Melhores Praticas e Recomendacoes
- Teste em um Ambiente de Staging Primeiro:
Sempre execute o script no modo--dry-runem um ambiente de staging para verificar se ele identifica corretamente as imagens alvo. - Implemente Backups:
Certifique-se de que as imagens tenham backup ou sejam versionadas adequadamente se houver risco de precisar reverter alguma alteracao. - Monitore os Logs:
Se voce pretende executar este script periodicamente (ex.: via cron), considere redirecionar os logs de saida para um arquivo e implementar rotacao de logs. - Atualizacoes Regulares:
Mantenha seu script revisando e testando-o sempre que seu uso do ECR ou estrategia de taggeamento de imagens mudar. - Ajuste Fino do Regex Quando Necessario:
Ajuste o padrao regex se o seu sistema de versionamento evoluir ou se voce introduzir novas convencoes de taggeamento.
O Script
#!/bin/bash
# Este script processa todos os repositorios ECR e suas imagens, verifica tags de imagem
# que correspondem ao padrao "9.x.x" (onde x representa um ou mais digitos) e
# entao lista (dry run) ou exclui (apply) essas imagens.
#
# Uso:
# ./cleanup_ecr.sh --dry-run # Lista imagens que seriam excluidas sem realizar a exclusao.
# ./cleanup_ecr.sh --apply # Exclui imagens com tags que correspondem a "9.x.x".
# ./cleanup_ecr.sh # Exibe esta mensagem de ajuda.
set -euo pipefail
function usage() {
echo “Uso: $0 [–dry-run | –apply]”
echo ""
echo " –dry-run Lista imagens que correspondem ao padrao de tag ‘9.x.x’ sem exclui-las."
echo " –apply Exclui imagens que correspondem ao padrao de tag ‘9.x.x’."
}
Verifica argumentos da linha de comando
if [ “$#” -ne 1 ]; then
usage
exit 1
fi
MODE="$1"
if [[ “$MODE” != “–dry-run” && “$MODE” != “–apply” ]]; then
usage
exit 1
fi
Define padrao regex para tags: “9.” seguido por digito(s), um ponto, depois digito(s)
REGEX="^9.[0-9]+.[0-9]+$"
echo “Modo: $MODE”
echo “Buscando lista de repositorios ECR…”
Recupera todos os nomes de repositorios.
repositories=$(aws ecr describe-repositories –query ‘repositories[].repositoryName’ –output text)
Verifica se algum repositorio foi retornado.
if [ -z “$repositories” ]; then
echo “Nenhum repositorio ECR encontrado.”
exit 0
fi
Processa cada repositorio.
for repo in $repositories; do
echo “——————————”
echo “Processando repositorio: $repo”
# Recupera detalhes da imagem: digest e tags.
images_json=$(aws ecr describe-images \
--repository-name "$repo" \
--query 'imageDetails[*].{Digest: imageDigest, Tags: imageTags}' \
--output json)
# Determina o numero de imagens neste repositorio.
image_count=$(echo "$images_json" | jq 'length')
if [ "$image_count" -eq 0 ]; then
echo " Nenhuma imagem encontrada no repositorio $repo."
continue
fi
# Itera sobre cada imagem.
for (( i=0; i<image_count; i++ )); do
image_digest=$(echo "$images_json" | jq -r ".[$i].Digest")
# Extrai as tags; algumas imagens podem nao ter tags.
tags=$(echo "$images_json" | jq -r ".[$i].Tags[]" 2>/dev/null || true)
if [ -z "$tags" ]; then
continue
fi
# Percorre cada tag.
for tag in $tags; do
if [[ $tag =~ $REGEX ]]; then
echo "Correspondencia encontrada - Repo: '$repo', Digest: '$image_digest', Tag: '$tag'"
if [ "$MODE" == "--apply" ]; then
echo " Excluindo imagem..."
aws ecr batch-delete-image \
--repository-name "$repo" \
--image-ids imageDigest="$image_digest",imageTag="$tag"
fi
else
echo "Pulando - Repo: '$repo', Digest: '$image_digest', Tag: '$tag'"
fi
done
done
done
echo “Processo concluido.”
Conclusao
O script Bash apresentado oferece uma solucao robusta e pratica para automatizar a limpeza de imagens Amazon ECR que correspondem a um padrao de tag especificado. Com sua separacao clara entre modos de simulacao (dry-run) e execucao (apply), juntamente com sua descoberta automatica de repositorios e mecanismos de tratamento de erros, o script e uma ferramenta poderosa para gerenciamento de imagens de container.
No entanto, os administradores tambem devem estar cientes de suas dependencias e adaptar cuidadosamente o filtro regex para se alinhar com seu esquema de versionamento especifico. Seguindo as melhores praticas, como testar em um ambiente de staging e monitorar os logs de exclusao, o script pode simplificar significativamente a manutencao do ECR, reduzir o inchaco de armazenamento e melhorar a eficiencia operacional geral.
Mais de Ercan
Mais dois sites, mesmo autor, terreno diferente.
IA, LLMs, agentes, ML aplicado.
Notas de campo sobre cargas de IA. Análise de custos do Bedrock, padrões de agentes, trade-offs de armazenamento vetorial, modos de falha em produção.
Visitar ercan.ai →O hub. Sobre, consultoria, contato.
Hub pessoal para as duas trilhas de escrita. Quem sou eu, como funciona a consultoria, como me contatar.
Visitar ercanermis.com →