Dans ce tutoriel nous allons voir comment autoriser l'accès public à un bucket AWS S3uniquement depuis CloudFront.
L'accès aux ressources S3 depuis une URL public étant tarifié, placer CloudFront en amont permet de bénéficier de la mise en cache de vos fichiers et donc de réduire les coûts de votre infrastructure.
Au delà de l'aspect économique, l'objectif principal est d'améliorer la sécurité de votre bucket S3.
Nous allons voir comment garder le paramètre Block all public access activé tout en permettant à vos visiteurs d'accéder aux fichiers public (images, css, js, etc.) de votre site web.
Création d'un OAC
Pour commencer, créons un OAC (Origin Access Control) pour votre distribution CloudFront.
Dans le tableau de bord AWS, allez dans : CloudFront puis sur votre gauche Security > Origin access.
Cliquez sur le boutton Create control settings
Le formulaire de création s'ouvre dans une popup.
Pour le champ nom mettez ce que vous voulez, personnellement j'aime bien utiliser le nom de domaine du bucket S3 concerné.
Pour le signing behavior, gardez l'option cochée par défaut : Sign requests (recommended)
Pareil pour l'origin type, gardez la valeur par défaut (S3).
Validez le formulaire pour finaliser la création de votre OAC.
Associer l'OAC à une origine CloudFront
Retournez dans la liste de vos distributions CloudFront.
Cliquez sur votre distribution, puis allez dans l'onglet Origins.
Créez une origine S3 (ou éditez celle existante), ensuite remplissez les champs :
Origin domain : le nom de domaine de votre bucket S3
Name : choisissez ce qui vous convient (personnellement j'utilise le nom de domaine du bucket)
Origin access : Origin access control settings (recommended)
Origin access control : Sélectionnez l'OAC que vous venez de créer
Une fois les champs remplis, cliquez sur le boutton Copy policy (2.) : il se trouve juste en dessous de Origin access control dans l'encadré en bleu.
Collez le contenu de votre presse papier quelque part (éditeur de texte par exemple), nous allons en avoir besoin d'ici peu.
Validez le formulaire.
Configurer les Behaviors CloudFront pour servir vos fichiers S3
Afin de servir les fichiers S3 depuis CloudFront, nous devons indiquer à CloudFront sous quelles conditions il doit le faire.
Cela se fait au grâce aux Behaviors (comportements), c'est en quelque sorte un ensemble de règles de routing pour CloudFront.
Par exemple, vous pouvez lui dire : pour toutes les URLs commençants par /static/ va me chercher les fichiers S3 de mon-bucket.s3.us-east-1.amazonaws.com
Ce qui permet d'utiliser votre propre nom de domaine :
Allez dans l'onglet Behaviors de votre distribution CloudFront.
Cliquez sur Create Behavior.
Remplissez le formulaire :
Path Pattern : mettez ce qui vous convient, par exemple si vous souhaitez servir toutes les URLs commençant par /static/ alors mettez static/* (sans slash au début)
Origin and origin groups : sélectionnez votre bucket S3
Ensuite choisissez les options qui vous conviennent
Validez le formulaire.
Paramétrer les permissions de votre bucket S3
Votre OAC a été créé et associé à une origine CloudFront.
Votre distribution CloudFront dispose de Behavior lui permettant de servir les fichiers S3 en réponses à des paths pattern.
Il convient désormais d'autoriser l'accès public à vos fichiers S3 depuis CloudFront grâce à une Policy.
En effet, vos fichiers sont pour le moment inaccessibles depuis votre navigateur (à moins d'avoir touché à l'option Block all public access, ce qui n'est pas recommandé dans ce tutoriel).
Et même en passant par CloudFront avec votre propre nom de domaine :
https://mon-site.com/static/css/main.css
Nous allons donc autoriser l'accès depuis CloudFront :
Dans le tableau de bord AWS, allez dans la liste des buckets S3 et cliquez sur celui concerné.
Allez dans l'onglet Permissions.
Assurez vous que l'option Blockallpublic access soit activée (On).
Dans la partie Bucket policy, cliquez sur Edit.
Ensuite, collez la Policy : celle que vous avez normalement stockée quelque part à la fin de la partie Associer l'OAC à une origine CloudFront.
Si vous avez oublié de la noter quelque part : pas de panique vous pouvez la retrouver au même endroit !
(vous pouvez même l'écrire manuellement en remplaçant les champs de l'exemple par ceux correspondant à vos paramètres, c'est juste un peu moins pratique).
https://mon-bucket.s3.us-east-1.amazonaws.com/static/css/main.css : ne devrait pas fonctionner*
*Ne devrait pas fonctionner en accès direct, sauf si on génère une URL signée comme c'est le cas dans le tableau de bord S3 par exemple (car vous êtes connecté en tant qu'admin, ce qui est normal)
L'important c'est que les URLs S3 publiques ne soient pas directement accessibles depuis un navigateur ou programmatiquement par des bots.