Aqui criamos um bucket S3 e uma lambda acionada por um trigger do bucket. Toda vez que um arquivo com característica específicas for criado ele acionará uma lambda que realizará a conversão do arquivo html para arquivo pdf. O novo arquivo será colocado no bucket com o prefixo pdf/.
Para esse projeto vamos precisar:
- docker e docker-compose;
- terraform 1.6+
- python 3.11+
- aws-cli-v2
git clone https://github.com/tadelle/convert_html_to_pdf.git
cd convert_html_to_pdf
cd src
python -m venv venv
Linux
source venv/bin/activate
Windows - Powershell
& .\venv\Scripts\activate
pip install -r requirements.txt
pip install terraform-local
cd ../localstack/
docker compose up -d
cd ../infra
tflocal init
Para preparar o pacote devemos montar todas as dependências da nossa lambda. Podemos fazer isso usando o comando abaixo, estando na pasta /src/.
pip3 install -r requirements.txt -t package --upgrade
As dependências serão montadas na pasta package. Devemos compactar todo o conteúdo dessa pasta incluindo o nosso código fonte usando o formato zip.
Podemos usar qualquer método para produzir o arquivo zip, mas o importante é que o arquivo main.py, assim como a pasta service estejam na raiz. As pastas da biblioteca ficam no mesmo nível que o arquivo main. Como mostrado na imagem abaixo.
Para facilitar montei os arquivos de script publicar.sh e publicar.ps1 que fazem tudo que foi informado acima e ainda faz a publicação e apaga a pasta com as dependências, pois não precisaremos mais dela.
No caso do Windows é um pouco mais complicado, pois como a aplicação é executada em uma imagem Linux, precisamos instalar algumas bibliotecas da plataforma Linux. Você pode ver isso no arquivo publicar.ps1 na segunda e terceira linha.
Linux (é necessário ter o zip instalado)
cd ../src
./publicar.sh
Windows - Powershell
cd ..\src
.\publicar.ps1
aws s3 ls --endpoint-url=http://localhost:4566
Resultado esperado:
2024-01-31 21:59:52 my-bucket-test
aws lambda list-functions --endpoint-url=http://localhost:4566
Será exibida a lambda e suas propriedades. Para sair pressione q.
{
"Functions": [
{
"FunctionName": "lambda_convert",
"FunctionArn": "arn:aws:lambda:sa-east-1:000000000000:function:lambda_convert",
"Runtime": "python3.11",
...
"SnapStart": {
"ApplyOn": "None",
"OptimizationStatus": "Off"
}
}
]
}
Verifique que até o momento o bucket está vazio
aws s3 ls my-bucket-test --endpoint-url=http://localhost:4566
aws s3 cp exemplo.html s3://my-bucket-test/html/ --endpoint-url=http://localhost:4566
Se tudo deu certo você verá dois prefixos (como se fossem pastas): html e pdf.
aws s3 ls my-bucket-test --endpoint-url=http://localhost:4566
PRE html/
PRE pdf/
aws s3 cp s3://my-bucket-test/pdf/exemplo.pdf exemplo.pdf --endpoint-url=http://localhost:4566