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

AWSservices : 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 (WebACLs) 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 que des dispositifs de pare-feu virtuels soient déployés 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 à des VPC 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 à l'aide VPC 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 AWS région, mais elles peuvent être provisionnées dans différents AWS comptes.

  • 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 (AmazonVPC)

  • Application Load Balancer

  • Lambda

  • Amazon S3

Architecture cible

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

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

  2. CloudFront envoie la demande à AWSWAF. AWSWAFfiltre la demande en utilisant le Web ACLs appliqué à la CloudFront distribution. 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 à URL 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 AWS services et fonctionnalités, tels que CloudFront l'Application Load Balancer, les AWS 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 la latence et améliore les performances.

  • Elastic Load Balancing (ELB) distribue 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.

  • AWSLambda est un service de calcul qui vous permet d'exécuter du code sans avoir à approvisionner 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 (AmazonVPC) vous aide à lancer AWS des ressources 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 de l'utilisation de l'infrastructure évolutive deAWS.

Épopées

TâcheDescriptionCompétences requises

Créez unVPC.

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 (VPCdocumentation Amazon).

Architecte du cloud

Créez un AWS WAF site WebACL.

Créez un AWS WAF site WebACL. Plus tard dans ce modèle, vous appliquerez ce site Web ACL à la CloudFront distribution. Pour obtenir des instructions, voir Création d'un site Web ACL (AWSWAFdocumentation).

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.

Général AWS

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
Général AWS

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 à la console AWS de gestion et ouvrez-la sur CloudFront 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 le site Web existant via ACLs lequel vous souhaitez postuler AWSWAF. Pour plus d'informations, consultez le AWSWAFsite Web ACL.

  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

AWSdocumentation

AWSsites Web de services

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); } ); };