Amazon Cloudfront con S3 Redirect


10

Sto cercando di fare qualcosa che dovrebbe essere relativamente semplice: voglio impostare alcuni domini e sottodomini per reindirizzare al dominio principale per il nostro sito, ma voglio mettere i reindirizzamenti su Cloudfront. Tutto funziona tranne il reindirizzamento del percorso principale, che mi fornisce un file XML che descrive in parte il bucket S3.

sfondo

S3

S3 ti consente di configurare un bucket per tutti i reindirizzamenti , come:

S3 con reindirizzamento di tutte le richieste di installazione

Provando questo, l'endpoint web (brass9-com.s3-website-us-west-1.amazonaws.com) fa quello che dovrebbe - reindirizza a brass9.com. Buona.

Cloudfront

Cloudfront ti consente di indicare un bucket S3, ma il modo in cui ti suggerisce di farlo è sbagliato: invece di indicare il bucket con il suo nome, come brass9-com.s3.amazonaws.com, devi utilizzare l'Endpoint Web sopra. Diverso da quello che puoi lasciare tutto ai suoi valori predefiniti e ottenere un buon comportamento di reindirizzamento. Quindi, un percorso come www.brass9.com/portfolio reindirizza correttamente dove dovrebbe. Anche buono.

Il problema: il reindirizzamento del dominio principale

L'unica cosa che poi non funziona è il reindirizzamento dal semplice www.brass9.com . Invece di ottenere un reindirizzamento ti dà questo strano risultato:

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>brass9-com</Name><Prefix></Prefix>
<Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated>
</ListBucketResult>

OK... . Quindi questo non è completamente inaspettato , perché non esiste alcun oggetto radice predefinito. Ma quale oggetto root predefinito potrei eventualmente specificare per prevenire questo comportamento? Qual è il nome dell'oggetto di reindirizzamento S3, se presente, a cui devo puntare? O c'è qualche altra corretta configurazione, o è solo un bug nel modo in cui Cloudfront e S3 interagiscono che Amazon deve risolvere?

Soluzione nota non funzionante: oggetto root predefinito

È possibile specificare un oggetto radice predefinito di index.html, ma non aiuta nessuno: cambia semplicemente il problema. L'URL di Cloudfront reindirizza invece a /index.html sul sito principale, che è un 404 (non utilizziamo un file index.html, è un sito basato sul framework lato server). Potrei mettere un index.html sul server, ma questo sconfigge il piccolo guadagno di velocità dell'utilizzo di Cloudfront in primo luogo.

Domande simili

Una domanda pone qualcosa di simile ma restituisce una risposta vuota a 0 byte per qualche motivo invece di quello che vedo, una risposta XML. Non include una domanda su quel problema o una risoluzione.

Articoli Correlati

Un articolo propone di pubblicare l'intero sito sia nel dominio bare che in www . Questo si avvita con i segnalibri di qualsiasi utente, il tuo ranking di ricerca, ecc. Ecc.

Molti discutono di ospitare un sito Web statico su S3 e Cloudfront anziché uno schema di reindirizzamento, e quindi non sono correlati.

Quindi, come posso farlo correttamente?

Schermata di Cloudfront Configuration - nessun oggetto root predefinito, che punta all'origine S3. Ignora InProgress: avevo appena attivato e disattivato l'oggetto radice predefinito per testarlo.

Cloudfront Distribution senza oggetto root predefinito che punta a S3

E l'origine configura per quella distribuzione:

Origine: indica S3, valori predefiniti


1
Qualsiasi richiesta a un endpoint del sito Web configurato per reindirizzare tutto "dovrebbe" fare esattamente questo, incluso il root. Hai una politica di bucket su quel bucket di reindirizzamento? Sembra che potresti, ma non dovresti. Sembra anche che avresti potuto vedere una risposta memorizzata nella cache da Cloudfront per GET /prima di aver corretto la configurazione per utilizzare l'endpoint web.
Michael - sqlbot

1
In realtà era una risposta ListBucket memorizzata nella cache ancora persistente in S3, anche se avevo invalidato e modificato la configurazione di CF più volte. Ci vogliono solo un'ora o 4 per cancellare. @ Michael-sqlbot Se pubblichi il tuo commento come una risposta, posso contrassegnarlo come accettato.
Chris Moschini,

Risposte:


4

Se si riscontra questo problema, verificare innanzitutto quando si configura l'origine del bucket s3 per il cloudfront, il completamento automatico restituisce l'endpoint REST s3 domain.amazonaws.com che restituisce questa risposta ListBucketResult.

È necessario annotare manualmente l'endpoint del sito Web domain.s3-website-region.amazonaws.com

Importante: se il cloudfront è stato configurato in modo errato con l'endpoint REST, è necessario invalidare la cache tramite Invalidations o continuerà a restituire la risposta REST


La nota sull'invalidazione della cache mi ha finalmente aiutato a risolvere un problema che ho inseguito per diversi giorni. Grazie!
Nate,

Molte grazie! Per gli utenti Terraform, nel originblocco della distribuzione, utilizzare aws_s3_bucket.BUCKET.website_endpointnel domain_name(non bucket_regional_name) e aggiungere il custom_origin_configblocco.
Dusan,

Sei un vero toccasana! Abbiamo lottato con questo problema per l'ultimo giorno, continuando a recuperare XML ListBucketResult anche se stavamo cambiando le impostazioni di distribuzione. Alla fine, dopo aver eliminato la distribuzione e averne creato uno nuovo che punta a domain.s3-website-region.amazonaws.com, il reindirizzamento ha funzionato per noi!
Dale Zak,

2

Soluzione: installare il reindirizzamento come indicato nella domanda, quindi attendere i tempi di cache S3 e CloudFront. Possono durare 4 ore o più, quindi devi solo impostare tutto, quindi attendere e sperare per il meglio.

(Questa è la soluzione di Michael dai commenti, ma ormai sono passati anni e questo meritava davvero di essere contrassegnato come Risposta).


0

Scrivere come risposta poiché non posso commentare - dalla documentazione su http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/DistributionConfigDatatype.html#DistributionConfigDatatype_Elements sembra che tu possa avere un oggetto root predefinito vuoto:

Se non si desidera specificare un oggetto root predefinito quando si crea una distribuzione, includere un elemento DefaultRootObject vuoto.


Puoi (anche se alcune librerie API lo vietano) - ma l'uso di un oggetto radice predefinito vuoto mi dà la ridicola risposta XML ListBucketResult che vedi nella mia domanda.
Chris Moschini,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.