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:

  1. Listar Todos os Repositorios ECR:
    Consulta a AWS ECR por todos os repositorios disponiveis na sua conta.
  2. Obter Imagens e Tags:
    Para cada repositorio, lista os detalhes das imagens (incluindo digests e tags).
  3. 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").
  4. 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.
  5. 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 com 9. 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 usa set -euo pipefail do 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 (usando set -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 o jq estejam 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

  1. Teste em um Ambiente de Staging Primeiro:
    Sempre execute o script no modo --dry-run em um ambiente de staging para verificar se ele identifica corretamente as imagens alvo.
  2. Implemente Backups:
    Certifique-se de que as imagens tenham backup ou sejam versionadas adequadamente se houver risco de precisar reverter alguma alteracao.
  3. 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.
  4. Atualizacoes Regulares:
    Mantenha seu script revisando e testando-o sempre que seu uso do ECR ou estrategia de taggeamento de imagens mudar.
  5. 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.