Amazon S3 is een extreem krachtige dienst die de kern vormt van Amazon Web Services. Buiten de productieomgeving kan S3 echter een uitdaging zijn om mee te werken. Er moeten toegangssleutels worden doorgegeven, gebruikersaccounts moeten worden aangemaakt en er moet een betrouwbare netwerkverbinding worden onderhouden - en dan hebben we het nog niet eens over de kosten. FakeS3 is een lichtgewicht server die het gedrag van het echte S3 simuleert. Hij reageert op dezelfde aanroepen als Amazon S3 en slaat geüploade bestanden op in je lokale bestandssysteem - er worden geen verzoeken gedaan aan de service van Amazon. Hoewel gem niet de volledige set S3 commando's ondersteunt, is de geïmplementeerde API voldoende voor de meeste toepassingen.
In dit artikel presenteer ik de aanpak van het integreren van AWS en FakeS3 met Paperclip - populaire bestandsbijlage bibliotheek voor Active Record. Paperclip en S3 samen zorgen voor een effectief bestandsopslagsysteem dat de kernfuncties van Paperclip (zoals validatiebeheer en beeldtransformaties) combineert met de voordelen van online opslag. Hoewel de configuratie van deze tools niet voor de hand ligt en het graven in gedetailleerde documentatie vereist evenals het oplossen van veel gem-specifieke problemen, is het de moeite waard om wat tijd te spenderen om de ontwikkeling sneller en efficiënter te maken.
Wat is ons doel?
Integratie van beschreven hulpmiddelen vereist drie stappen:
- Start S3 fakeserver geleverd door FakeS3 gem op de achtergrond.
- AWS S3-client configureren om alle verzoeken te delegeren naar een gelanceerde fakeserver.
- Paperclip configureren om een nep S3 eindpunt te gebruiken in de URL's van gebouwde bronnen.
Installatie
Laten we beginnen met het installeren van de vereiste edelstenen:
# Gemfile
gem "paperclip
gem "aws-sdk", "~> 1.6"
gem "fakes3", groep: [:development, :test]
Zorg ervoor dat je versie 1.6 van aws-sdk installeert. Paperclip, dat SKD gebruikt om opslag in Amazon's service te beheren, werkt niet goed met hogere versies van dit juweeltje. Dit komt door significante veranderingen in de API van SDK die met versie 2.0 zijn geïntroduceerd.
Onthoud ook dat het hoofddoel van FakeS3 is om runtime afhankelijkheden te minimaliseren. Het is meer een ontwikkeltool om S3-aanroepen te testen in je code in plaats van een productieserver die S3 functionaliteit wil dupliceren. Daarom moet je gem alleen opnemen in de ontwikkel- en testgroep.
AWS-configuratie
AWS SDK biedt een speciale helpermethode die verantwoordelijk is voor het laden van de configuratie. Standaard wordt de configuratie geladen van config/aws.yml
de parameters voor de huidige omgeving en geef ze door aan de AWS-client. Roep eerst de volgende methode aan in een initializer:
# config/initializers/aws.rb
AWS::Rails.load_yaml_config
Nu het configuratiebestand op de juiste manier is geladen, kunnen we verder gaan met het specificeren van de inhoud:
# config/aws.yml
ontwikkeling: &ontwikkeling
toegang_key_id: "abc".
geheime_toegangssleutel: "abc"
s3_endpoint: "localhost".
s3_poort: 10001
s3_force_path_style: true
gebruik_ssl: false
test: *ontwikkeling
Laten we alle parameters een voor een bespreken:
toegang_key_id, geheime_toegang_sleutel
- AWS client credentials die nodig zijn om toegang te krijgen tot je Amazon account. Ze worden genegeerd door nep S3 server vandaar aangepaste waarden in sandbox omgevingen.s3_endpoint, s3_poort
- S3 eindpunt specificatie. We gebruiken deze parameters om het echte S3 eindpunt te vervangen door een nep eindpunt gelanceerd door FakeS3 gem - alle verzoeken naar Amazon's service worden nu gedelegeerd naar de lokale fakeserver.s3_kracht_pad_stijl
- S3 accepteert twee stijlen voor het opnemen van de naam van de emmer in de URL. Je kunt ervoor kiezen om de naam van de emmer te plaatsen in de domeinstijl (emmer.s3.amazonaws.com) of in de padstijl (s3.amazonaws.com/bucket). Om de dingen eenvoudig te houden en extra configuratie te vermijden voor het toewijzen van het subdomein van de emmer aan het loopback adres, geef ik in mijn ontwikkelomgeving de voorkeur aan de padstijl boven de domeinstijl.gebruik_ssl
- dwingt AWS SDK af om HTTPS te gebruiken in plaats van vanilla HTTP. We moeten deze optie uitschakelen, omdat FakeS3 gem geen HTTPS-verzoeken ondersteunt die AWS-client standaard uitvoert.
De configuratie voor een productieomgeving is vrij eenvoudig:
# config/aws.yml
productie: &productie
access_key_id:
geheime_toegang_sleutel:
staging: *productie
Deze keer hebben we echter te maken met de echte S3-service, daarom moet je authentieke AWS-referenties opgeven.
Vanwege potentiële veiligheidsrisico's is het een goede gewoonte om geheime waarden zoals toegangssleutels buiten je versiebeheersysteem te houden, bijvoorbeeld door omgevingsvariabelen te gebruiken. We zullen ERB gebruiken om zijn waarden in het configuratiebestand te injecteren.
Paperclip configuratie
Nu is het tijd om Paperclip onder ogen te komen en het te dwingen om netjes samen te werken met de al geconfigureerde S3 client. Het hoofddoel van Paperclip's configuratie is het verkrijgen van het opslagpad dat de bronnen zal lokaliseren die worden gehost door fakeserver:
localhost:10001/:emmer_naam/:pad
Laten we opnieuw beginnen met de ontwikkelomgeving:
# config/paperclip.yml
ontwikkeling: &ontwikkeling
opslag: :s3
emmer: "development"
s3_host_naam: "localhost".
url: ":s3_alias_url"
pad: ":class/:attachment/:id_partition/:style/:filename.:extension"
s3_host_alias: "localhost:10001/development"
test: *ontwikkeling
opslag
- geeft de opslagdrager aan (standaard lokaal bestandssysteem). Omdat we AWS S3 gebruiken, moeten we dit veranderen in:s3
.emmer
- naam van de S3 emmer waarin uw bestanden worden opgeslagen. Als de emmer niet bestaat, probeert Paperclip deze aan te maken.url
- ingesteld op:s3_alias_url
zorgt ervoor dat Paperclip de hostnaam van de S3-bucket aliast met de waarde gespecificeerd door:s3_host_alias
parameter.s3_host_alias
- alias voor de standaard host van de S3-bucket. Merk op dat de plaatsing van host, poort en emmernaam overeenkomt met de configuratie van de AWS-client.pad
- patroon voor sleutels waaronder de bestanden zullen worden opgeslagen in de emmer. Sleutels moeten uniek zijn binnen de emmer, net als bestandsnamen. Omdat S3 geen mappen ondersteunt, kun je een/
symbool om directorystructuren te simuleren.
# config/paperclip.yml
productie: &productie
opslag: :s3
emmer:
url: ":s3_domein_url"
pad: ":class/:attachment/:id_partition/:style/:filename.:extension"
staging: *productie
Net als AWS-referenties wordt ook de bucketnaam beschouwd als een geheime waarde die buiten je code base moet worden opgeslagen. Ik raad aan om de naam op te slaan in een omgevingsvariabele.
Voeg ten slotte de configuratie samen met de standaardopties van Paperclip in een initializer:
# config/initializers/paperclip.rb
paperclip_defaults = Rails.application.config_for :paperclip
paperclip_defaults.symbolize_keys!
Paperclip::Attachment.default_options.merge! paperclip_defaults
Fakes3 uitvoeren
Zowel AWS als Paperclip configuraties bevatten een verwijzing naar de lokale S3 fakeserver die naar verwachting draait onder localhost:10001
. Voordat je aan ontwikkeling doet, moet je de server starten met het volgende commando (geleverd door FakeS3 gem):
fakes3 -r public/system -p 10001
Doorgegeven parameters zijn:
root -r
- Hoofdmap waaronder geüploade bestanden worden opgeslagen. Overweeg om deze uit te sluiten van VCS als je niet wilt dat geüploade bestanden worden opgeslagen in je archief.poort -p
- nummer van de poort waarop de lokale server zal draaien.
Als je Foreman gebruikt voor procesbeheer in je applicatie, kan het handig zijn om de volgende regel toe te voegen aan Procfile:
# Procfile
fakes3: fakes3 -r ${FAKES3_STORAGE_PATH:-public/system} -p ${FAKES3_PORT:-10001}
Dit bespaart je tijd die je kwijt bent aan het starten van fakeserver elke keer dat je een S3-gerelateerde functie moet ontwikkelen.
Conclusie
We hebben de AWS client geconfigureerd om alle verzoeken te delegeren naar de lokale fakeserver, Paperclip ingesteld om een nep S3 endpoint te gebruiken in de URL's van de gebouwde bronnen en de fakeserver gestart die wordt geleverd door de Fake S3 gem die alle bestanden opslaat in het lokale bestandssysteem.
Hierdoor werden we onafhankelijk van internetverbindingen en bespaarden we geld, waardoor onze ontwikkeling sneller en betrouwbaarder werd.