Amazon S3 è un servizio estremamente potente al centro di Amazon Web Services. Tuttavia, al di fuori dell'ambiente di produzione, S3 può essere difficile da utilizzare. Si tratta di passare le chiavi di accesso, di fornire gli account utente e di mantenere una connessione di rete affidabile, per non parlare dei costi. Per fortuna esiste uno strumento che aiuta a risolvere questo problema. FakeS3 è un server leggero che simula il comportamento del vero S3. Risponde alle stesse chiamate a cui risponde Amazon S3 e memorizza i file caricati nel vostro filesystem locale, senza che vengano effettuate richieste al servizio di Amazon. Sebbene gem non supporti l'intero set di comandi di S3, l'API implementata è sufficiente per la maggior parte dei casi di utilizzo delle applicazioni.
In questo articolo presenterò l'approccio all'integrazione di AWS e FakeS3 con Paperclip, una popolare libreria di file allegati per Active Record. Paperclip e S3 insieme forniscono un efficace sistema di archiviazione dei file che combina le utili funzionalità di base di Paperclip (come la gestione delle convalide e le trasformazioni delle immagini) con i vantaggi dell'archiviazione online. Sebbene la configurazione di questi strumenti non sia ovvia e richieda una documentazione dettagliata e la risoluzione di molti problemi specifici della gemma, vale la pena spendere un po' di tempo per rendere lo sviluppo più veloce ed efficiente.
Qual è il nostro obiettivo?
L'integrazione degli strumenti descritti richiede tre fasi:
- Avvio del fakeserver S3 fornito dalla gemma FakeS3 in background.
- Configurazione del client AWS S3 per delegare tutte le richieste al fakeserver lanciato.
- Configurazione di Paperclip per utilizzare il falso endpoint S3 negli URL delle risorse costruite.
Installazione
Iniziamo installando le gemme necessarie:
# Profilo della gemma
gemma "paperclip"
gemma "aws-sdk", "~> 1.6"
gemma "fakes3", gruppo: [:development, :test]
Assicurarsi di installare la versione 1.6 di aws-sdk. Paperclip, che utilizza SKD per gestire lo storage nel servizio di Amazon, non funziona bene con le versioni superiori di questa gemma. Ciò è dovuto a cambiamenti significativi nell'API dell'SDK apportati con la versione 2.0.
Ricordare inoltre che l'obiettivo principale di FakeS3 è quello di ridurre al minimo le dipendenze di runtime. Si tratta più che altro di uno strumento di sviluppo per testare le chiamate S3 nel vostro codice piuttosto che un server di produzione che vuole duplicare le funzionalità di S3. Pertanto, si dovrebbe includere la gemma solo nel gruppo di sviluppo e di test.
Configurazione AWS
L'SDK di AWS fornisce un metodo di aiuto dedicato al caricamento della configurazione. Per impostazione predefinita, carica la configurazione da config/aws.yml
, estrarre i suoi parametri per l'ambiente corrente e passarli al client AWS. Innanzitutto, chiamare il metodo seguente in un inizializzatore:
# config/initializers/aws.rb
AWS::Rails.load_yaml_config
Ora che il file di configurazione è stato caricato correttamente, possiamo procedere a specificarne il contenuto:
# config/aws.yml
sviluppo: &sviluppo
access_key_id: "abc"
secret_access_key: "abc"
s3_endpoint: "localhost
s3_port: 10001
s3_force_path_style: true
use_ssl: false
test: *sviluppo
Analizziamo tutti i parametri uno per uno:
ID_chiave_di_accesso, chiave_di_accesso_segreta
- Credenziali del client AWS necessarie per accedere all'account Amazon. Sono ignorate dal falso server S3, quindi valori personalizzati in ambienti sandbox.s3_endpoint, s3_port
- specifiche dell'endpoint S3. Utilizziamo questi parametri per sostituire il vero endpoint S3 con quello falso lanciato dalla gemma FakeS3: tutte le richieste al servizio di Amazon saranno ora delegate al fakeserver locale.s3_force_path_style
- S3 accetta due stili di inclusione del nome del bucket nell'URL. Si può scegliere se inserire il nome del bucket in stile dominio (bucket.s3.amazonaws.com) o in stile percorso (s3.amazonaws.com/bucket). Per mantenere le cose semplici ed evitare configurazioni aggiuntive associate alla mappatura del sottodominio del bucket all'indirizzo di loopback, nell'ambiente di sviluppo preferisco il path-style al domain-style.usa_ssl
- impone all'SDK di AWS di usare HTTPS invece di HTTP. Dobbiamo disabilitare questa opzione, perché la gemma FakeS3 non supporta le richieste HTTPS che il client AWS esegue per impostazione predefinita.
La configurazione per l'ambiente di produzione è piuttosto semplice:
# config/aws.yml
produzione: &produzione
access_key_id:
secret_access_key:
staging: *produzione
Questa volta, però, abbiamo a che fare con un vero servizio S3, quindi è necessario fornire credenziali AWS autentiche.
A causa dei potenziali rischi per la sicurezza, è buona norma tenere i valori segreti, come le chiavi di accesso, fuori dal sistema di controllo della versione, ad esempio usando le variabili d'ambiente. Useremo ERB per iniettare i suoi valori nel file di configurazione.
Configurazione della graffetta
Ora è il momento di affrontare Paperclip e forzarlo a lavorare in modo corretto con il client S3 già configurato. L'obiettivo principale della configurazione di Paperclip è ottenere il percorso di memorizzazione che localizzerà le risorse ospitate da fakeserver:
localhost:10001/:bucket_name/:path
Ancora una volta, iniziamo con l'ambiente di sviluppo:
# config/paperclip.yml
sviluppo: &sviluppo
archiviazione: :s3
bucket: "development"
nome_host_s3: "localhost
url: ":s3_alias_url"
percorso: ":class/:attachment/:id_partition/:style/:filename.:extension"
s3_host_alias: "localhost:10001/development"
test: *sviluppo
immagazzinamento
- specifica il vettore di archiviazione (per impostazione predefinita il filesystem locale). Poiché stiamo usando AWS S3, dobbiamo cambiarlo in:s3
.secchio
- nome del bucket S3 che memorizzerà i file. Se il bucket non esiste, Paperclip tenterà di crearlo.url
- impostato su:s3_alias_url
farà in modo che Paperclip alias il nome host del bucket S3 con il valore specificato da:s3_host_alias
parametro.s3_host_alias
- alias per l'host del bucket S3 predefinito. Si noti che l'host, la porta e il nome del bucket corrispondono alla configurazione del client AWS.percorso
- per le chiavi con cui i file saranno memorizzati nel bucket. Le chiavi devono essere uniche all'interno del bucket, come i nomi dei file. Dato che S3 non supporta le directory, è possibile utilizzare una chiave di tipo/
per simulare strutture di directory.
# config/paperclip.yml
produzione: &produzione
archiviazione: :s3
bucket:
url: ":s3_domain_url"
percorso: ":class/:attachment/:id_partition/:style/:filename.:extension"
staging: *produzione
Analogamente alle credenziali AWS, anche il nome del bucket è considerato un valore segreto che deve essere memorizzato al di fuori della base di codice. Si consiglia di memorizzare il nome in una variabile d'ambiente.
Infine, unire la configurazione alle opzioni predefinite di Paperclip in un inizializzatore:
# config/initializers/paperclip.rb
paperclip_defaults = Rails.application.config_for :paperclip
paperclip_defaults.symbolize_keys!
Paperclip::Attachment.default_options.merge! paperclip_defaults
Esecuzione di fakes3
Entrambe le configurazioni di AWS e Paperclip contengono un riferimento al fakeserver S3 locale che dovrebbe essere eseguito sotto localhost:10001
. Prima di lavorare allo sviluppo è necessario lanciare il server con il seguente comando (fornito dalla gemma FakeS3):
fakes3 -r public/system -p 10001
I parametri passati sono:
root -r
- la directory principale in cui verranno memorizzati i file caricati. Considerare di escluderla dal VCS se non si vuole che i file caricati siano memorizzati nel repository.porta -p
- numero della porta su cui verrà eseguito il server locale.
Se si utilizza Foreman per la gestione dei processi nella propria applicazione, può essere conveniente aggiungere la seguente voce in Procfile:
Profilo di processo #
fakes3: fakes3 -r ${FAKES3_STORAGE_PATH:-public/system} -p ${FAKES3_PORT:-10001}
In questo modo si risparmierà il tempo perso per lanciare fakeserver ogni volta che si dovrà sviluppare qualche funzionalità legata a S3.
Conclusione
Abbiamo configurato il client AWS in modo che deleghi tutte le richieste al fakeserver locale, abbiamo impostato Paperclip in modo che utilizzi l'endpoint S3 falso negli URL delle risorse costruite e abbiamo lanciato il fakeserver fornito dal gemma Fake S3 che memorizza tutti i file nel filesystem locale.
Di conseguenza, siamo diventati indipendenti dalla connessione a Internet e abbiamo risparmiato denaro, rendendo il nostro sviluppo più veloce e affidabile.