Comment puis-je 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 se compose de deux instances EC2, D'un équilibreur de charge Elastic et d'un magasin de blocs Elastic supplémentaire sur lequel réside l'application web. Le projet est supposé utiliser S3 pour le stockage des fichiers que les utilisateurs téléchargent. Pour cette question, je vais appeler le seau 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é cette question sur SO: Comment puis-je monter un volume S3 avec les autorisations appropriées en utilisant FUSE). {[3] } montera le système de fichiers et me laissera écrire dans le compartiment à partir du shell, mais les fichiers enregistrés en utilisant PHP n'apparaissent pas dans le compartiment (j'ai ouvert un problème avec le projet sur GitHub). s3ql va monter le seau, mais aucun des fichiers qui sont déjà dans le seau apparaissent 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 aussi essayé d'utiliser cette classe S3: https://github.com/tpyo/amazon-s3-php-class/ et ce paquet S3 spécifique à FuelPHP: https://github.com/tomschlick/fuel-s3 . j'ai pu obtenir le paquet FuelPHP pour lister les compartiments et les fichiers disponibles, mais l'enregistrement des fichiers dans le compartiment a échoué (mais n'a pas d'erreur).

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

Modifier J'ai été informé que le problème que j'ai ouvert avec RioFS sur GitHub a été résolu. Bien que j'ai décidé d'utiliser l'API REST S3 plutôt que d'essayer de monter un compartiment en tant que volume, il semble que RioFS puisse être une option viable ces jours-ci.

53
demandé sur Ben Harold 2013-05-08 01:07:00

2 réponses

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 près d'un système de production. Il est préférable d'utiliser une bibliothèque pour communiquer avec S3. Voici pourquoi:

  1. Il ne cachera pas les erreurs. Un système de fichiers n'a que quelques codes d'erreurs 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, enregistrez-le, gérez les cas d'angle, etc.
  2. une bibliothèque utilisera moins de mémoire. Les couches de systèmes de fichiers mettront en cache beaucoup de choses aléatoires que vous n'utilisez plus jamais. Une bibliothèque vous donne le contrôle pour décider de la cache et de ne pas mettre en cache.
  3. Expansion. Si vous avez besoin de faire quelque chose de fantaisie (définir une ACL sur un fichier, générer un lien signé, versioning, cycle de vie, changer la durabilité, etc.), alors vous devrez vider votre abstraction de système de fichiers et utiliser une bibliothèque de toute façon.
  4. Timing et nouvelles tentatives. Une fraction de demandes au hasard erreur et peut être retentée. Parfois, vous voudrez peut-être réessayer beaucoup, parfois vous préférez erreur rapidement. Un système de fichiers ne vous donne pas de contrôle granulaire, mais une bibliothèque le fera.

L'essentiel est que S3 sous FUSE est une abstraction qui fuit . S3 n'a pas (ou besoin) de répertoires. Les systèmes de fichiers n'ont pas été construits pour des milliards de fichiers. Leurs modèles d'autorisations sont incompatibles. Vous gaspillez beaucoup de la puissance de S3 en essayant de le chausser dans un système de fichiers.

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

Https://github.com/KnpLabs/Gaufrette

Https://aws.amazon.com/sdkforphp/ - celui-ci est utile si vous développez au-delà de L'utilisation de S3, ou si vous avez besoin de faire l'une des demandes de fantaisie mentionnées ci-dessus.

49
répondu BraveNewCurrency 2013-05-10 03:58:24

Très souvent, il est avantageux d'écrire des fichiers dans le volume EBS, puis de forcer les requêtes publiques ultérieures pour le(s) fichier (s) à acheminer via CloudFront CDN.

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

Par exemple, si votre utilisateur télécharge une image pour un avatar, et que l'image de l'avatar a besoin de plusieurs itérations pour la taille & recadrer, votre application peut les créer sur le volume local, mais toutes les demandes publiques pour le fichier auront lieu via une demande d'extraction d'origine cloudfront. De cette façon, vous disposez d'une flexibilité maximale pour conserver le fichier d'origine (ou une version optimisée du fichier), et toute demande d'utilisateur ultérieure peut soit extraire une version existante de cloud front edge, soit cloud front redirigera la demande vers l'application et créera les itérations nécessaires.

Un exemple élémentaire de ce qui précède serait WordPress, qui crée plusieurs versions de taille / recadrée de toute image graphique téléchargée, en plus de garder l'original (sous réserve de restrictions de taille de fichier, et/ou des transformations de plugin). Plugins WordPress compatibles CDN tels que W3 Total Cache rewrite requests pour tirer à travers CDN, de sorte que L'application n'a besoin que de créer des itérations uniques de première demande. Ajout de la mise en cache du navigateur URL versioning ( http://domain.tld/fichier.le php?x123 ) affine et exploite davantage la fonctionnalité CDN.

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

2
répondu PlayGod 2015-02-08 19:08:15