2015-12-03 13 views
14

Ho appena schierato un sito statico ad Amazon S3, che attualmente può essere vista qui: http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/CloudFront + S3 Sito web: "La chiave specificata non esiste" quando un documento indice implicito dovrebbe essere visualizzato

Se fare clic su uno dei link articolo, si noterà il seguente errore:

S3 Error

S3 si lamenta 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 si visita 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?

risposta

33

Uscirò su un arto e dirò che la chiave specificata non è 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 esempio 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; al contrario, si desidera configurarlo come origine "Personalizzata" e utilizzare il nome host dell'endpoint del sito Web fornito nella console S3 (ad esempio example-bucket.s3-website-us-east-1...) perché, in caso contrario, CloudFront presuppone che si desidera utilizzare l'endpoint REST per il bucket (che consente autenticazione e contenuto privato, che l'endpoint del sito Web non esegue).

Important

Do not select the name of your bucket from the list, for example, example.com.s3.amazonaws.com.

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

La documentazione è stata riscritta da quando la questione è stata inizialmente risposto, in modo che il messaggio mostrato sopra appare ora una pagina più avanti, ed è stato riformulato, ma il succo è lo stesso. Il "nome del secchio" sembra fare riferimento alle scelte mostrate nel menu a discesa, che non è quello che desideri.

Note

Be sure to specify the static website hosting endpoint, not the name of the 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 secchio è perché il messaggio di errore non sarebbe in XML se si stesse utilizzando il sito web endpoint.

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

Consulta anche:

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


¹ due punti finali. Tecnicamente, ce ne sono più di due, poiché tutti i bucket hanno almeno due nomi host degli endpoint REST ...ma sono presenti 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. Questo assomiglia a https://example-bucket.s3-accelerate.amazonaws.com se lo si attiva e comporta un costo di utilizzo aggiuntivo poiché si utilizza più rete AWS e meno Internet pubblico ... ma questa è una differenza nella distribuzione dell'endpoint, non il comportamento di l'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.

+1

Grazie! Questo è esattamente ciò che era il mio problema. È divertente perché in passato ho implementato numerosi siti in questo modo, e questo non è mai stato un problema - immagino che sia stata tutta una fortuna relativamente recente, dato che i miei siti erano principalmente pagine singole. Eh. – rdegges

+0

Ha senso. I siti a pagina singola funzionano correttamente se si esegue l'override dell'oggetto root nella configurazione di CloudFront, ma se index.html funziona altrove, o pagine di errore personalizzate o regole di reindirizzamento, è necessario l'endpoint del sito Web. –

+3

Sì! Grazie mille. Super utile. Spero che qualcun altro che fa questo stupido errore possa trovare utile anche la tua risposta =) – rdegges

6

Incontrato stesso problema e come come ho risolto era nel CloudFront Impostazioni Origine impostare Origine Domain Name-<website bucket>.s3-website-us-west-2.amazonaws.com

In CloudFront Generare Impostazioni assicurarsi di avere index.html come predefinito oggetto principale.

In S3 assicurarsi di avere Utilizzare questo secchio per ospitare un sito web selezionato e impostare index.html come documento di Indice.

+0

La soluzione per me era che qualcuno aveva impostato l'oggetto radice predefinito come "/ index.html" e non "index.html". –

+0

questa era la soluzione per me - grazie! –

Problemi correlati