A montagem de buckets S3 diretamente em instâncias do EC2 é segura?

8

como o título da minha pergunta diz, eu gostaria de saber se isso é uma boa prática ou não,

Eu sei que posso montá-lo em uma instância do EC2, mas gostaria de saber se, como adicionarei mais instâncias para dimensionar meu aplicativo, isso pode causar alguns problemas; você tem alguma experiência com isso?

Estou usando o S3 para permitir uploads de arquivos por meio de um script PHP. Portanto, basicamente, a questão é:

É uma boa prática usar mouting ou existem maneiras melhores de lidar com uploads de arquivos de usuários?

Obrigado antecipadamente

    
por Enrico Tuttobene 26.01.2012 / 11:45

3 respostas

14

Se você estiver usando o S3 para armazenar dados de uploads de usuários, especialmente em um ambiente distribuído, uma grande consideração é o fato de que o S3 é 'eventualmente consistente' (embora algumas regiões sejam lidas após gravação consistentes). A conseqüência disso é que você pode fazer upload de um arquivo com sucesso, mas se você verificar sua existência imediatamente depois disso, poderá descobrir que ele não existe. Esse problema é mais pronunciado em cenários como atualizações ou exclusões, em que mesmo a consistência de leitura após gravação não ajudará.

O texto acima será aplicado aos seus envios para o S3, independentemente da abordagem adotada. De fato, isso é verdade para a maioria dos problemas que se espera do S3 - não é tanto a abordagem usada para armazenar os dados, pois são as limitações do S3 que provavelmente serão as mais problemáticas.

S3fs usa a API do S3 - assim como o PHP (ou outro) faz o SDK. Além disso, o S3 foi projetado para lidar com níveis razoavelmente altos de simultaneidade - assim (além dos problemas de consistência) não deve haver um problema em montá-lo em várias instâncias (tendo em mente que não é um sistema de arquivos tradicional - problemas como bloqueio, etc são tratados no lado S3).

Dito isto, existem algumas vantagens e desvantagens potenciais de cada implementação:

S3fs:

  • Não há suporte para downloads parciais / em partes (até onde eu sei) - portanto, você deve fazer o download do arquivo completo para ler qualquer parte dele - provavelmente não será um problema se você usá-lo apenas para armazenar (e veicular) uploads.
  • Escrito em C ++, possíveis ganhos de desempenho
  • Seu aplicativo se beneficia de qualquer atualização do s3fs
  • Implementa o armazenamento em cache (arquivos completos e informações sobre arquivos) - tem o potencial de melhorar um pouco a velocidade e reduzir custos
  • Limitado às funções que fundem expõe

SDK:

  • Expõe o conjunto completo de recursos que o S3 tem a oferecer - dependendo do seu caso de uso, isso pode ser suficiente para merecer o uso do SDK
  • Integração potencialmente mais estreita com seu aplicativo - os erros retornados, etc, podem permitir que seu aplicativo faça escolhas melhor informadas (e, portanto, mais precisas)
  • Quaisquer vantagens possíveis precisam ser codificadas - seu aplicativo precisa aproveitá-las e ser mantido atualizado com futuras alterações no S3
  • Mais complexidade e sobrecarga para seu código

Em termos de "segurança", você pode querer dizer "impedir a corrupção de dados" ou "impedir o acesso não autorizado". Com relação ao primeiro, o SDK pode ajudar um pouco a lidar com a consistência eventual (na forma de erros mais detalhados), mas o armazenamento subjacente é o mesmo e espero que as diferenças sejam menores. Com relação ao controle de acesso - você pode usar o IAM para criar uma conta limitada, mas essa conta ainda precisará de acesso de leitura / gravação aos seus arquivos S3. Ambos devem ser adequadamente seguros, em ambos os casos, seu sistema precisa ser comprometido para obter acesso ao seu bucket do S3 - eu sugeriria, no entanto, que com o S3fs (já que as credenciais são normalmente armazenadas fora do webroot e não são acessíveis por meio de PHP) há um pouco melhor segurança.

Opinião pessoal: Eu preferiria o s3fs para um caso em que há um único diretório de upload (por exemplo, um site fazendo uso dele) e onde o acesso será bastante simples (basta fazer upload de arquivos e ocasionalmente atualizar / excluir) . Se você precisar de acesso mais complexo (por exemplo, downloads parciais, vários intervalos etc.) ou usar o SDK do S3 para outros fins, eu também ficaria com o SDK para os envios.

    
por 26.01.2012 / 22:43
1

Eu preferiria enviar para o S3 via PHP lib. É mais fácil montar o S3 em cada servidor.

Veja este exemplo: link

Para um dos meus projetos, usei este lib: link . Trabalhou muito bem para mim.

    
por 26.01.2012 / 18:30
0

Você pode permitir que os usuários enviem diretamente para o s3 do navegador sem fazer o upload para o seu servidor (e, em seguida, enviá-los para o s3.)

Aqui estão algumas dicas para isso: link

depois que o arquivo é carregado, se você precisar processar o arquivo (zip, transcodificar, etc) você pode usar S3fs

    
por 09.02.2017 / 21:25