158 votes

Amazon Cloudfront avec S3. Accès refusé

Nous essayons de distribuer nos seaux S3 via Cloudfront mais pour une raison quelconque, la seule réponse est un document JSON "Accès refusé" comme suit:

    AccessDenied
    Access Denied
    89F25EB47DDA64D5
    Z2xAduhEswbdBqTB/cgCggm/jVG24dPZjy1GScs9ak0w95rF4I0SnDnJrUKHHQC

Voici les paramètres que nous utilisons:

Distribution SettingsOrigin Settings

Et voici la politique pour le seau

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

0 votes

Paramètres de comportement du cache - imgur.com/JBZqrRm

0 votes

S'assurer que Cloudfront peut lire depuis le bucket S3.

0 votes

Comment pourrais-je activer ou vérifier ceci?

178voto

Jesper Points 81

Si vous accédez à la racine de votre distribution CloudFront, vous devez définir un objet racine par défaut : http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

Pour spécifier un objet racine par défaut en utilisant la console CloudFront :

  • Connectez-vous à la console de gestion AWS et ouvrez la console Amazon CloudFront à l'adresse https://console.aws.amazon.com/cloudfront/.

  • Dans la liste des distributions dans le volet supérieur, sélectionnez la distribution à mettre à jour.

  • Dans le volet Détails de la distribution, sur l'onglet Général, cliquez sur Modifier.

  • Dans la boîte de dialogue Modifier la distribution, dans le champ Objet racine par défaut, saisissez le nom du fichier de l'objet racine par défaut.

    Saisissez uniquement le nom de l'objet, par exemple, index.html. Ne pas mettre de / avant le nom de l'objet.

  • Pour enregistrer vos modifications, cliquez sur Oui, Modifier.

9 votes

Dans mon cas, ce paramétrage n'a pas résolu le problème. Je continue à recevoir une erreur d'accès refusé.

4 votes

Oh mon dieu, pourquoi est-ce que cela ne figure pas dans toutes les réponses de connaissances aws entourant ce sujet! Merci

1 votes

Pour moi, la configuration du Domaine Alternatif devait être définie sur mon nom de domaine dans la configuration de CloudFront pour résoudre ce problème.

99voto

Miroslav Points 1051

Je viens d'avoir le même problème et bien que la réponse de Kousha résolve le problème pour index.html dans le chemin racine, mon problème était également avec les sous-répertoires car j'utilisais ceux-ci combinés avec index.html pour obtenir des "jolis urls" (example.com/something/ au lieu de "moche" example.com/something.html)

Partiellement, c'est aussi la faute d'Amazon, car lorsque vous configurez une distribution CloudFront, il vous proposera des buckets S3 à choisir, mais si vous en choisissez un, il utilisera l'URL du bucket plutôt que l'URL d'hébergement du site statique en tant que backend.

Donc pour résoudre le problème :

  • Activez l'hébergement de site web statique pour le bucket
  • Définissez le document Index (et peut-être Error) correctement
  • Copiez l'URL Endpoint - vous pouvez le trouver à côté des paramètres ci-dessus - Elle devrait ressembler à quelque chose comme : .s3-website-.amazonaws.com
  • Utilisez cette URL comme origine de la distribution CloudFront. (Cela rendra également le paramètre de Default Root Object de CF inutile, mais cela ne fait pas de mal de le définir de toute façon)

MISE À JOUR Jan '22 : vous pouvez également résoudre ce problème en laissant l'hébergement statique INACTIF et en ajoutant une fonction CloudFront pour ajouter index.html. Voir ce post sur SO pour plus d'informations. Cela vous permet d'utiliser un OAI et de garder le bucket privé.

0 votes

Réponse parfaite à la date de ce commentaire.

0 votes

C'était la même chose pour moi aussi. J'avais déjà un autre site web en fonctionnement et je pensais avoir configuré le nouveau de manière identique. Tellement facile de ne pas le remarquer.

0 votes

Vous devez également ajouter les autorisations GetObject public et ListObjects au compartiment.

19voto

Jonny Green Points 271

J'ai eu le même problème que @Cezz, bien que la solution ne fonctionnerait pas dans mon cas.

Dès que l'hébergement de site Web statique est activé pour le bucket, cela signifie que les utilisateurs peuvent accéder au contenu soit via l'URL Cloudfront, soit via l'URL S3, ce qui n'est pas toujours souhaitable. Par exemple, dans mon cas, la distribution Cloudfront est SSL activé, et les utilisateurs ne devraient pas pouvoir y accéder via une connexion non-SSL.

La solution que j'ai trouvée était de :

  • garder l'hébergement de site Web statique désactivé sur le bucket S3
  • garder l'origine de la distribution Cloudfront comme un ID S3
  • définir "Restrict Bucket Access" sur "Oui" (et pour plus de facilité, autoriser CloudFront à mettre à jour automatiquement la stratégie du bucket)
  • dans "Error Pages", créer une réponse personnalisée, et mapper le code d'erreur "403: Interdit" à la page de réponse souhaitée, c'est-à-dire /index.html, avec un code de réponse de 200

Notez cependant que dans mon cas, je sers une application JavaScript d'une seule page où tous les chemins sont résolus par index.html. Si vous avez des chemins qui se résolvent à différents objets dans votre bucket S3, cela ne fonctionnera pas.

1 votes

Merci pour votre réponse. Celui-ci a fonctionné pour moi. J'avais le même problème que vous. Je ne voulais pas que les gens accèdent à mon bucket S3, donc j'ai dû restreindre l'accès à l'origine S3, ce qui ne fonctionne que lorsque vous remplissez l'origine comme suggéré par l'auto-complétion dans Cloudfront. Un petit détail cependant, vous n'avez pas besoin de désactiver l'hébergement de site Web statique. Il suffit de supprimer la stratégie de bucket qui autorise l'accès public.

0 votes

Cela a été vraiment utile, le message d'erreur vient de S3 ce que je n'avais pas réalisé au départ, donc vous devez le gérer avec une page d'erreur personnalisée pour que votre SPA fonctionne.

0 votes

Cela fonctionne pour les spas (par exemple des applications react) sans exposer le compartiment s3. Merci.

12voto

Sam Points 11

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

Mauvaise configuration :

Comportement CloudFront : /images/* -> Mon-origine-S3

Mon-origine-S3 : Chemin d'origine : /images

Fichiers S3 : /images/my-image.jpg

Requête GET : /images/my-image.jpg -> 403

Ce qui se passait, c'est que la requête GET entière de CloudFront était envoyée à l'origine : /image/my-image.jpg précédée du chemin d'origine : /images, donc la requête vers S3 ressemblait à /images/images/my-image.jpg qui n'existe pas.

Solution

Supprimer le chemin d'origine.

Cela m'a permis d'accéder au compartiment avec une identité d'accès à l'origine et des autorisations de compartiment et des autorisations de fichier individuelles restreintes.

0 votes

Sur une note connexe, j'avais une distribution CloudFront avec deux origines : paramétrer CloudFront vers /video/* -> Mon-S3-

1voto

toon81 Points 111

Dans mon cas, j'avais configuré Route 53 de manière incorrecte. J'avais créé un Alias sur mon domaine mais je l'avais pointé vers le compartiment S3 au lieu de la distribution CloudFront.

De plus, j'avais omis l'objet racine par défaut. La console pourrait vraiment être améliorée si elle ajoutait un peu d'information au texte du point d'interrogation sur les conséquences potentielles de son omission.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X