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?
Pour répondre à votre question, j'ai recréé la situation via:
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é.
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).
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!
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:
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.
supprimer le chemin d'origine.