Eu criei recentemente um sistema semelhante para armazenar relatórios - eis o que encontramos para funcionar bem:
- Use '/' nas suas chaves para criar uma hierarquia estruturada. No seu caso, eu faria algo como:
<user-id>/<year>/<month>/<day>/<message-id>/<user-defined-filename>
. - Use um URL pré-assinado para fornecer acesso ao arquivo somente no S3 para usuários que têm acesso ao e-mail entregue.
O ponto principal de (1) é garantir que você não tenha conflitos entre usuários - você pode reestruturar a hierarquia da maneira que quiser, mas o ponto-chave é ter identificadores exclusivos como parte da estrutura de chave (em neste caso, user-id e message-id), mantendo o nome do arquivo original como a última parte da estrutura; essa última parte da estrutura é o que a maioria dos navegadores usam como o nome do arquivo baixado.
Note que eu incluí a data como parte da estrutura - se você vai ter muitos objetos, você vai querer separá-los em "pastas" virtuais no espaço chave do S3 para que você não use t tem que esperar para sempre toda vez que precisar procurar arquivos manualmente.
O ponto (2) fornece acesso aos arquivos apenas aos destinatários da mensagem. Apenas o proprietário do intervalo (você) poderá listar os arquivos (a menos que conceda permissões diferentes explicitamente), mas qualquer pessoa com o link para um arquivo poderá acessá-lo.
Se você quiser adicionar mais controle sobre os links, criar links que direcionem um usuário por meio do seu aplicativo, se o aplicativo decidir que o usuário está realmente autorizado, crie um URL pré-assinado e entregue-o ao usuário. (Dessa forma, você pode distribuir URLs pré-assinadas com limite de tempo, para que você não dê acesso completo e permanente por meio de um link.)