Sito Web CloudFront + S3: “La chiave specificata non esiste” quando deve essere visualizzato un documento indice implicito

Ho appena installato un sito Web statico su Amazon S3, che al momento può essere visualizzato qui: http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/

Se fai clic su uno dei collegamenti dell’articolo, noterai il seguente errore:

Errore S3

S3 si lamenta che il file non esiste. Ora, ecco cosa c’è di strano in questo – sto usando CloudFront sul mio dominio. Quindi, quando fai clic sul link di quell’articolo, invia la richiesta a CloudFront che tenta quindi di recuperare il file dal bucket S3.

Tuttavia, se visiti direttamente lo stesso URL da S3, ad esempio: http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/2015/building-a-heroku-addon-planning/ la pagina verrà caricata correttamente.

Sembra che qualcosa si stia perdendo nella traduzione qui.

Qualcuno ha un suggerimento su cosa posso fare per correggere le mie impostazioni?

Uscirò su un arto e dirò che la chiave specificata non esiste tecnicamente , quindi il messaggio di errore è tecnicamente accurato ma non racconta l’intera storia. Questa dovrebbe essere una soluzione facile.

I bucket S3 hanno due endpoint, “REST” e “sito Web”. Hanno due diversi set di funzionalità. L’endpoint del sito Web fornisce una risoluzione magica dei documenti di indice (ad es. Index.html, che sembra essere ciò che dovrebbe essere restituito al browser nell’esempio fornito) mentre gli endpoint REST no.

Quando si configura CloudFront davanti a un bucket utilizzato per l’hosting del sito Web, di solito non si desidera configurare l’origine come origine “S3” selezionando il nome del bucket dall’elenco a discesa; invece, si desidera configurarlo come origine “Personalizzata” e utilizzare il nome host dell’endpoint del sito Web fornito nella console S3 (ad example-bucket.s3-website-us-east-1... ) perché altrimenti, CloudFront si presuppone che si desidera utilizzare l’endpoint REST per il bucket (che consente l’autenticazione e il contenuto privato, che l’endpoint del sito Web non esegue).

Importante

Non selezionare il nome del bucket dall’elenco, ad esempio example.com.s3.amazonaws.com.

http://docs.aws.amazon.com/gettingstarted/latest/swh/getting-started-create-cfdist.html

La documentazione è stata rifattorizzata dal momento che questa domanda aveva inizialmente una risposta, quindi il messaggio mostrato sopra ora appare una pagina dopo, ed è stato riformulato, ma l’essenza è la stessa. Il “nome del secchio” sembra fare riferimento alle scelte mostrate nel menu a discesa, che non è quello che desideri.

Nota

Assicurati di specificare l’endpoint di hosting del sito web statico, non il nome del bucket.

http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-cloudfront-walkthrough.html

Il suggerimento che si sta utilizzando l’endpoint REST per il bucket è perché il messaggio di errore non sarebbe in XML se si stesse utilizzando l’endpoint del sito Web.

Creare una nuova origine per la distribuzione di CloudFront, come descritto, quindi modificare il comportamento per inviare richieste alla nuova origine, quindi inviare una richiesta di invalidazione della cache CloudFront per * e si dovrebbe essere impostato.

Guarda anche:

http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html#WebsiteRestEndpointDiff


¹ due punti finali. Tecnicamente, ci sono più di due, dal momento che tutti i bucket hanno almeno due nomi host di endpoint REST … ma ci sono due tipi di endpoint. I bucket dispongono anche di un endpoint di accelerazione del trasferimento che utilizza la rete di bordo AWS per trasferimenti più veloci / ottimizzati, in particolare da località geografiche più distanti dalla regione in cui viene fornito il bucket. Sembra https://example-bucket.s3-accelerate.amazonaws.com se lo si triggers e comporta un costo aggiuntivo in quanto si utilizza più della rete AWS e meno della rete pubblica … ma, è una differenza nella distribuzione dell’endpoint, non nel comportamento dell’endpoint. L’endpoint dell’accelerazione del trasferimento è ancora un endpoint REST, quindi, proprio come gli altri endpoint REST, non ha le funzionalità di hosting del sito web. Non vorresti configurare CloudFront per utilizzare l’endpoint di accelerazione, perché ciò non fornirebbe alcun miglioramento (CloudFront già utilizza la rete di bordo), ma ti verrà comunque addebitato il costo aggiuntivo per l’accelerazione.

Incontrato lo stesso problema e in che modo ho risolto che era in Impostazioni origine CloudFront impostare Nome dominio origine su .s3-website-us-west-2.amazonaws.com

In CloudFront Generate Settings assicurati di avere index.html come Default Root Object .

In S3 assicurati di avere Usa questo bucket per ospitare un sito web selezionato e imposta index.html come documento indice .

Ho avuto questo problema quando stavo cercando di includere il nome del bucket nel mio reindirizzamento route53 per un cliente, per renderlo più semplice ad esempio:

https://0832234.signin.aws.amazon.com/console/s3/?bucket=clientbucket.com

Facendo clic su “Tutti i bucket” e tornando nel bucket dei clienti / o rimuovendo il bucket dall’URL ha fatto il trucco, ora posso scaricare e aprire i file.