Meu problema
Tenho um bucket S3 público que serve como solução de armazenamento para arquivos grandes (GBs) que envio para colegas e clientes. Os arquivos são excluídos automaticamente após algumas semanas.
O problema com essa configuração é que posso sofrer cobranças significativas se alguém iniciar um DDOS e fizer download em massa de um dos meus links. Posso acabar pagando enormes taxas de rede de saída e quero evitá-lo.
Uma solução pode ser acionar uma função do Lambda sempre que alguém baixar um objeto e incrementar um contador do DynamoDB para o objeto. Se o contador ultrapassar um limite razoável (digamos, 50 downloads), a função Lambda tornará o arquivo privado para evitar taxas adicionais.
Minha pergunta
Como posso configurar uma função do Lambda para ser acionada quando alguém solicita um arquivo de um bucket específico do S3?
Em vez de torná-los públicos para qualquer um baixar, eu os tornaria privados e distribuiria apenas URLs pré-assinados para seus colegas e clientes.
Você pode criar um portal simples onde seus clientes fazem login e obtêm um link pré-assinado para o objeto S3 que expira, por exemplo, em uma hora. Se eles precisarem baixá-lo novamente, poderão obter um novo link a qualquer momento. Isso lhe dará total controle e auditabilidade de quem pode baixar seus objetos do S3 sem arriscar taxas de saída maciças.
Confira: https://aws.nz/best-practice/s3-presigned-url/
Espero que ajude :)
Como o @MLu mencionou, você pode usar URLs pré-assinados. Você também pode fazer algo assim: