web-dev-qa-db-fra.com

Accès AWS CloudFront refusé au compartiment S3

J'essaie de configurer CloudFront pour servir des fichiers statiques hébergés dans mon S3 seau. J'ai une distribution de configuration mais j'obtiens AccessDenied lorsque j'essaie de naviguer vers le CSS (/CSS/stlyle.css) fichier dans le compartiment S3:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>E193C9CDF4319589</RequestId>
    <HostId>
xbU85maj87/jukYihXnADjXoa4j2AMLFx7t08vtWZ9SRVmU1Ijq6ry2RDAh4G1IGPIeZG9IbFZg=
    </HostId>
</Error>

J'ai défini ma distribution CloudFront sur mon compartiment S3 et créé un nouveau Origin Access Identity policy qui a été ajouté automatiquement au compartiment S3:

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

Ai-je manqué quelque chose?

Je veux que tous mes fichiers dans ce compartiment S3 soient servis via CloudFront ...

* MISE À JOUR *

Ce front de nuages ​​ guide dit:

Par défaut, votre compartiment Amazon S3 et tous les objets qu'il contient sont privés - seul le compte AWS qui a créé le compartiment est autorisé à lire ou à écrire les objets qu'il contient. Si vous souhaitez autoriser quiconque à accéder aux objets de votre compartiment Amazon S3 à l'aide des URL CloudFront, vous devez accorder des autorisations de lecture publiques aux objets. (C'est l'une des erreurs les plus courantes lorsque vous travaillez avec CloudFront et Amazon S3. Vous devez explicitement accorder des privilèges à chaque objet dans un compartiment Amazon S3.)

Sur cette base, j'ai ajouté de nouvelles autorisations à tous les objets du compartiment S3 pour Everyone Read/Download. Maintenant, je peux accéder aux fichiers.

Mais maintenant, quand j'accède au fichier comme https://d3u61axijg36on.cloudfront.net/css/style.css ceci est redirigé vers l'URI S3 et HTTP. Comment désactiver cela?

25
Primoz Rome

Pour répondre à votre question, j'ai recréé la situation via:

  • Créé un compartiment Amazon S3 sans stratégie de compartiment
  • Téléchargé public.jpg et le rendre public via "Rendre public"
  • Téléchargé private.jpg et gardé privé
  • Création d'une distribution Web Amazon CloudFront :
    • Nom de domaine d'origine: Sélection de mon compartiment S3 dans la liste
    • Restreindre l'accès au compartiment: Oui
    • Identité d'accès à l'origine: Créer une nouvelle identité
    • Accorder des autorisations de lecture sur le compartiment: Oui, mettre à jour la stratégie de compartiment

J'ai vérifié le compartiment, et CloudFront avait ajouté une stratégie de compartiment similaire au vôtre.

La distribution a été marquée comme In Progress pour un moment. Une fois qu'il a dit Enabled, j'ai accédé aux fichiers via le xxx.cloudfront.net URL:

  • xxx.cloudfront.net/public.jpg m'a redirigé vers l'URL S3 http://bucketname.s3.amazonaws.com/public.jpg. Oui, j'ai pu voir le fichier, mais il ne doit pas utiliser de redirection.
  • xxx.cloudfront.net/private.jpg m'a redirigé moi aussi, mais j'ai ensuite reçu Access Denied car il s'agit d'un fichier privé dans S3.

J'ai ensuite fait quelques recherche et j'ai trouvé que c'était assez courant. Certaines personnes utilisent une solution de contournement en pointant leur distribution CloudFront vers l'URL de site Web hébergé statique , mais cela a l'inconvénient de ne pas fonctionner avec l'origine Access Identity et je soupçonne également qu'il ne recevra pas la remise "Trafic S3 gratuit vers Edge".

J'ai donc attendu toute la nuit, l'ai testé ce matin et tout fonctionne bien .

Conclusion: Même si elle indique ENABLED, les choses peuvent prendre plusieurs heures (par exemple du jour au lendemain) pour se mettre en ordre. Il fonctionnera alors comme documenté.

35
John Rotenstein

Au lieu de choisir le compartiment s3 par défaut pour le nom de domaine d'origine, veuillez saisir <bucket-name>.s3-website.<region>.amazonaws.com comme nom de domaine d'origine (vous pouvez obtenir cette URL sur la propriété d'hébergement de site Web statique sous les propriétés du compartiment S3).

6
uday reddy

J'ai ajouté 'index.html' dans Default Root Object sous l'onglet Général de cloudFront "Paramètres de distribution" et cela a fonctionné pour moi. Comme index.html était le fichier racine de mon projet!

4
Zohab Ali

Dans mon cas, j'utilisais plusieurs origines avec des comportements de "modèle de chemin" ainsi qu'un chemin d'origine dans mon compartiment S3:

Mauvaise configuration:

Comportement CloudFront: /images/* -> My-S3-Origin

My-S3-Origin: Chemin d'origine: /images

Fichiers S3: /images/my-image.jpg

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

Ce qui se passait, c'est que l'intégralité de la demande GET CloudFront est envoyée à l'origine: /image/my-image.jpg préfixé par le chemin d'origine: /images, donc la requête dans S3 ressemble à /images/images/my-image.jpg qui n'existe pas.

Solution

supprimer le chemin d'origine.

2
Scott Jungwirth