Usando o amazon S3 como armazenamento para anexos em um sistema de webmail

3

Estou procurando usar o S3 como serviço de armazenamento de dados para um sistema de email.
A ideia é permitir que os usuários façam upload de arquivos que servem como anexos a seus e-mails, que estão disponíveis para download no serviço da web por meio de um link para o arquivo hospedado no S3.

Os problemas que estou enfrentando:

  1. À medida que os usuários escolhem seus nomes de arquivos, haverá colisões, portanto, os arquivos no S3 devem ter nomes de arquivos gerados exclusivamente ou armazenados em pastas separadas. Os usuários podem baixar os arquivos com o nome original ainda usando alguma API ou configuração?
    (exemplo: o usuário faz upload do arquivo dog.gif, armazenado no depósito como A3f23_dog.gif, o link de download retorna o arquivo como dog.gif, possivelmente usando cabeçalhos HTTP)

  2. O número de arquivos / pastas contidos em um único bloco (na raiz) tem algum impacto no desempenho? Ou eu preciso fazer alguma distribuição de arquivos para pastas, etc.

  3. Posso disponibilizar os arquivos publicamente usando URLs e, ao mesmo tempo, NÃO permitir a enumeração de arquivos no intervalo? (ou seja, listagem de arquivos)

Muito obrigado, espero que isso faça sentido.

    
por Amit Ben Shahar 01.12.2011 / 23:56

1 resposta

1

Eu criei recentemente um sistema semelhante para armazenar relatórios - eis o que encontramos para funcionar bem:

  1. 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> .
  2. 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.)

    
por 02.12.2011 / 00:19