Amazon S3 est un service extrêmement puissant au cœur d'Amazon Web Services. Cependant, en dehors de l'environnement de production, il peut être difficile de travailler avec S3. Il implique de faire circuler des clés d'accès, de provisionner des comptes d'utilisateurs et de maintenir une connexion réseau fiable - sans compter que cela coûte de l'argent. FakeS3 est un serveur léger qui simule le comportement du vrai S3. Il répond aux mêmes appels qu'Amazon S3 et stocke les fichiers téléchargés dans votre système de fichiers local - aucune demande n'est faite au service d'Amazon. Bien que gem ne supporte pas l'ensemble des commandes S3, l'API implémentée est suffisante pour la plupart des cas d'utilisation des applications.
Dans cet article, je vais présenter l'approche de l'intégration d'AWS et de FakeS3 avec Paperclip - une bibliothèque populaire d'attachement de fichiers pour Active Record. Paperclip et S3 combinés ensemble fournissent un système de stockage de fichiers efficace qui combine les fonctionnalités de base de Paperclip (comme la gestion des validations et les transformations d'images) avec les avantages du stockage en ligne. Bien que la configuration de ces outils ne soit pas évidente et nécessite de creuser dans la documentation détaillée ainsi que de résoudre de nombreux problèmes spécifiques aux gemmes, cela vaut la peine de passer un peu de temps à rendre le développement plus rapide et plus efficace.
Quel est notre objectif ?
L'intégration des outils décrits se fait en trois étapes :
- Lancement du faux serveur S3 fourni par la gemme FakeS3 en arrière-plan.
- Configuration du client AWS S3 pour qu'il délègue toutes les requêtes au fakeserver lancé.
- Configurer Paperclip pour utiliser un faux point de terminaison S3 dans les URLs des ressources construites.
Installation
Commençons par installer les gemmes nécessaires :
Fichier Gemfile #
gem "paperclip"
gem "aws-sdk", "~> 1.6"
gem "fakes3", groupe : [:development, :test]
Assurez-vous d'installer la version 1.6 de aws-sdk. Paperclip, qui utilise SKD pour gérer le stockage dans le service d'Amazon, ne fonctionne pas bien avec les versions supérieures de cette gemme. Ceci est dû à des changements significatifs dans l'API du SDK apportés avec la version 2.0.
Rappelez-vous également que l'objectif principal de FakeS3 est de minimiser les dépendances d'exécution. Il s'agit plutôt d'un outil de développement permettant de tester les appels S3 dans votre projet code plutôt qu'un serveur de production cherchant à reproduire les fonctionnalités de S3. Par conséquent, vous ne devriez inclure la gem que dans les groupes de développement et de test.
Configuration AWS
Le SDK AWS fournit une méthode d'aide dédiée au chargement de la configuration. Par défaut, elle chargera la configuration à partir de config/aws.yml
Le client AWS doit être en mesure d'extraire les paramètres de l'environnement actuel et de les transmettre au client AWS. Tout d'abord, appelez la méthode suivante dans un initialisateur :
# config/initializers/aws.rb
AWS::Rails.load_yaml_config
Maintenant que le fichier de configuration est correctement chargé, nous pouvons procéder à la spécification de son contenu :
# config/aws.yml
développement : &développement
access_key_id : "abc"
secret_access_key : "abc"
s3_endpoint : "localhost"
s3_port : 10001
s3_force_path_style : true
use_ssl : false
test : *développement
Examinons tous les paramètres un par un :
access_key_id, secret_access_key
- Informations d'identification du client AWS requises pour accéder à votre compte Amazon. Elles sont ignorées par le faux serveur S3, d'où les valeurs personnalisées dans les environnements de type "bac à sable".s3_endpoint, s3_port
- Spécification du point de terminaison S3. Nous utilisons ces paramètres pour remplacer le vrai point de terminaison S3 par un faux point de terminaison lancé par la gemme FakeS3 - toutes les demandes adressées au service d'Amazon seront désormais déléguées au faux serveur local.s3_force_path_style
- S3 accepte deux styles d'inclusion du nom du godet dans l'URL. Vous pouvez choisir de placer le nom du seau dans le style domaine (bucket.s3.amazonaws.com) ou dans le style chemin (s3.amazonaws.com/bucket). Afin de garder les choses simples et d'éviter la configuration supplémentaire associée au mappage du sous-domaine du seau à l'adresse loopback, je préfère le style chemin au style domaine dans l'environnement de développement.use_ssl
- impose au SDK AWS d'utiliser HTTPS au lieu de HTTP. Nous devons désactiver cette option, car la gemme FakeS3 ne supporte pas les requêtes HTTPS que le client AWS effectue par défaut.
La configuration de l'environnement de production est assez simple :
# config/aws.yml
production : &production
access_key_id :
secret_access_key :
staging : *production
Cette fois-ci, cependant, nous avons affaire à un véritable service S3, et vous devez donc fournir des informations d'identification AWS authentiques.
En raison des risques de sécurité potentiels, il est préférable de garder les valeurs secrètes comme les clés d'accès en dehors de votre système de contrôle de version, par exemple en utilisant des variables d'environnement. Nous utiliserons ERB pour injecter ses valeurs dans le fichier de configuration.
Configuration du trombone
Il est maintenant temps d'affronter Paperclip et de le forcer à travailler avec le client S3 déjà configuré. L'objectif principal de la configuration de Paperclip est d'obtenir le chemin de stockage qui localisera les ressources hébergées par fakeserver :
localhost:10001/:nom_du_seau/:chemin d'accès
Commençons par l'environnement de développement :
# config/paperclip.yml
développement : &développement
stockage : :s3
bucket : "développement"
s3_host_name : "localhost"
url : ":s3_alias_url"
path : ":class/:attachment/:id_partition/:style/:filename.:extension"
s3_host_alias : "localhost:10001/development"
test : *développement
stockage
- spécifie le support de stockage (par défaut, le système de fichiers local). Puisque nous utilisons AWS S3, nous devons le changer en:s3
.seau
- nom de l'espace de stockage S3 qui stockera vos fichiers. Si le panier n'existe pas, Paperclip tentera de le créer.url
- fixé à:s3_alias_url
Paperclip aliasera le nom d'hôte du seau S3 avec la valeur spécifiée par:s3_host_alias
paramètre.s3_host_alias
- l'alias de l'hôte du panier S3 par défaut. Notez que l'emplacement de l'hôte, du port et du nom du bac correspond à la configuration du client AWS.chemin
- pour les clés sous lesquelles les fichiers seront stockés dans le seau. Les clés doivent être uniques dans le bac, comme les noms de fichiers. Étant donné que S3 ne prend pas en charge les répertoires, vous pouvez utiliser une clé de type/
pour simuler des structures de répertoire.
# config/paperclip.yml
production : &production
stockage : :s3
bucket :
url : ":s3_domain_url"
path : ":class/:attachment/:id_partition/:style/:filename.:extension"
staging : *production
Tout comme les informations d'identification AWS, le nom du seau est également considéré comme une valeur secrète qui doit être stockée en dehors de votre base de code. Je recommande de stocker son nom dans une variable d'environnement.
Enfin, la configuration est intégrée aux options par défaut de Paperclip dans un initialisateur :
# config/initializers/paperclip.rb
paperclip_defaults = Rails.application.config_for :paperclip
paperclip_defaults.symbolize_keys !
Paperclip::Attachment.default_options.merge ! paperclip_defaults
Faux en cours d'exécution3
Les configurations AWS et Paperclip contiennent toutes deux une référence au serveur local S3 fakeserver qui est censé s'exécuter sous localhost:10001
. Avant de travailler sur le développement, vous devez lancer le serveur avec la commande suivante (fournie par la gem FakeS3) :
fakes3 -r public/system -p 10001
Les paramètres transmis sont les suivants :
root -r
- répertoire racine sous lequel les fichiers téléchargés seront stockés. Pensez à l'exclure de VCS si vous ne souhaitez pas que les fichiers téléchargés soient stockés dans votre référentiel.port -p
- numéro du port sur lequel le serveur local sera exécuté.
Si vous utilisez Foreman pour la gestion des processus dans votre application, il peut être utile d'ajouter l'entrée suivante dans Procfile :
# Procfile
fakes3 : fakes3 -r ${FAKES3_STORAGE_PATH:-public/system} -p ${FAKES3_PORT:-10001}
Cela vous évitera de perdre du temps à lancer fakeserver chaque fois que vous aurez besoin de développer des fonctionnalités liées à S3.
Conclusion
Nous avons configuré le client AWS pour qu'il délègue toutes les requêtes au fakeserver local, configuré Paperclip pour qu'il utilise le faux point de terminaison S3 dans les URL des ressources construites et lancé le fakeserver fourni par la gemme Fake S3 qui stocke tous les fichiers dans le système de fichiers local.
En conséquence, nous sommes devenus indépendants de la connexion Internet et avons économisé de l'argent en rendant notre développement plus rapide et plus fiable.