Amazon Cloudfront con S3. Accesso negato


92

Stiamo cercando di distribuire bucket S3 tramite Cloudfront ma per qualche motivo l'unica risposta è un documento XML AccessDenied come il seguente:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>89F25EB47DDA64D5</RequestId>
    <HostId>Z2xAduhEswbdBqTB/cgCggm/jVG24dPZjy1GScs9ak0w95rF4I0SnDnJrUKHHQC</HostId>
</Error>

Ecco le impostazioni che stiamo utilizzando:

Impostazioni di distribuzione Impostazioni di origine

Ed ecco la politica per il secchio

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity *********"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::x***-logos/*"
        }
    ]
}

Impostazioni comportamento cache - imgur.com/JBZqrRm
Jordan Adams

Assicurati che Cloudfront sia in grado di leggere dal bucket S3.
Nathan C

Come abiliterei o controllerei questo?
Jordan Adams,

Impostazioni dell'origine, ultima opzione. Guarda il tuo screenshot. :)
Nathan C

Penso di averlo provato prima e non ha funzionato, ma l'ho appena cambiato di nuovo ed è in procinto di distribuire. Aggiungerò la politica del bucket al mio post :)
Jordan Adams,

Risposte:


93

Se accedi alla radice della tua distribuzione CloudFront, devi impostare un oggetto radice predefinito: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

Per specificare un oggetto root predefinito utilizzando la console CloudFront:

  • Accedi alla Console di gestione AWS e apri la console Amazon CloudFront all'indirizzo https://console.aws.amazon.com/cloudfront/ .

  • Nell'elenco delle distribuzioni nel riquadro superiore, selezionare la distribuzione da aggiornare.

  • Nel riquadro Dettagli distribuzione , nella scheda Generale , fare clic su Modifica .

  • Nella finestra di dialogo Modifica distribuzione , nel campo Oggetto radice predefinito , immettere il nome file dell'oggetto radice predefinito.

    Immettere solo il nome dell'oggetto, ad esempio index.html. Non aggiungere un / prima del nome dell'oggetto.

  • Per salvare le modifiche, fare clic su Sì, Modifica .


Nel mio caso, questa impostazione non ha risolto il problema. Ricevo ancora errore Accesso negato
KurioZ7,

53

Ho appena avuto lo stesso problema e mentre la risposta di Kousha risolve il problema per index.html nel percorso di root, il mio problema era anche con le sottodirectory dato che ho usato quelle combinate con index.html per ottenere "pretty urls" (esempio .com / qualcosa / piuttosto che "brutto" esempio.com/something.html)

In parte è anche colpa di Amazon, perché quando configuri la distribuzione CloudFront, ti offrirà bucket S3 tra cui scegliere, ma se scegli uno di questi utilizzerà l'URL bucket anziché l'URL di hosting di siti Web statici come back-end.

Quindi, per risolvere il problema:

  • Abilita l'hosting di siti Web statici per il bucket
  • Impostare il documento Index (e forse Error ) in modo appropriato
  • Copia endpoint URL - si può trovare accanto alle impostazioni di cui sopra - Dovrebbe essere qualcosa di simile: <bucket.name> .s3-sito-<AWS-regione> .amazonaws.com
  • Usa quell'URL come origine della tua distribuzione CloudFront. (Ciò renderà inoltre non necessaria l' impostazione Root Object predefinito CF , ma non guasta comunque impostarla)

Risposta perfetta alla data di questo commento.
Sai Ramachandran,

Questo è stato anche per me. Avevo già un altro sito Web funzionante e pensavo di aver configurato il nuovo in modo identico. È così facile ignorarlo.
Günther Eberl,

È inoltre necessario aggiungere le autorizzazioni pubbliche GetObject e ListObjects al bucket.
Georges,

8

Ho avuto lo stesso problema di @Cezz, sebbene la soluzione non funzionasse nel mio caso.

Non appena l'hosting di siti Web statici è abilitato per il bucket, significa che gli utenti possono accedere al contenuto tramite l'URL Cloudfront o l'URL S3, che non è sempre desiderabile. Ad esempio, nel mio caso, la distribuzione Cloudfront è abilitata per SSL e gli utenti non dovrebbero essere in grado di accedervi tramite una connessione non SSL.

La soluzione che ho trovato è stata:

  • mantenere disabilitato l'hosting di siti Web statici sul bucket S3
  • mantenere l'origine della distribuzione di Cloudfront come ID S3
  • imposta "Limita accesso bucket" su "Sì" (e per semplicità, consenti a CloudFront di aggiornare automaticamente la policy bucket)
  • su "Pagine di errore", crea una risposta personalizzata e associa il codice di errore "403: proibito" alla pagina di risposta desiderata, ad esempio /index.html, con un codice di risposta di 200

Nota che nel mio caso, sto servendo un'applicazione javascript a pagina singola in cui tutti i percorsi sono risolti da index.html. Se hai percorsi che si risolvono in diversi oggetti nel tuo bucket S3, questo non funzionerà.


1
Grazie per la tua risposta. Questo ha funzionato per me. Ho avuto il tuo stesso problema. Non volevo che le persone accedessero al mio bucket S3, quindi dovevo limitare l'accesso a S3 Origin, che funziona solo quando si compila l'origine come suggerito dal completamento automatico in Cloudfront. Una nota a margine, tuttavia, non è necessario disabilitare l'hosting di siti Web statici. È sufficiente rimuovere semplicemente la policy bucket che consente l'accesso del pubblico.
Torsten,

Questo è stato davvero utile, il messaggio proibito proviene da S3 che all'inizio non avevo realizzato, quindi devi prenderlo con una pagina di errore personalizzata affinché la tua SPA funzioni.
Ivan,

4

Nel mio caso stavo usando più origini con "Path Pattern" Behaviors insieme a Origin Path nel mio bucket S3:

Installazione errata:

Comportamento CloudFront: /images/*->My-S3-origin

My-S3-origin: Percorso di origine: /images

File S3: /images/my-image.jpg

RICHIEDI Richiesta: /images/my-image.jpg -> 403

Quello che stava succedendo era che l'intera richiesta GET di CloudFront viene inviata all'origine: /image/my-image.jpgpreceduta da Percorso di origine :, /imagesquindi la richiesta in S3 sembra /images/images/my-image.jpgche non esista.

Soluzione

rimuove il percorso di origine.

Ciò mi ha permesso di accedere al bucket con un'identità di accesso all'origine e autorizzazioni bucket e autorizzazioni per singoli file limitate.


1

Nel mio caso avevo configurato erroneamente la Route 53. Avevo creato un alias sul mio dominio, ma l'ho puntato sul bucket S3 anziché sulla distribuzione CloudFront.

Inoltre ho omesso l'oggetto root predefinito. La console potrebbe davvero essere migliorata se aggiungessero un po 'di informazioni al testo del punto interrogativo sulle potenziali conseguenze dell'omissione.

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.