web-dev-qa-db-fra.com

Comment monter un compartiment S3 sur une instance EC2 et y écrire avec PHP?

Je travaille sur un projet hébergé sur Amazon Web Services. La configuration du serveur comprend deux instances EC2, un Elastic Load Balancer et un magasin Elastic Block Store supplémentaire sur lequel réside l'application Web. Le projet est supposé utiliser S3 pour le stockage des fichiers téléchargés par les utilisateurs. Pour les besoins de cette question, je vais appeler le compartiment S3 static.example.com

J'ai essayé d'utiliser s3fs ( https://code.google.com/p/s3fs/wiki/FuseOverAmazon ), RioFS ( https://github.com/skoobe/ riofs ) et s3ql _ ( https://code.google.com/p/s3ql/ ). s3fs montera le système de fichiers mais ne me laissera pas écrire dans le compartiment (j'ai posé la question suivante sous SO: Comment monter un volume S3 avec les autorisations appropriées à l'aide de Fuse). RioFS montera le système de fichiers et me laissera écrire dans le seau à partir du shell, mais les fichiers enregistrés avec PHP n'apparaissent pas dans le seau (j'ai ouvert un problème avec le projet sur GitHub). s3ql montera le compartiment, mais aucun des fichiers déjà présents dans le compartiment n’apparaîtra dans le système de fichiers.

Ce sont les commandes de montage que j'ai utilisées:

s3fs static.example.com -ouse_cache=/tmp,allow_other /mnt/static.example.com
riofs -o allow_other http://s3.amazonaws.com static.example.com /mnt/static.example.com
s3ql mount.s3ql s3://static.example.com /mnt/static.example.com

J'ai également essayé d'utiliser cette classe S3: https://github.com/tpyo/Amazon-s3-php-class/ et ce package S3 spécifique à FuelPHP: https: // github.com/tomschlick/fuel-s . J'ai pu obtenir que le paquet FuelPHP dresse la liste des compartiments et des fichiers disponibles, mais l'enregistrement des fichiers dans le compartiment a échoué (mais ne s'est pas trompé).

Avez-vous déjà monté un bucket S3 sur un système de fichiers linux local et utilisé PHP pour écrire un fichier dans le bucket avec succès? Quel (s) outil (s) avez-vous utilisé? Si vous avez utilisé l'un des logiciels mentionnés ci-dessus outils, quelle version avez-vous utilisé?

[~ # ~] modifier [~ # ~] J'ai été informé que le problème que j'avais ouvert avec RioFS sur GitHub avait été résolu. . Bien que j'ai décidé d'utiliser S3 REST) plutôt que d'essayer de monter un compartiment comme volume, il semble que RioFS soit une option viable. ces jours-ci.

54
Ben Harold

Avez-vous déjà monté un compartiment S3 sur un système de fichiers linux local?

Non, c'est amusant pour les tests, mais je ne le laisserais pas m'approcher d'un système de production. Il est préférable d'utiliser une bibliothèque pour communiquer avec S3. Voici pourquoi:

  1. Cela ne cache pas les erreurs. Un système de fichiers n'a que quelques codes d'erreur qu'il peut vous envoyer pour indiquer un problème. Une bibliothèque S3 vous donnera le message d'erreur exact d'Amazon afin que vous compreniez ce qui se passe, le journalisiez, gérez les cas, etc.
  2. Une bibliothèque utilisera moins de mémoire. Les couches de systèmes de fichiers vont mettre en mémoire cache beaucoup de choses que vous n'utiliserez plus jamais. Une bibliothèque vous donne le contrôle pour décider du contenu à mettre en cache et de ne pas le mettre en cache.
  3. Expansion. Si vous avez besoin de faire quelque chose d'extraordinaire (définir une ACL sur un fichier, générer un lien signé, la gestion des versions, le cycle de vie, la durabilité, etc.), vous devrez vider l'abstraction de votre système de fichiers et utiliser une bibliothèque quand même.
  4. Chronométrage et tentatives. Certaines fractions de requêtes se tromperont au hasard et pourront être retentées. Parfois, vous voudrez peut-être réessayer beaucoup, parfois vous préférerez vous tromper rapidement. Un système de fichiers ne vous donne pas un contrôle granulaire, mais une bibliothèque le fera.

La ligne du bas est que S3 sous Fuse est un abstraction qui fuit . S3 n'a pas (ou besoin) de répertoires. Les systèmes de fichiers n'étaient pas conçus pour des milliards de fichiers. Leurs modèles d'autorisations sont incompatibles. Vous perdez beaucoup de puissance de S3 en essayant de l'intégrer dans un système de fichiers.

Deux bibliothèques aléatoires PHP pour parler à S3:

https://github.com/KnpLabs/Gaufrette

https://aws.Amazon.com/sdkforphp/ - Celui-ci est utile si vous allez au-delà de l'utilisation de S3 ou si vous devez effectuer l'une des demandes fantaisies mentionnées ci-dessus.

51
BraveNewCurrency

Très souvent, il est avantageux d'écrire des fichiers sur le volume EBS, puis de forcer les demandes publiques ultérieures pour le ou les fichiers à acheminer via CloudFront CDN.

De cette façon, si l'application doit effectuer des transformations sur le fichier, il est beaucoup plus facile de le faire sur le lecteur et le système locaux, puis forcez les demandes pour les fichiers transformés à extraire de l'Origin via CloudFront.

par exemple. si votre utilisateur télécharge une image pour un avatar et que celle-ci nécessite plusieurs itérations de taille et de rognage, votre application peut les créer sur le volume local, mais toutes les demandes publiques du fichier se feront par le biais d'une demande Cloudfront Origin-pull. . De cette manière, vous disposez d'une flexibilité maximale pour conserver le fichier d'origine (ou une version optimisée du fichier). Toute requête utilisateur ultérieure peut extraire une version existante du cloud front Edge ou le cloud cloud renverra la requête vers l'application. et créer toutes les itérations nécessaires.

Un exemple élémentaire de ce qui précède serait WordPress, qui crée plusieurs versions dimensionnées/recadrées de n’importe quelle image graphique téléchargée, en plus de conserver l’original (sous réserve des restrictions de taille de fichier et/ou des transformations de plug-in). Compatible CDN WordPress tels que W3 Total Cache pour réécrire les demandes à extraire via CDN, il suffit donc à l’application de créer des itérations uniques à la première demande. Ajouter la mise en cache de la version des URL ( http: //domain.tld/file.php? x123 ) affine et exploite les fonctionnalités CDN.

Si vous êtes préoccupé par l'expansion rapide de la taille de fichier de volume EBS ou d'inodes, vous pouvez automatiser un processus d'élagage pour les fichiers rarement demandés ou les fichiers obsolètes.

2
PlayGod