# S3: Upload multipart do S3 incompleto

> Esta regra identifica uploads multipart incompletos em buckets Amazon S3 que:
>
> * Foram iniciados há mais de 1 dia.
> * Permanecem abertos sem conclusão.
> * Possuem partes já enviadas que continuam ocupando armazenamento.
>
> O objetivo é detectar consumo de storage gerado por uploads abandonados que continuam gerando custo recorrente.

***

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

O recurso de Multipart Upload do S3 permite que arquivos grandes sejam enviados em partes.

Quando um upload não é finalizado:

* As partes já enviadas permanecem armazenadas.
* O bucket continua sendo cobrado pelo armazenamento dessas partes.
* Não existe objeto final utilizável.
* Não há valor de negócio associado ao custo gerado.

Cenários comuns:

* Interrupções de rede.
* Falhas de aplicação.
* Cancelamento de processos de upload.
* Deploys mal sucedidos.

Impactos financeiros:

* Crescimento silencioso do custo de armazenamento.
* Aumento desnecessário do volume total armazenado.
* Complexidade de governança de dados.

Sem política de lifecycle adequada, esses uploads podem permanecer indefinidamente.

***

**Detalhamento técnico da regra**

A regra executa análise global da conta AWS (S3 é serviço global).

***

**Como a regra é executada**

1. Autentica na conta AWS.
2. Lista todos os buckets via `list_buckets`.
3. Aplica filtros de tag (inclusão/exclusão), se configurados.
4. Para cada bucket:
   * Executa `list_multipart_uploads`.
   * Identifica uploads iniciados há mais de 1 dia.
   * Para cada upload elegível:
     * Executa `list_parts`.
     * Soma o tamanho de cada parte enviada.
5. Consolida:
   * Quantidade total de uploads incompletos.
   * Volume total ocupado (KB, MB, GB, TB).
6. Caso exista volume armazenado, o bucket é sinalizado.

Limite técnico:

* Máximo de 25.000 uploads analisados por bucket.
* Processamento paralelo com até 10 threads.

***

**Lógica aplicada**

Um bucket será sinalizado quando:

* Existirem uploads multipart.
* O campo `Initiated` for superior a 1 dia.
* Existirem partes armazenadas (`Parts`).
* O somatório do tamanho das partes for maior que zero.

***

**Campos analisados**

Bucket:

* `Name`
* `CreationDate`
* `TagSet`

Multipart Upload:

* `Key`
* `UploadId`
* `Initiated`

Partes do upload:

* `Size`

***

**Parâmetros considerados na busca**

APIs utilizadas:

* `s3:ListBuckets`
* `s3:ListMultipartUploads`
* `s3:ListParts`
* `s3:GetBucketTagging`

Condições técnicas:

* Upload iniciado há mais de 1 dia.
* Existência de partes armazenadas.
* Volume acumulado maior que zero.

***

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

Período Avaliado (Filtro Temporal): A regra avalia o campo `Initiated` dos uploads multipart. São considerados uploads iniciados há mais de 15 dia em relação ao momento da execução.

Exemplo: Se um upload foi iniciado ontem e não foi finalizado, ele será analisado na próxima execução caso ultrapasse o limite mínimo de 15 dia.

O intervalo é fixo em 15 dia nesta implementação.

***

**Intervalo de Análise**

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

***

**Cálculo de Savings**

O savings é baseado na eliminação do armazenamento das partes associadas a uploads incompletos.

***

**Fórmula Conceitual**

```
Savings Mensal = Volume Total (GB) × Preço do S3 por GB na Região
```

Onde:

* Volume Total = soma de todas as partes armazenadas.
* Preço por GB = valor do S3 Standard (ou classe correspondente).

***

**Campo de custo utilizado**

No Billing AWS:

* Service: AmazonS3
* Usage Type:
  * TimedStorage-ByteHrs
  * StorageClass (Standard, IA, etc.)
* Line Item Type: Usage
* Campo financeiro considerado:
  * Unblended Cost
  * Ou Amortized Cost

***

**Elementos considerados**

* Volume total em GB.
* Classe de armazenamento do bucket.
* Região do bucket.
* Não há projeção futura automática; trata-se de economia recorrente após abortar os uploads.

***

**Exemplo aplicado ao Billing**

Cenário:

Bucket com:

* 120 uploads incompletos.
* Volume total acumulado: 500 GB.
* Preço médio S3 Standard: $0.023 por GB.

Cálculo:

```
Savings = 500 × 0.023
Savings = $11,50/mês
```

Savings anual:

```
11,50 × 12 = $138
```

***

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

* Configurar regra de Lifecycle para abortar multipart uploads automaticamente.
* Monitorar buckets com alta taxa de ingestão.
* Investigar aplicações que estejam interrompendo uploads.
* Priorizar buckets com grande volume acumulado.
* Implementar controle de falhas em pipelines de ingestão.

Possíveis falsos positivos:

* Uploads legítimos em processamento muito longo.
* Transferências de arquivos extremamente grandes ainda em andamento.

Recomenda-se validar se o upload está realmente abandonado antes de abortá-lo.
