5

Questo è il mio primo post in Stackoverflow e ho cercato di cercare la risposta a un problema che sto avendo con CloudFront che serve la pagina del sito Web statico S3, per la precisione, personalizzato 404 pagina di errore. Spero che tu possa darmi una mano: =))AWS CloudFront Problema per file di errore personalizzato: Messaggio AccessDenied

Non sto usando alcun codice, semplicemente usando la console AWS come POC. Ecco lo scenario:

a) Ho creato due bucket. I nomi sono (ad esempio): mybucket.com e www.mybucket.com.

b) Ho inserito il mio sito statico (molto semplice) all'interno di mybucket.com e reindirizzare www.mybucket.com ad esso.

c) Il bucket del contenuto (mybucket.com) ha un file index.html, un file immagine. Ho creato una cartella sotto il secchio (chiamato errore) e inserito un file di messaggio di errore personalizzato chiamato 404error.html in esso.

d) Il file index.html chiama anche un semplice codice JavaScript che carica il contenuto di un altro file (welcome.html) da un altro bucket (resource.mybucket.com). Ho assicurato che bucket sia abilitato per CORS e che funzioni.

d) Il bucket ha un criterio bucket che consente a tutti l'accesso al bucket e ai suoi contenuti. Il polcy benna è mostrato sotto:

{ 
    "Id": "Policy1402570669260", 
    "Statement": [ 
     { 
      "Sid": "Stmt1402570667997", 
      "Action": [ 
       "s3:GetObject" 
      ], 
      "Effect": "Allow", 
      "Resource": "arn:aws:s3:::mybucket.com/*", 
      "Principal": { 
       "AWS": [ 
        "*" 
       ] 
      } 
     } 
    ] 
} 

e) Ho assicurato il www.mybucket.com e resource.mybucket.com ha anche la stessa politica.

f) mybucket.com è stato configurato per l'hosting di siti Web statici e il file di errore per mybucket.com è stato configurato come errore/404error.html.

c) Se accedo al sito utilizzando l'URL S3 (mybucket.com.s3-website-.amazonaws.com) e provo ad accedere a un file inesistente (ad esempio myfile.html), mostra correttamente il pagina di errore 404 personalizzata.

Il problema si presenta quando provo ad accedere alla pagina utilizzando la distribuzione CloudFront. Ho creato una distribuzione CloudFront sul secchio S3 (mybucket.com) e qui sono le proprietà ho impostato:

a) Errore pagina:

i) HTTP Error Code: 404-Not Found

ii) Caching Errore TTL: 300

iii) Personalizza risposta di errore: Si

iv) risposta Percorso pagina: /error/404error.html

v) HTTP R Codice esponse: OK

b) Un comportamento della cache separata è stata impostata così:

i) Percorso del modello:/error/*

ii) Limitare Access Viewer: No

sto mantenendo è molto semplice e standard. Non sto inoltrando cookie o query stringhe o utilizzando alcun URL firmato, ecc.

Una volta creata la distribuzione, quando provo ad accedere al sito con l'URL di CloudFront, la pagina principale funziona correttamente. Se provo a testare con una pagina inesistente, tuttavia, non sono servito con la pagina di errore 404 personalizzata che ho configurato. Invece, ottengo il seguente file XML nel browser (Chrome/Firefox -latest):

<Error> 
    <Code>AccessDenied</Code> 
    <Message>Access Denied</Message> 
    <RequestId>EB4CA7EC05512320</RequestId> 
    <HostId>some-really-big-alphanumeric-id</HostId> 
</Error> 

Nessun indizio è mostrato nella Console quando provo a ispezionare gli elementi dal browser.

Ora so che questo errore AccessDenied è stato segnalato e discusso in precedenza e ho provato ciò che più suggerisco: dando pieno accesso al bucket. Mi sono assicurato che (come puoi vedere dalla policy del bucket qui sopra, l'accesso è aperto a chiunque). Ho anche provato a garantire che all'ID di accesso originale sia stata data l'autorizzazione GetObject. Ho anche eliminato e ricreato la distribuzione di CloudFront e ho anche cancellato/ricaricato la cartella degli errori e il file 404error.html all'interno della cartella. Il file di errore è manualmente accessibile dall'URL CloudFront:

http://xxxxxxxx.cloudfront.net/error/404error.html

Ma non funziona se provo ad accedere a un file inesistente arbitrario:

http://xxxxxxxx.cloudfront.net/myfile.html

C'è qualcosa che mi manca qui?

Apprezzo molto il vostro aiuto.

saluti

risposta

0

ho avuto questi suggerimenti dal http://blog.celingest.com/en/2013/12/12/cloudfront-configuring-custom-error-pages/ e la tua domanda potrebbe anche essere legato alla https://serverfault.com/questions/642511/how-to-store-a-cloudfront-custom-error-page-in-s3/

  • È necessario un altro secchio S3 per ospitare le vostre pagine di errore
  • È necessario aggiungere un'altra origine CloudFront puntando al bucket in cui le pagine di errore sono
  • Il comportamento della cache dell'origine appena creata deve avere un Pattern percorso che punta alla cartella (nel bucket della pagina di errore) ere le pagine di errore risiedono
  • È quindi possibile utilizzare tale percorso nella risposta Percorso pagina quando si crea la configurazione personalizzata risposta di errore
4

Se si imposta un secchio (the-bucket) in modo rapido, è possibile configurarlo senza List autorizzazioni per Everyone. Ciò impedirà a CloudFront di determinare correttamente se una risorsa è 404.

Il tuo strumento di caricamento può caricare con autorizzazioni di lettura su ciascun oggetto, quindi non noterai questa mancanza di autorizzazioni.

Quindi, se si richiede <URL>/non-existent.html, CloudFront prova a leggere il bucket ad es.http://the-bucket.s3.amazonaws.com/non-existent.html

  • se le autorizzazioni della lista vengono concesse a tutti, un 404 viene restituito, e CloudFront può rimappare la richiesta come un 200 o di un costume 404
  • se le autorizzazioni di elenco non vengono concesse a tutti, un 403 viene restituito, e CloudFront restituisce l'403 all'utente finale (che è ciò che si vede nel registro).

Ha perfettamente senso, ma è abbastanza confuso!

3

Ecco una politica rudimentale per far funzionare il bucket S3 con le pagine di errore personalizzate di CloudFront.

{ 
"Version": "2012-10-17", 
"Statement": [ 
    { 
     "Action": [ 
      "s3:ListBucket" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::<yourBucket>", 
     "Principal": "*" 
    }, 
    { 
     "Action": [ 
      "s3:GetObject" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::<yourBucket>/*", 
     "Principal": "*" 
    } 
] 

}

Come Ben W già sottolineato, il trucco è quello di dare il permesso ListBucket. Senza di ciò si otterrà un errore di accesso negato.

Potrebbe anche essere utile ricordare che gli errori 5xx hanno senso solo se li si serve da un altro secchio rispetto al bucket in cui si trova il sito Web. Anche un errore 404 dovrebbe rispondere con un codice di errore 404, anche sulla pagina di errore personalizzata, e non solo improvvisamente trasformarsi in un codice 200. Lo stesso vale per gli altri codici di errore, ovviamente.