Lambda com LocalStack não deu bom, pelo menos por aqui 😅
Na versão community ele não permite criar lambdas a partir de um container.
Seguindo o que já construí até aqui
Agora o repositório possui a seguinte estrutura:
.
├── docker-compose.yaml
├── LICENSE
├── README.md
└── services
├── api
│ ├── aws_utils.py
│ ├── Dockerfile
│ ├── docs
│ │ └── algumas imagens aqui
│ ├── example.env
│ ├── main.py
│ ├── README.md
│ ├── requirements.txt
│ └── settings.py
└── video_processor
├── Dockerfile
├── example.env
├── main.py
└── requirements.txt
Onde foi adicionado a pasta video_processor
Processamento
Aqui está o novo trecho do projeto. Ele consome mensagens da fila SQS, faz o download de vídeos do S3, realiza o processamento com OpenCV para detecção de faixas e envia os resultados processados de volta ao S3.
Sendo assim:
- O serviço entra em loop contínuo (daemon-like).
- A cada 10 segundos, verifica se há novas mensagens na fila
future-processing. - Quando há mensagem:
- Faz download do vídeo do bucket
lane-bucket. - Processa os frames aplicando o algoritmo de detecção de faixas.
- Salva os frames e resultados processados no S3, em uma pasta única para cada vídeo.
- Faz download do vídeo do bucket
Para criar a conexão com LocalStack/AWS foi utilizada a biblioteca boto3
ENDPOINT_URL = os.getenv("AWS_ENDPOINT_URL", None)
REGION_NAME = os.getenv("AWS_REGION", "ue-east-1")
sqs = boto3.client("sqs", endpoint_url=ENDPOINT_URL, region_name=REGION_NAME)
s3 = boto3.client("s3", endpoint_url=ENDPOINT_URL, region_name=REGION_NAME)
Executando
Bom, vamos iniciar os serviços com o Docker Compose
Seguindo o passo anterior, vamos garantir que o container localstack já exista
# Criar a rede
docker network create localstack-net
# Iniciar o container
docker run -d \
--name localstack-main \
--network localstack-net \
-p 127.0.0.1:4566:4566 -p 127.0.0.1:4510-4559:4510-4559 \
-v /var/run/docker.sock:/var/run/docker.sock localstack/localstack \
localstack/localstack
Caso já exista o container, basta iniciá-lo
docker start localstack-main
Agora, vamos garantir que o bucket e a fila existam, pode-se recorrer ao post 3, mas vou deixar os comandos CLI aqui, pois vou utilazos também:
# Bucket S3
awslocal s3 mb s3://lane-bucket
# Fila SQS
awslocal sqs create-queue --queue-name future-processing
Então, dentro da pasta do repositório vamos iniciar o compose
docker compose up --build
E então teremos o output:
✔ api Built 0.0s
✔ processor Built 0.0s
✔ Container processor Recreated 0.1s
✔ Container api-ec2-simulate Recreated 0.1s
Attaching to api-ec2-simulate, processor
api-ec2-simulate | INFO: Started server process [1]
api-ec2-simulate | INFO: Waiting for application startup.
api-ec2-simulate | INFO: Application startup complete.
api-ec2-simulate | INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
Abrindo a url localhost:8080 veremos a mensagem: "status": "healthy"
Sugiro seguir para localhost:8080/docs, vamos usar o Swagger UI
Vamos seguir para o endpoint upload e clicar em Try it out

Selecione o arquivo e clique em execute:

Receberemos abaixo a resposta:
{
"message": "mov_0288_b.mp4 uploaded successfully.",
"s3_url": "http://localstack-main:4566/lane-bucket/mov_0288_b.mp4"
}
Caso queira fazer via curl
curl -X 'POST' \
'http://localhost:8080/upload/' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'file=@mov_0288_b.mp4;type=video/mp4'
Resultados
Podemos acessar o Bucket S3 via LocalStack
E conferir o vídeo original e a pasta resultados, onde foram salvos os resultados dos processamentos

Arquivo final salvo

Detalhe: Só salvou um frame em cada pasta (Bug que deverei corrigir lá no repositório, mas não agora, por enquanto o teste foi muito bom!)
Vamos ver a fila SQS
- Ao recém realizar o upload do vídeo

- Após o processamento

Obs.: Tive de relizar 3x o upload, para conseguir pegar o delay do processamento 😅
Por hoje fico aqui. No próximo post, irei verificar a correção se salvar apenas uma imagem em cada pasta, irei ver sobre a notificação de conclusão e salvar em uma tabela do DynamoDB.