Aws S3  - Otimizando todas as png de um bucket
Tags: aws, s3, otimizar, png
Published: 2021-02-03 17:31:10

# Introdução

Após seguir os passos descritos em: [Otimizando Imagens PNG](https://dev.to/nobeltdev/otimizando-imagens-png-56la). Utilizado na otimização de imagens para a aplicação do [7Belts](https://7belts.com/?utm_source=nobeltdev).

Utilizei o CLI da AWS para poder sincronizar as imagens otimizadas e atualiza-las no bucket do S3.

Para facilitar o entendimento vamos utilizar esses dados como exemplo:

```
  Perfil: nobeltdev
  Key: SNW3KSNUNS203JSIEK30
  Secret: n+Skg/12hd0912h0hd0921hd09h10dh1dn
  BucketName: nobelt.dev.bucket
  BucketFolder: static # Pasta static onde ficam as imagens estáticas da aplicação.
  Region: us-west-2
```

### Instalar o CLI da AWS:
Vai ser necessário instalar o CLI da aws para poder realizar os passos que fiz para sincronizar as imagens.

No meu caso fiz a instalação para a versão do Ubuntu Linux:
[AWS CLI](https://aws.amazon.com/cli/)

### Configurar o perfil de acesso:
É necessário criar um perfil para o cli poder utilizar as credenciais.
```bash
#~/.aws/config
[nobeltdev]
region=us-west-2
output=json
```
```bash
#~/.aws/credentials
[nobeltdev]
aws_access_key_id=SNW3KSNUNS203JSIEK30
aws_secret_access_key=n+Skg/12hd0912h0hd0921hd09h10dh1dn
```

## Selecionando um arquivo ou pasta do Bucket
O comando do aws cli utilizado para copiar um arquivo, de qualquer origem e destino, podendo ser:
* Origem de um bucket para outro bucket;
* De um bucket para outro bucket;
* De bucket para um destino local.

_[Documentação com maiores detalhamentos do comando cp](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-copy)_

```bash
$ aws s3 cp <source> <target> [--options]
```

Exemplo:
```bash
$ aws s3 cp s3://nobelt.dev.bucket/folder /local/anypath/static/ --recursive --profile nobelt
```

### Otimização dos arquivos PNG

Para otimizar as imagens utilizei 2 cli:
* optipng: Otimiza um png sem perder nenhuma informação;
* pngnq - Quantiza imagens em PNG em formato 8 bit RGBA.


### Script de otimização

Criei o script optimize-png.sh que recebe como parâmetro um pasta que possuí imagens *png* e vai otimiza-los reduzindo seus tamanhos sem quase nenhum efeito.
_O script também irá varrer todos os arquivos *png* das subpastas._

```bash
# optimize-png.sh
#!/bin/bash
if [ -z $1 ] ; then
  echo "Error: Necessario informar um path contendo imagens png!" && exit 1;
fi
pngnq $(find $1 -type f -name '*.png') -e -temp.png  # Realiza a quantização
rm $(find $1 -type f -name '*.png' | grep -v "\-temp.png") # Remove os antigos arquivos
find $1 -type f -name '*.png' | grep "\-temp.png" | awk -F '-temp.png' '{print "mv "$1"-temp.png "$1".png"}' > temp-script.sh # Cria um script temporário que removerá os sufixo "-temp"
sh temp-script.sh # Executa o script temporário
rm temp-script.sh # Remove o script temporário
optipng $(find $1 -type f -name '*.png') # Otimiza o resultado
```

### Exemplo de resultado

Exemplo real da aplicação do script. Utilizo ele na pasta *static* que guardam as imagens utilizadas numa aplicação web:

![Resultado da aplicação do script](https://dev-to-uploads.s3.amazonaws.com/i/ddz7f1amo7c2t078gvjq.png)

O resultado foi a redução de 2.7Mb -> 1.2Mb, redução de 44% do tamanho total.

### Sincronização para o S3

E para finalmente atualizar os arquivos no S3 basta utilizar o comando do Aws cli:

```bash
$ aws s3 sync <source> <target> [--options]
```

```bash
$ aws s3 sync ./static s3://nobelt.dev.bucket/static/ --profile nobeltdev
```