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.