Gestire i redirect di più domini utilizzando Amazon S3 e Amazon CloudFront

Introduzione

Sappiamo cosa state pensando: ecco l’ennesimo articolo sulla classica combo "Amazon CloudFront + Amazon S3" per l’hosting dei siti web. 

Ormai sembra che ogni appassionato di cloud (e anche il suo gatto) abbia scritto un post a riguardo.

E se vi dicessimo che questo è diverso? 

Se ci fossero dei trucchetti per migliorare questo setup e magari pensionare per sempre quel vecchio server Apache?

In questo articolo esploreremo come utilizzare Amazon S3 e Amazon CloudFront per impostare dei redirect intelligenti verso il nostro sito principale, il tutto senza dover mantenere un server web. 

Inoltre, vedremo come sfruttare efficientemente i metadati di Amazon S3 per assicurare che gli utenti siano sempre indirizzati alla versione più aggiornata del nostro contenuto.

Quindi sì, è un altro post sulla configurazione Amazon CloudFront + Amazon S3, ma con una svolta che merita attenzione.

Le Basi

Prima di entrare nei dettagli, facciamo un rapido riassunto:

  • Amazon S3: S3 è un servizio di storage a oggetti usato anche per ospitare siti statici, servendo file HTML, CSS, JavaScript e immagini direttamente da un bucket.
  • Integrazione con Amazon CloudFront: CloudFront potenzia questo setup servendo contenuti dalle edge location più vicine agli utenti, migliorando i tempi di caricamento e riducendo la latenza. Inoltre, consente l’uso di nomi di dominio personalizzati tramite certificati SSL/TLS.

Le Sfide: Reindirizzamenti del Sito Web

Mettiamo caso di avere  il nostro sito che gira senza intoppi su Amazon S3, con Amazon CloudFront che garantisce performance eccezionali. 

Immaginiamo anche di avere altri domini - ad esempio oldexample.com, oldexample1.com e altri ancora - che devono essere reindirizzati a example.com.

Che fare con questi vecchi domini accumulati nel tempo?

Con una configurazione tradizionale su una macchina virtuale, potremmo facilmente impostare un redirect nelle impostazioni del virtual host. Ma mantenere una VM solo per i redirect aggiunge complessità e costi inutili.

Certo, alcuni servizi DNS consentono la creazione di record 301-302, ma sappiamo essere una scorciatoia e non tutti possono migrare verso quei servizi.

E impostare un record CNAME? 

Purtroppo non fornisce un vero redirect e può avere impatti negativi sulla SEO.

Poi ci sono CloudFront Functions o Lambda@Edge. Entrambe sono scelte valide: le Functions di CloudFront sono rapide e convenienti, ma hanno un limite di 10 KB — quindi è meglio non riempirle solo con redirect. Lambda@Edge non ha quel limite, ma è più lenta e costosa.

Senza contare che dobbiamo comunque mantenere del codice per entrambe le soluzioni.

Come possiamo quindi implementare questi reindirizzamenti senza complicare l'infrastruttura o incappare in problemi DNS?

Soluzione

Ecco dove le cose diventano interessanti: e se mettessimo un Amazon CloudFront + Amazon S3 davanti al nostro sito Amazon CloudFront + Amazon S3 esistente?

Potrebbe sembrare controintuitivo, ma fidatevi, funziona! Ecco come:

  1. Creiamo un nuovo bucket S3 e abilitiamo l'hosting di siti web, configurandolo per reindirizzare al nostro sito principale.
  2. Nei settaggi di hosting del sito su S3, impostiamo il redirect verso il dominio primario (ad esempio example.com).
  3. Creiamo una nuova distribuzione CloudFront. Nella sezione Alternate Domain Names (CNAMEs), aggiungiamo tutti i domini vecchi come oldexample.com e oldexample1.com.
  4. Impostiamo l'endpoint del nuovo bucket S3 come origine per questa nuova distribuzione CloudFront.
  5. Configuriamo la cache, i cookie e le policy CORS come necessario.

Voilà! Tutto il traffico dai vecchi domini verrà ora reindirizzato al nostro nuovo sito, senza la necessità di gestire virtual host o infrastrutture complesse.

Bonus - Uso Consistente del WWW per la SEO

La coerenza è cruciale quando si tratta di SEO, e mantenere una struttura URL uniforme può essere complicato. Per assicurarci che i nostri URL siano SEO-friendly, basta utilizzare l'opzione di hosting su Amazon S3 per reindirizzare sempre alla versione "www" del nostro dominio.

È una piccola modifica, ma fa una grande differenza!

Gestione dei Metadati di S3

Adesso approfondiamo come gestire i reindirizzamenti per percorsi e file in modo granulare.

Immaginiamo di dover gestire più versioni del nostro prodotto, e che ogni versione sia contenuta in una cartella (/v1.0/, /v2.0/). Quando viene rilasciata una nuova versione, vogliamo che gli utenti vengano reindirizzati alla versione più recente, senza l’incubo di dover aggiornare costantemente i link o mantenere una lista di redirect.

Ed è qui che entra in gioco il campo di metadati Amazon S3 x-amz-website-redirect-location.

Caso d'Uso

Consideriamo questo scenario: abbiamo directory versionate per il nostro prodotto:

  • /v1.0/
  • /v2.0/
  • /v3.0/ (l’ultima versione)

Vogliamo che chiunque visiti /latest/ venga reindirizzato a /v3.0/, e quando rilasciamo /v4.0/, vogliamo aggiornare il redirect senza sforzi.

Soluzione

Per ottenere questo, creiamo un oggetto segnaposto su /latest/ (può essere un oggetto vuoto o una cartella). Poi, nella sezione Metadata delle Properties dell'oggetto S3, aggiungiamo una nuova chiave:

  • Key: x-amz-website-redirect-location
  • Value: /v3.0/ (o qualunque sia la versione più recente)

Quando rilasceremo una nuova versione (ad esempio /v4.0/), basterà aggiornare il metadato per puntare a /v4.0/. In questo modo, gli utenti che accederanno  a /latest/ verranno sempre reindirizzati alla versione più aggiornata del nostro contenuto.

Impostare Reindirizzamenti Esterni

In alcuni casi, potremmo voler far puntare il nostro redirect "latest" verso un servizio esterno o un dominio diverso. 

Nessun problema: x-amz-website-redirect-location gestisce facilmente anche i reindirizzamenti esterni. Ad esempio, se l'ultima versione fosse ospitata su un dominio diverso, basterebbe impostare il redirect su https://newexample.com/v4.0/.

Bonus - Automatizzare il Processo

Aggiornare manualmente il metadato ogni volta che rilasciamo una nuova versione è piuttosto semplice, ma potremmo voler automatizzare il processo per progetti su larga scala. Possiamo usare AWS SDK o AWS CLI per automatizzare l'aggiornamento di x-amz-website-redirect-location ad ogni nuovo rilascio. 

Ecco un esempio di come aggiornare il metadato con AWS CLI:

aws s3api put-object \ 
--bucket your-bucket-name \ 
--key latest/ \ 
--website-redirect-location /v4.0/

Integrando questo passaggio nella nostra pipeline CI/CD, possiamo garantire che il redirect alla versione più recente sia sempre aggiornato come parte del nostro processo di rilascio.

Conclusione

Ecco fatto: hosting web su Amazon S3 con Amazon CloudFront, ma con qualche trucco inaspettato! 

Dalla gestione di più reindirizzamenti di dominio al mantenere i nostri utenti sempre aggiornati con l'ultima versione del prodotto, abbiamo visto come sfruttare la combinazione di Amazon S3 e Amazon CloudFront in modo serverless ed efficiente.

Niente server, niente infrastrutture complesse, solo un uso intelligente delle capacità AWS per mantenere i nostri siti e utenti sempre aggiornati e velocissimi.

I punti chiave:

  • La combinazione Amazon CloudFront + Amazon S3 non serve solo per ospitare siti statici; è anche una soluzione ottimale per semplificare i reindirizzamenti.
  • x-amz-website-redirect-location permette di gestire facilmente versioni e reindirizzamenti esterni senza dover scrivere funzioni o script complicati.

Quindi, la prossima volta che qualcuno vi dirà: "Oh, un altro post su Amazon CloudFront e Amazon S3?!" potrete dire: "Sì, ma questo è diverso!" :D 

Avete trovato altre soluzioni a questa necessità?

Fatecelo sapere nei commenti! 

A presto con un nuovo articolo su Proud2beCloud!


About Proud2beCloud

Proud2beCloud è il blog di beSharp, APN Premier Consulting Partner italiano esperto nella progettazione, implementazione e gestione di infrastrutture Cloud complesse e servizi AWS avanzati. Prima di essere scrittori, siamo Solutions Architect che, dal 2007, lavorano quotidianamente con i servizi AWS. Siamo innovatori alla costante ricerca della soluzione più all'avanguardia per noi e per i nostri clienti. Su Proud2beCloud condividiamo regolarmente i nostri migliori spunti con chi come noi, per lavoro o per passione, lavora con il Cloud di AWS. Partecipa alla discussione!

Alessandro Gallo
DevOps Engineer @ beSharp e appassionato di tecnologia fin da molto prima che diventasse un trend. Nel tempo libero mi troverete immerso in libri fantasy e film. In un passato non troppo lontano sono stato anche uno chef; oggi "preparo" soluzioni in Cloud!

Lascia un commento

Ti potrebbero interessare

Sviluppo remoto su AWS: da Cloud9 a VS Code