Diffusez du contenu statique dans un compartiment Amazon S3 via un VPC en utilisant Amazon CloudFront - Recommandations AWS

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Diffusez du contenu statique dans un compartiment Amazon S3 via un VPC en utilisant Amazon CloudFront

Créée par Angel Emmanuel Hernandez Cebrian

Environnement : PoC ou pilote

Technologies : diffusion de contenu ; mise en réseau ; sécurité, identité, conformité ; sans serveur ; applications Web et mobiles

Services AWS : Amazon CloudFront ; Elastic Load Balancing (ELB) ; AWS Lambda

Récapitulatif

Lorsque vous diffusez du contenu statique hébergé sur Amazon Web Services (AWS), l'approche recommandée consiste à utiliser un bucket Amazon Simple Storage Service (S3) comme origine et à utiliser CloudFront Amazon pour distribuer le contenu. Cette solution présente deux avantages principaux : la commodité de la mise en cache du contenu statique à des emplacements périphériques et la possibilité de définir des listes de contrôle d'accès Web (ACL Web) pour la CloudFront distribution, ce qui vous permet de sécuriser les demandes relatives au contenu avec un minimum de configuration et de frais administratifs.

Cependant, il existe une limite architecturale commune à l'approche standard recommandée. Dans certains environnements, vous souhaitez déployer des dispositifs de pare-feu virtuels dans un cloud privé virtuel (VPC) pour inspecter l'ensemble du contenu, y compris le contenu statique. L'approche standard n'achemine pas le trafic via le VPC à des fins d'inspection. Ce modèle fournit une solution architecturale alternative. Vous utilisez toujours une CloudFront distribution pour diffuser du contenu statique dans un compartiment S3, mais le trafic est acheminé via le VPC à l'aide d'un Application Load Balancer. Une fonction AWS Lambda récupère et renvoie ensuite le contenu du compartiment S3.

Conditions préalables et limitations

Prérequis

  • Un compte AWS actif.

  • Contenu de site Web statique hébergé dans un compartiment S3.

Limites

  • Les ressources de ce modèle doivent se trouver dans une seule région AWS, mais elles peuvent être mises en service dans différents comptes AWS.

  • Les limites s'appliquent à la taille maximale des demandes et des réponses que la fonction Lambda peut recevoir et envoyer, respectivement. Pour plus d'informations, consultez la section Limits des fonctions Lambda en tant que cibles (documentation Elastic Load Balancing).

  • Il est important de trouver un bon équilibre entre performances, évolutivité, sécurité et rentabilité lors de l'utilisation de cette approche. Malgré la grande évolutivité de Lambda, si le nombre d'appels Lambda simultanés dépasse le quota maximum, certaines demandes sont limitées. Pour plus d'informations, consultez les quotas Lambda (documentation Lambda). Vous devez également tenir compte de la tarification lorsque vous utilisez Lambda. Pour minimiser les appels Lambda, assurez-vous de définir correctement le cache pour la distribution. CloudFront Pour plus d'informations, consultez Optimisation de la mise en cache et de la disponibilité (CloudFront documentation).

Architecture

Pile technologique cible

  • CloudFront

  • Amazon Virtual Private Cloud (Amazon VPC)

  • Application Load Balancer

  • Lambda

  • Amazon S3

Architecture cible

L'image suivante montre l'architecture suggérée lorsque vous devez l'utiliser pour diffuser du contenu statique CloudFront à partir d'un compartiment S3 via un VPC.

Flux de trafic via les équilibreurs de charge d'application du VPC vers la fonction Lambda.
  1. Le client demande l'URL de CloudFront distribution pour obtenir un fichier de site Web spécifique dans le compartiment S3.

  2. CloudFront envoie la demande à AWS WAF. AWS WAF filtre la demande en utilisant les ACL Web appliquées à la distribution. CloudFront S'il est déterminé que la demande est valide, le flux continue. S'il est déterminé que la demande n'est pas valide, le client reçoit une erreur 403.

  3. CloudFront vérifie son cache interne. Si une clé valide correspond à la demande entrante, la valeur associée est renvoyée au client sous forme de réponse. Dans le cas contraire, le flux continue.

  4. CloudFront transmet la demande à l'URL de l'Application Load Balancer spécifié.

  5. L'Application Load Balancer possède un écouteur associé à un groupe cible basé sur une fonction Lambda. L'Application Load Balancer appelle la fonction Lambda.

  6. La fonction Lambda se connecte au compartiment S3, effectue une GetObject opération sur celui-ci et renvoie le contenu sous forme de réponse.

Automatisation et mise à l'échelle

Pour automatiser le déploiement de contenu statique à l'aide de cette approche, créez des pipelines CI/CD pour mettre à jour les compartiments Amazon S3 hébergeant des sites Web.

La fonction Lambda s'adapte automatiquement pour gérer les demandes simultanées, dans les limites des quotas et des limites du service. Pour plus d'informations, consultez la section Dimensionnement des fonctions Lambda et quotas Lambda (documentation Lambda). Pour les autres services et fonctionnalités AWS, tels que CloudFront l'Application Load Balancer, AWS les adapte automatiquement.

Outils

  • Amazon CloudFront accélère la diffusion de votre contenu Web en le diffusant via un réseau mondial de centres de données, ce qui réduit le temps de latence et améliore les performances.

  • Elastic Load Balancing (ELB) répartit le trafic applicatif ou réseau entrant sur plusieurs cibles. Dans ce modèle, vous utilisez un Application Load Balancer provisionné via Elastic Load Balancing pour diriger le trafic vers la fonction Lambda.

  • AWS Lambda est un service de calcul qui vous permet d'exécuter du code sans avoir à provisionner ou à gérer des serveurs. Il exécute votre code uniquement lorsque cela est nécessaire et évolue automatiquement, de sorte que vous ne payez que pour le temps de calcul que vous utilisez.

  • Amazon Simple Storage Service (Amazon S3) est un service de stockage d'objets basé sur le cloud qui vous permet de stocker, de protéger et de récupérer n'importe quel volume de données.

  • Amazon Virtual Private Cloud (Amazon VPC) vous aide à lancer des ressources AWS dans un réseau virtuel que vous avez défini. Ce réseau virtuel ressemble à un réseau traditionnel que vous exploiteriez dans votre propre centre de données, avec les avantages liés à l'utilisation de l'infrastructure évolutive d'AWS.

Épopées

TâcheDescriptionCompétences requises

Créez un VPC.

Créez un VPC pour héberger les ressources déployées selon ce modèle, telles que l'Application Load Balancer et la fonction Lambda.  Pour obtenir des instructions, consultez Create a VPC (documentation Amazon VPC).

Architecte du cloud

Créez une ACL Web AWS WAF.

Créez une ACL Web AWS WAF. Plus tard dans ce modèle, vous appliquerez cette ACL Web à la CloudFront distribution. Pour obtenir des instructions, consultez Création d'une ACL Web (documentation AWS WAF).

Architecte du cloud

Créez la fonction Lambda.

Créez la fonction Lambda qui diffuse le contenu statique hébergé dans le compartiment S3 sous forme de site Web. Utilisez le code fourni dans la section Informations supplémentaires de ce modèle. Personnalisez le code pour identifier votre compartiment S3 cible.

AWS général

Téléchargez la fonction Lambda.

Entrez la commande suivante pour télécharger le code de fonction Lambda dans une archive de fichiers .zip dans Lambda.

aws lambda update-function-code \ --function-name \ --zip-file fileb://lambda-alb-s3-website.zip
AWS général

Créez un Application Load Balancer.

Créez un Application Load Balancer connecté à Internet qui pointe vers la fonction Lambda. Pour obtenir des instructions, consultez la section Création d'un groupe cible pour la fonction Lambda (documentation Elastic Load Balancing). Pour une configuration à haute disponibilité, créez l'Application Load Balancer et associez-le à des sous-réseaux privés dans différentes zones de disponibilité.

Architecte du cloud

Créez une CloudFront distribution.

Créez une CloudFront distribution qui pointe vers l'Application Load Balancer que vous avez créé.

  1. Connectez-vous à l'AWS Management Console et ouvrez-la à l' CloudFront adresse https://console.aws.amazon.com/cloudfront/v3/home.

  2. Choisissez Create Distribution.

  3. Sur la première page de l’Assistant Assistant Créer une distribution, dans la section Web, choisissez Mise en route.

  4. Spécifiez les paramètres de votre distribution. Pour plus d'informations, voir Valeurs que vous spécifiez lorsque vous créez ou mettez à jour une distribution. Notez ce qui suit :

    1. Définissez l'Application Load Balancer comme origine.

    2. Dans les paramètres de distribution, choisissez les ACL Web existantes que vous souhaitez appliquer via AWS WAF. Pour plus d'informations, consultez l'ACL Web AWS WAF.

  5. Enregistrez vos modifications.

  6. Après avoir CloudFront créé votre distribution, la valeur de la colonne État de votre distribution passe InProgressde Déployé. Si vous avez choisi d’activer la distribution, elle est prête pour traiter les requêtes une fois que le statut est passé à Déployé.

Architecte du cloud

Ressources connexes

Documentation AWS

Sites Web des services AWS

Informations supplémentaires

Code

L'exemple de fonction Lambda suivant est écrit dans Node.js. Cette fonction Lambda agit comme un serveur Web qui exécute une GetObject opération sur un compartiment S3 contenant les ressources du site Web.

/** * This is an AWS Lambda function created for demonstration purposes. * It retrieves static assets from a defined Amazon S3 bucket. * To make the content available through a URL, use an Application Load Balancer with a Lambda integration. * * Set the S3_BUCKET environment variable in the Lambda function definition. */ var AWS = require('aws-sdk'); exports.handler = function(event, context, callback) { var bucket = process.env.S3_BUCKET; var key = event.path.replace('/', ''); if (key == '') { key = 'index.html'; } // Fetch from S3 var s3 = new AWS.S3(); return s3.getObject({Bucket: bucket, Key: key}, function(err, data) { if (err) { return err; } var isBase64Encoded = false; var encoding = 'utf8'; if (data.ContentType.indexOf('image/') > -1) { isBase64Encoded = true; encoding = 'base64' } var resp = { statusCode: 200, headers: { 'Content-Type': data.ContentType, }, body: new Buffer(data.Body).toString(encoding), isBase64Encoded: isBase64Encoded }; callback(null, resp); } ); };