# RDS: RDS sem conexões

> Esta regra identifica instâncias de banco de dados (RDS, DocumentDB e Neptune) que **não apresentaram conexões ou requisições durante o período analisado**.
>
> O objetivo é detectar bancos potencialmente ociosos que continuam gerando custo.

***

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

Instâncias de banco de dados representam um dos maiores componentes de custo em ambientes cloud.

Quando permanecem:

* Sem conexões ativas
* Sem requisições
* Disponíveis (`available`)
* Fora de uso real

Elas passam a representar desperdício financeiro direto.

Impactos:

* Custo recorrente desnecessário
* Recursos esquecidos após projetos
* Ambientes de teste abandonados
* Shadow IT

Essa regra atua diretamente na eliminação de infraestrutura ociosa.

***

**Detalhamento técnico da regra**

A regra realiza varredura regional nas instâncias RDS e valida ausência total de atividade no período configurado.

***

**Como a regra é executada**

1. Autentica na conta AWS por região.
2. Executa:

   ```
   rds:DescribeDBInstances
   ```
3. Aplica filtros de tag (inclusão/exclusão).
4. Para cada instância:
   * Aplica filtro temporal de criação.
   * Verifica se `DBInstanceStatus = available`.
   * Consulta métricas no CloudWatch dentro do período configurado:
     * Namespace `AWS/RDS`
       * `DatabaseConnections`
     * Namespace `AWS/DocDB`
       * `DatabaseConnections`
     * Namespace `AWS/Neptune`
       * `TotalRequestsPerSec`
   * Estatística utilizada: `Sum`
   * Granularidade: 86400 segundos (diário)
5. Se todos os datapoints retornarem valor 0 → instância é sinalizada.

***

**Lógica aplicada**

Uma instância será sinalizada quando:

```
Status = available
E
Atende filtro temporal
E
Soma de todas as métricas de conexão no período = 0
```

Validação aplicada:

```
all(dp["Sum"] == 0 for dp in points)
```

***

**Campos analisados**

RDS Instance:

* `DBInstanceIdentifier`
* `Engine`
* `DBInstanceClass`
* `StorageType`
* `DBInstanceStatus`
* `InstanceCreateTime`
* `DBInstanceArn`
* `TagList`
* Região

CloudWatch:

* `DatabaseConnections` (RDS)
* `DatabaseConnections` (DocDB)
* `TotalRequestsPerSec` (Neptune)

***

**Parâmetros considerados na busca**

APIs utilizadas:

* `rds:DescribeDBInstances`
* `cloudwatch:GetMetricStatistics`

Configuração:

* Período analisado: `self.checker.period.days`
* Estatística: Sum
* Granularidade: 1 dia

***

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

Período Avaliado: 15 dias

A regra considera:

```
InstanceCreateTime
```

E analisa métricas dentro do intervalo:

```
Data atual – checker.period.days
```

Exemplo:

Padrão é configurado para 15 dias, avalia se houve conexões nos últimos 15 dias.

> Esse parâmetro de avaliação pode ser ajustado nas configurações das regras.

***

**Intervalo de Análise**

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

***

**Cálculo de Savings**

A economia potencial corresponde à remoção completa da instância ociosa.

***

**Fórmula Oficial de Savings**

```
Savings = sum("lineitem/unblendedcost")
```

Pois o recurso não está sendo utilizado.

***

**Campo de custo utilizado**

No Billing AWS:

* Service: AmazonRDS
* Line Item Type: Usage
* Usage Types:
  * InstanceUsage
* Campo financeiro considerado:
  * `lineitem/unblendedcost`

***

**Exemplo aplicado ao Billing**

Cenário:

* Instância RDS db.m5.large
* Custo mensal: $1.200
* Conexões no período: 0

Cálculo:

```
Savings = $1.200/mês
```

Savings anual:

```
1.200 × 12 = $14.400
```

***

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

* Validar com o time de aplicação antes de remover.
* Verificar se é ambiente de contingência.
* Avaliar snapshot antes de exclusão.
* Revisar projetos encerrados.
* Automatizar limpeza de ambientes temporários.

Possíveis exceções:

* Banco reservado para DR.
* Instância aguardando ativação.
* Ambiente sazonal.

Recomenda-se snapshot prévio antes da remoção definitiva.
