Vraag Amazon Cloudfront met S3. Toegang geweigerd


We proberen S3-buckets via Cloudfront te distribueren, maar om de een of andere reden is het enige antwoord een AccessDenied XML-document zoals het volgende:

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

Dit zijn de instellingen die we gebruiken:

Distribution Settings Origin Settings

En hier is het beleid voor de emmer

{
    "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/*"
        }
    ]
}

71
2018-03-11 12:32


oorsprong


Cache Gedragsinstellingen - imgur.com/JBZqrRm - Jordan Adams
Zorg ervoor dat Cloudfront kan lezen vanuit de S3-bucket. - Nathan C
Hoe zou ik dit inschakelen of controleren? - Jordan Adams
Origin-instellingen, laatste optie. Bekijk je screenshot. :) - Nathan C
Ik denk dat ik dit eerder heb geprobeerd en het werkte niet, maar ik heb het net weer veranderd en het is bezig met distribueren. Ik voeg het beleid van de bucket toe aan mijn bericht :) - Jordan Adams


antwoorden:


Als u de hoofdmap van uw CloudFront-distributie opent, moet u een standaardrootobject instellen: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

Een standaardrootobject opgeven met de CloudFront-console:

  • Meld u aan bij de AWS Management Console en open de Amazon CloudFront-console op https://console.aws.amazon.com/cloudfront/.

  • Selecteer de distributie die moet worden bijgewerkt in de lijst met distributies in het bovenste deelvenster.

  • In de Deelvenster Distributiedetails, op de Algemeen tab, klik Bewerk.

  • In de Bewerk distributie dialoogvenster, in de Standaard hoofdobject veld, voer de bestandsnaam van het standaardrootobject in.

    Voer alleen de objectnaam in, bijvoorbeeld index.html. Voeg geen / voor de objectnaam toe.

  • Klik op om uw wijzigingen op te slaan Ja, bewerken.


66
2017-10-16 23:12





Ik heb net hetzelfde probleem gehad en terwijl het antwoord van Kousha het probleem wel oplost index.html in het root-pad was mijn probleem ook met submappen aangezien ik die gebruikt in combinatie met index.html om "pretty urls" te krijgen (example.com/something/ in plaats van "lelijk" example.com/something.html)

Gedeeltelijk is het ook de schuld van Amazon, want wanneer u CloudFront-distributie instelt, biedt het u S3-buckets om uit te kiezen, maar als u een van die buckets kiest, gebruikt het de URL van de bucket in plaats van de URL van de statische websitehost als een backend.

Dus om het probleem op te lossen:

  • Schakel statische webhosting voor de bucket in
  • Stel de Inhoudsopgave (en misschien Fout) dienovereenkomstig documenteren
  • Kopiëren Endpoint URL - je vindt het naast de bovenstaande instellingen - Het zou er ongeveer zo uit moeten zien: <Bucket.name> .s3-website- <AWS-regio> .amazonaws.com
  • Gebruik die URL als uw oorsprong van de CloudFront-distributie. (Dit maakt ook de CF Standaard hoofdobject instelling onnodig, maar doet geen kwaad om het toch in te stellen)

40
2018-05-11 14:01



Perfect antwoord vanaf de datum op deze opmerking. - Sai Ramachandran
Dat was het ook voor mij. Ik had al een andere website aan het werk en dacht dat ik de nieuwe op dezelfde manier had geconfigureerd. Zo gemakkelijk om dit over het hoofd te zien. - Günther Eberl
U moet ook openbare GetObject- en ListObjects-machtigingen aan de bucket toevoegen. - Georges


Ik had hetzelfde probleem als @Cezz, hoewel de oplossing in mijn geval niet zou werken.

Zodra statische webhosting is ingeschakeld voor de bucket, betekent dit dat gebruikers toegang tot de content kunnen krijgen via de Cloudfront-URL of de S3-URL, wat niet altijd wenselijk is. In mijn geval bijvoorbeeld, is de Cloudfront-distributie SSL-ingeschakeld en mogen gebruikers er geen toegang toe hebben via een niet-SSL-verbinding.

De oplossing die ik vond was om:

  • blijf statische website-hosting uitgeschakeld op de S3-bucket
  • bewaar de oorsprong van de cloudfrontdistributie als een S3-ID
  • stel "Beperk Bucket Access" in op "Ja" (en voor het gemak, laat CloudFront het bucket-beleid automatisch bijwerken)
  • op "Foutpagina's", maak een aangepast antwoord en wijs foutcode "403: Verboden" toe aan de gewenste reactiepagina, d.w.z. /index.html, met een responscode van 200

Houd er echter rekening mee dat ik in mijn geval een javascript-applicatie met één pagina bedien, waarbij alle paden worden opgelost door index.html. Als u paden heeft die naar verschillende objecten in uw S3-bucket worden omgezet, werkt dit niet.


7
2017-11-18 14:01



Bedankt voor je antwoord. Deze werkte voor mij. Ik had hetzelfde probleem als jij. Ik wilde niet dat mensen toegang kregen tot mijn S3-bucket, dus moest ik de toegang tot de S3 Origin beperken, wat alleen werkt wanneer je de oorsprong invult zoals wordt gesuggereerd door de auto-completering in Cloudfront. Een kanttekening echter, u hoeft de hosting van statische websites niet uit te schakelen. Eenvoudig het emmerbeleid verwijderen dat openbare toegang mogelijk maakt, is voldoende. - Torsten
Dit was erg handig, het verboden bericht komt van S3, wat ik in eerste instantie niet besefte, dus je moet dat vangen met een aangepaste foutpagina zodat je SPA werkt. - Ivan


In mijn geval gebruikte ik meerdere herkomsten met Gedragspatronen samen met een herkomstpad in mijn S3-bucket:

Slechte setup:

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

My-S3-oorsprong: Origin Path: /images

S3-bestanden: /images/my-image.jpg

GET-verzoek: /images/my-image.jpg -> 403

Wat er gebeurde, was dat het volledige CloudFront GET-verzoek naar de oorsprong werd verzonden: /image/my-image.jpg voorafgegaan door Origin Path: /images, zodat het verzoek in S3 eruit ziet /images/images/my-image.jpg wat niet bestaat.

Oplossing

Origin-pad verwijderen.

Hierdoor kon ik toegang krijgen tot de bucket met een Origin Access-identiteit en werden bucket-machtigingen en individuele bestandsrechten beperkt.


2
2017-11-08 01:10





In mijn geval had ik Route 53 verkeerd geconfigureerd. Ik had een alias in mijn domein gemaakt, maar deze naar de S3-bucket in plaats van de CloudFront-distributie verwezen.

Ook heb ik het standaard root-object weggelaten. De console kan echt worden verbeterd als ze een beetje informatie toevoegen aan de vraagtekentekst over de mogelijke gevolgen van het weglaten ervan.


0
2017-10-14 14:29