# ECR: ECR sem utilização

> Esta regra identifica repositórios do Amazon Elastic Container Registry (ECR) que:
>
> * Foram criados há um período superior ao intervalo definido na regra.
> * Não registraram nenhuma atividade de pull (download de imagem) no período analisado.
>
> O objetivo é detectar repositórios potencialmente obsoletos ou abandonados que continuam gerando custo de armazenamento.

***

**Contexto da regra e impacto no negócio**

O Amazon ECR é amplamente utilizado para armazenar imagens Docker utilizadas por:

* Amazon EKS
* Amazon ECS
* AWS Lambda (imagens containerizadas)
* Pipelines CI/CD

Com o tempo, ambientes acumulam repositórios criados para:

* POCs.
* Testes temporários.
* Versões antigas de aplicações.
* Projetos descontinuados.

Mesmo sem uso, repositórios ECR geram custo contínuo baseado em armazenamento (GB/mês).

**Impactos principais:**

* Crescimento silencioso de custo de storage.
* Aumento da superfície de exposição de imagens antigas.
* Complexidade operacional desnecessária.
* Risco de manter imagens com vulnerabilidades conhecidas.

Se não tratados, esses repositórios permanecem indefinidamente consumindo orçamento.

***

**Detalhamento técnico da regra**

A regra executa análise regional cruzando dados do ECR e CloudWatch.

**Como a regra é executada**

1. A regra autentica na conta AWS.
2. Percorre todas as regiões ativas.
3. Lista todos os repositórios ECR via `ecr:DescribeRepositories`.
4. Aplica filtro temporal baseado na data de criação (`createdAt`).
5. Consulta métricas no CloudWatch para cada repositório.
6. Avalia se houve atividade de pull no período analisado.
7. Caso não haja pulls registrados, o repositório é sinalizado.

***

**Lógica aplicada**

Um repositório será considerado não utilizado quando:

* Atender ao critério temporal configurado.
* A soma da métrica `RepositoryPullCount` no período analisado for igual a zero.
* Ou não houver datapoints retornados pelo CloudWatch.

***

**Campos analisados**

* `repositoryName`
* `repositoryArn`
* `repositoryUri`
* `createdAt`
* `tags`
* Métrica CloudWatch:
  * Namespace: `AWS/ECR`
  * MetricName: `RepositoryPullCount`
  * Statistic: `Sum`

***

**Parâmetros considerados na busca**

APIs utilizadas:

* `ecr:DescribeRepositories`
* `cloudwatch:GetMetricStatistics`

Métrica analisada:

```
RepositoryPullCount
```

Agregação:

* Período: 86400 segundos (1 dia)
* Estatística: Sum

Condição de disparo:

```
Total Pulls == 0
```

***

**Período Avaliado (Filtro Temporal)**

Período Avaliado (Filtro Temporal): A regra avalia a data de criação do repositório (`createdAt`). O intervalo de análise corresponde ao operador do período do filtro (ex: "maior que") combinado com os dias do período do filtro definidos na configuração da regra. Exemplo: Padrão é configurado para "Maior que 60 dias", a regra analisará apenas repositórios criados há mais de 60 dias e verificará se não houve pulls nesse período.

> Esse parâmetro pode ser customizado conforme a necessidade do cliente, permitindo ajustar a sensibilidade da detecção de repositórios ociosos.

Além disso, o mesmo número de dias é utilizado para definir o período de consulta da métrica de pull no CloudWatch.

***

**Intervalo de Análise**

Execução padrão: a cada 8 horas.

***

**Cálculo de Savings**

O savings é baseado na remoção do custo recorrente de armazenamento das imagens contidas no repositório.

***

**Fórmula Conceitual**

```
Savings Mensal = Tamanho Total das Imagens (GB) × Preço por GB da Região
```

Onde:

* O armazenamento é cumulativo.
* O custo é cobrado por GB/mês.
* A economia é recorrente após exclusão do repositório ou aplicação de lifecycle policy.

***

**Campo de custo utilizado**

No Billing AWS:

* Service: AmazonECR
* Usage Type:
  * ECR-Storage-ByteHrs
* Line Item Type: Usage
* Campo financeiro considerado:
  * Unblended Cost
  * Ou Amortized Cost, conforme modelo adotado.

***

**Elementos considerados**

* Tamanho total das imagens armazenadas.
* Região.
* Preço vigente por GB/mês.
* Não há projeção futura automática, o cálculo representa economia recorrente mensal após remoção.

***

**Exemplo aplicado ao Billing**

Cenário:

Repositório com:

* 200 GB armazenados.
* Preço médio: $0.10 por GB/mês.

Cálculo:

```
Savings = 200 × 0.10
Savings = $20/mês
```

Savings anual:

```
20 × 12 = $240/ano
```

Se houver 10 repositórios similares:

```
$200/mês
```

***

**Dicas de uso e boas práticas para o usuário**

* Verificar se o repositório é referenciado por:
  * EKS
  * ECS
  * Pipelines CI/CD
* Implementar lifecycle policies para:
  * Manter apenas últimas versões.
  * Remover imagens antigas automaticamente.
* Utilizar tags padronizadas:
  * Environment
  * Owner
  * Application
* Priorizar remoção de repositórios grandes.
* Validar dependências antes da exclusão.
* Considerar retenção diferenciada para ambientes regulados.

Possíveis falsos positivos:

* Repositórios utilizados apenas para disaster recovery.
* Imagens raramente utilizadas, mas críticas.

Recomenda-se validação técnica antes da exclusão definitiva.
