Amazon S3 ist ein extrem leistungsfähiger Service, der den Kern von Amazon Web Services bildet. Außerhalb der Produktionsumgebung kann es jedoch schwierig sein, mit S3 zu arbeiten. Es erfordert die Weitergabe von Zugangsschlüsseln, die Einrichtung von Benutzerkonten und die Aufrechterhaltung einer zuverlässigen Netzwerkverbindung - ganz zu schweigen davon, dass es Geld kostet. FakeS3 ist ein leichtgewichtiger Server, der das Verhalten des echten S3 simuliert. Er reagiert auf die gleichen Aufrufe wie Amazon S3 und speichert hochgeladene Dateien in Ihrem lokalen Dateisystem - es werden keine Anfragen an Amazons Dienst gestellt. Obwohl gem nicht den vollen Satz von S3-Befehlen unterstützt, ist die implementierte API für die meisten Anwendungsfälle ausreichend.
In diesem Artikel werde ich den Ansatz der Integration von AWS und FakeS3 mit Paperclip vorstellen - einer beliebten Bibliothek für Dateianhänge für Active Record. Paperclip und S3 zusammen bieten ein effektives Dateispeichersystem, das nützliche Paperclip-Kernfunktionen (wie Validierungsmanagement und Bildtransformationen) mit den Vorteilen der Online-Speicherung kombiniert. Auch wenn die Konfiguration dieser Tools nicht ganz einfach ist und einen Blick in die ausführliche Dokumentation sowie die Lösung vieler gem-spezifischer Probleme erfordert, lohnt es sich, etwas Zeit zu investieren, um die Entwicklung schneller und effizienter zu gestalten.
Was ist unser Ziel?
Die Integration der beschriebenen Werkzeuge erfordert drei Schritte:
- Start des S3-Fakeservers, der vom FakeS3-Gem im Hintergrund bereitgestellt wird.
- Konfigurieren des AWS S3-Clients, um alle Anfragen an den gestarteten Fakeserver zu delegieren.
- Konfigurieren von Paperclip zur Verwendung eines gefälschten S3-Endpunkts in den URLs der erstellten Ressourcen.
Einrichtung
Beginnen wir mit der Installation der erforderlichen Edelsteine:
# Gemfile
gem "paperclip"
gem "aws-sdk", "~> 1.6"
gem "fakes3", group: [:development, :test]
Stellen Sie sicher, dass Sie Version 1.6 von aws-sdk installieren. Paperclip, das SKD zur Verwaltung von Speicherplatz in Amazons Service verwendet, funktioniert nicht gut mit höheren Versionen dieses Edelsteins. Dies ist auf wesentliche Änderungen in der API des SDK zurückzuführen, die mit Version 2.0 eingeführt wurden.
Denken Sie auch daran, dass das Hauptziel von FakeS3 darin besteht, die Laufzeitabhängigkeiten zu minimieren. Es ist eher ein Entwicklungswerkzeug zum Testen von S3-Aufrufen in Ihrem Code und nicht auf einem Produktionsserver, der die S3-Funktionalität duplizieren soll. Daher sollten Sie gem nur in Entwicklungs- und Testgruppen einsetzen.
AWS-Konfiguration
AWS SDK bietet eine eigene Hilfsmethode, die für das Laden der Konfiguration zuständig ist. Sie lädt die Konfiguration standardmäßig von config/aws.yml
extrahieren Sie die Parameter für die aktuelle Umgebung und übergeben Sie sie an den AWS-Client. Rufen Sie zunächst die folgende Methode in einem Initialisierungsprogramm auf:
# config/initializers/aws.rb
AWS::Rails.load_yaml_config
Nun, da die Konfigurationsdatei ordnungsgemäß geladen wurde, können wir mit der Angabe ihres Inhalts fortfahren:
# config/aws.yml
Entwicklung: &Entwicklung
access_key_id: "abc"
secret_access_key: "abc"
s3_endpunkt: "localhost"
s3_port: 10001
s3_force_path_style: wahr
use_ssl: falsch
test: *Entwicklung
Lassen Sie uns alle Parameter nacheinander besprechen:
access_key_id, secret_access_key
- AWS-Client-Anmeldedaten, die für den Zugriff auf Ihr Amazon-Konto erforderlich sind. Sie werden vom gefälschten S3-Server ignoriert, daher benutzerdefinierte Werte in Sandbox-Umgebungen.s3_endpoint, s3_port
- S3-Endpunkt-Spezifikation. Wir verwenden diese Parameter, um den echten S3-Endpunkt durch einen gefälschten Endpunkt zu ersetzen, der vom FakeS3-Gem gestartet wird - alle Anfragen an den Amazon-Dienst werden nun an den lokalen Fakeserver delegiert.s3_force_path_style
- S3 akzeptiert zwei Arten der Einbeziehung des Bucket-Namens in die URL. Sie können wählen, ob der Bucket-Name im Domain-Stil (bucket.s3.amazonaws.com) oder im Pfad-Stil (s3.amazonaws.com/bucket) platziert werden soll. Um die Dinge einfach zu halten und eine zusätzliche Konfiguration zu vermeiden, die mit der Zuordnung der Subdomain des Buckets zur Loopback-Adresse verbunden ist, ziehe ich in der Entwicklungsumgebung den Pfadstil dem Domänenstil vor.verwenden_ssl
- erzwingt, dass AWS SDK HTTPS anstelle von HTTP verwendet. Wir müssen diese Option deaktivieren, da das FakeS3-Gem keine HTTPS-Anfragen unterstützt, die der AWS-Client standardmäßig durchführt.
Die Konfiguration für die Produktionsumgebung ist ziemlich einfach:
# config/aws.yml
Produktion: &Produktion
access_key_id:
secret_access_key:
staging: *production
Diesmal handelt es sich jedoch um einen echten S3-Dienst, weshalb Sie authentische AWS-Anmeldedaten angeben müssen.
Aufgrund potenzieller Sicherheitsrisiken ist es eine gute Praxis, geheime Werte wie Zugriffsschlüssel aus dem Versionskontrollsystem herauszuhalten, z. B. durch die Verwendung von Umgebungsvariablen. Wir werden ERB verwenden, um seine Werte in die Konfigurationsdatei zu injizieren.
Büroklammer-Konfiguration
Jetzt ist es an der Zeit, Paperclip zu konfrontieren und es zu zwingen, mit dem bereits konfigurierten S3-Client zu arbeiten. Das Hauptziel der Konfiguration von Paperclip ist es, den Speicherpfad zu erhalten, der die von fakeserver gehosteten Ressourcen auffindet:
localhost:10001/:bucket_name/:path
Beginnen wir wieder mit der Entwicklungsumgebung:
# config/paperclip.yml
Entwicklung: &Entwicklung
Speicherung: :s3
bucket: "entwicklung"
s3_host_name: "localhost"
url: ":s3_alias_url"
path: ":class/:attachment/:id_partition/:style/:filename.:extension"
s3_host_alias: "localhost:10001/development"
test: *Entwicklung
Lagerung
- gibt den Speicherträger an (standardmäßig lokales Dateisystem). Da wir AWS S3 verwenden, müssen wir dies ändern in:s3
.Eimer
- Name des S3-Buckets, in dem Ihre Dateien gespeichert werden sollen. Wenn der Bucket nicht existiert, versucht Paperclip, ihn zu erstellen.url
- eingestellt auf:s3_alias_url
veranlasst Paperclip, den Hostnamen des S3-Buckets mit dem Wert zu aliasieren, der durch:s3_host_alias
Parameter.s3_host_alias
- Alias für den Host des Standard-S3-Buckets. Beachten Sie, dass die Platzierung von Host, Port und Bucket-Namen der Konfiguration des AWS-Clients entspricht.Pfad
- Muster für Schlüssel, unter denen die Dateien im Bucket gespeichert werden sollen. Die Schlüssel sollten innerhalb des Buckets eindeutig sein, wie die Dateinamen. Da S3 keine Verzeichnisse unterstützt, können Sie eine/
Symbol, um Verzeichnisstrukturen zu simulieren.
# config/paperclip.yml
Produktion: &Produktion
Speicherung: :s3
bucket:
url: ":s3_domain_url"
path: ":class/:attachment/:id_partition/:style/:filename.:extension"
staging: *Produktion
Ähnlich wie die AWS-Anmeldedaten gilt auch der Bucket-Name als geheimer Wert, der außerhalb Ihrer Codebasis gespeichert werden sollte. Ich empfehle, seinen Namen in einer Umgebungsvariablen zu speichern.
Zum Schluss fügen Sie die Konfiguration in die Standardoptionen von Paperclip in einem Initialisierungsprogramm ein:
# config/initializers/paperclip.rb
paperclip_defaults = Rails.application.config_for :paperclip
paperclip_defaults.symbolize_keys!
Paperclip::Attachment.default_options.merge! paperclip_defaults
Laufende Fälschungen3
Sowohl AWS- als auch Paperclip-Konfigurationen enthalten einen Verweis auf den lokalen S3-Fakeserver, der unter localhost:10001
. Bevor Sie mit der Entwicklung beginnen, sollten Sie den Server mit dem folgenden Befehl starten (der von FakeS3 gem bereitgestellt wird):
fakes3 -r öffentlich/system -p 10001
Übergebene Parameter sind:
Wurzel -r
- Wurzelverzeichnis, unter dem hochgeladene Dateien gespeichert werden. Ziehen Sie in Erwägung, es aus dem VCS auszuschließen, wenn Sie nicht möchten, dass hochgeladene Dateien in Ihrem Repository gespeichert werden.port -p
- Nummer des Ports, auf dem der lokale Server ausgeführt wird.
Wenn Sie Foreman für die Prozessverwaltung in Ihrer Anwendung verwenden, kann es sinnvoll sein, den folgenden Eintrag in Procfile hinzuzufügen:
# Profildatei
fakes3: fakes3 -r ${FAKES3_STORAGE_PATH:-public/system} -p ${FAKES3_PORT:-10001}
Dies erspart Ihnen die Zeit, die Sie jedes Mal mit dem Start von fakeserver verlieren, wenn Sie einige S3-bezogene Funktionen entwickeln müssen.
Schlussfolgerung
Wir haben den AWS-Client so konfiguriert, dass er alle Anfragen an den lokalen Fakeserver delegiert, Paperclip so eingerichtet, dass es den gefälschten S3-Endpunkt in den URLs der erstellten Ressourcen verwendet, und den von Fake S3 gem bereitgestellten Fakeserver gestartet, der alle Dateien im lokalen Dateisystem speichert.
Dadurch wurden wir unabhängig von einer Internetverbindung und sparten Geld, was unsere Entwicklung schneller und zuverlässiger machte.