Dans le monde du Cloud Computing, le déploiement et la gestion efficaces des ressources web sont essentiels. Cet article se plonge dans la configuration d'un site web hébergé sur Amazon S3 (Simple Storage Service), servi via Amazon CloudFront, en utilisant Terraform, un outil populaire de Infrastructure as Code (IaC). Mais tout d'abord, décomposons les concepts fondamentaux.


Qu'est-ce que AWS ?

Amazon Web Services (AWS) est une plateforme cloud complète et largement adoptée qui propose plus de 200 services entièrement fonctionnels à partir de centres de données à l'échelle mondiale. AWS propose une variété de services, notamment des capacités de calcul, des options de stockage et des fonctionnalités de mise en réseau, qui contribuent tous à la flexibilité et à la scalabilité des ressources cloud.

 

Qu'est-ce qu'un Bucket S3 ?

Un bucket Amazon S3 est une ressource de stockage en Cloud public disponible dans le service AWS S3. Tout comme les dossiers de fichiers, les buckets sont utilisés pour stocker des objets, qui consistent en des données et des métadonnées descriptives. S3, réputé pour sa scalabilité et la disponibilité de ses données, est couramment utilisé pour la sauvegarde et la récupération, l'archivage de données et l'hébergement web.

 

Qu'est-ce que CloudFront ?

Amazon CloudFront est un service de réseau de diffusion de contenu (CDN) rapide qui distribue de manière sécurisée des données, des vidéos, des applications et des API aux clients du monde entier avec une latence réduite et une vitesse de transfert élevée. CloudFront fonctionne de manière transparente avec les services AWS, comme S3, pour accélérer la diffusion de contenu web statique et dynamique.

 

Qu'est-ce que Terraform ?

Terraform, développé par HashiCorp, est un outil logiciel d'Infrastructure as Code qui vous permet de créer, modifier et améliorer l'infrastructure de manière sûre et prévisible. Il gère les services cloud via des fichiers de configuration déclaratifs, ce qui en fait un outil essentiel pour l'infrastructure cloud moderne.

 

 

Le pouvoir de Terraform : comprendre les mécanismes essentiels

Terraform se distingue dans le domaine de l'IaC pour son approche unique de la gestion et de la provision des ressources. À sa base, Terraform fonctionne selon deux principes fondamentaux : l'idempotence et la gestion de state. Comprendre le fonctionnement de Terraform et le rôle du fichier "terraform.tfstate" est essentiel pour éxploiter sa puissance et ses capacités.

 

Comment fonctionne Terraform ? 

Terraform utilise une approche déclarative, où vous définissez l'état désiré de votre infrastructure dans des fichiers de configuration. Voici un bref aperçu de son fonctionnement :

  • Configuration : vous écrivez du code en HCL (HashiCorp Configuration Language) pour décrire l'état désiré de votre infrastructure.
  • Initialisation : en exécutant "terraform init", Terraform s'initialise en configurant les fournisseurs nécessaires.
  • Planification : "terraform plan" compare votre état désiré avec l'état réel et détaille un plan pour atteindre l'état désiré.
  • Application : "terraform apply" exécute le plan, effectuant les appels d'API nécessaires pour créer, mettre à jour ou supprimer des ressources.
  • Idempotence : ce processus est idempotent, ce qui signifie que réappliquer la même configuration ne provoquera pas de changements à moins que l'état désiré diffère de l'état actuel.

 

Gestion de state dans Terraform (terraform.tfstate)

Le fichier "terraform.tfstate" est central dans la manière dont Terraform suit l'état de votre infrastructure :

  • Fichier d'état : Terraform stocke l'état de votre infrastructure gérée et de votre configuration dans ce fichier. Cela inclut les métadonnées et l'état actuel de chaque ressource que Terraform gère.
  • But : le fichier d'état aide à mapper vos ressources réelles à votre configuration, à suivre les métadonnées et à améliorer les performances pour les grandes infrastructures.
  • Importance dans la planification : pendant la phase de planification, Terraform utilise ce fichier d'état pour déterminer les changements nécessaires pour atteindre l'état désiré.
  • Données sensibles : le fichier d'état peut contenir des données sensibles, il est donc crucial de le gérer de manière sécurisée, en utilisant généralement des back-ends d'état distants comme AWS S3 avec le chiffrement et le contrôle d'accès.

 

Idempotence, agnosticism et intégration

Avant de plonger dans le processus de déploiement, il est essentiel de comprendre les attributs uniques de Terraform qui en font un outil indispensable pour la gestion moderne de l'infrastructure, surtout dans notre contexte de déploiement d'un site web sur AWS.

 

Idempotence : une infrastructure fiable et cohérente

L'une des principales caractéristiques de Terraform est son idempotence, qui garantit que l'exécution de la même configuration plusieurs fois aboutit au même état, sans créer de modifications ou de duplications inutiles. Cette propriété est cruciale pour maintenir la cohérence et la fiabilité dans la gestion de l'infrastructure :

  • Lorsque vous appliquez une configuration Terraform, elle calcule et exécute uniquement ce qui est nécessaire pour atteindre l'état désiré.
  • Cela signifie que si vous ré-exécutez Terraform sans changer votre configuration, il n'effectuera aucune action, car l'infrastructure est déjà dans l'état désiré.

Agnosticism : multi-cloud et multi-service

Terraform est agnostique au cloud, ce qui signifie qu'il peut gérer des ressources sur plusieurs fournisseurs de services cloud, ainsi que sur une infrastructure on-premises :

  • Il fournit une manière unifiée d'interagir avec différents services cloud, d'AWS à Azure en passant par Google Cloud.
  • Cette agnosticisme rend Terraform incroyablement polyvalent pour les stratégies multi-cloud, réduisant ainsi le vendor lock-in et permettant des solutions d'infrastructure plus flexibles.

 

Puissant dans la gestion des changements

La capacité de Terraform à gérer et appliquer les changements de manière incrémentielle est particulièrement puissante. Dans le contexte du déploiement de notre site web :

  • Lorsque vous modifiez le fichier "index.html" ou tout autre fichier du site web, Terraform gère la mise à jour de manière efficace.
  • Il ne télécharge que les fichiers modifiés dans le bucket S3 et peut déclencher une invalidation du cache CloudFront, garantissant que les visiteurs de votre site web voient toujours le contenu le plus récent.

 

Intégration avec CI/CD

La véritable force de Terraform dans un environnement DevOps moderne réside dans sa compatibilité avec les pipelines d'intégration continue et de déploiement continu (CI/CD) :

  • Terraform peut être intégré dans les Workflows CI/CD, permettant le déploiement automatique et la gestion des modifications de l'infrastructure.
  • Cette intégration garantit que les mises à jour de l'infrastructure sont aussi simplifiées que les modifications de code, en accord avec les pratiques Agile.

 

 

Assurer la sécurité et l'efficacité dans les déploiements Terraform vers AWS

Avant de plonger dans les étapes du déploiement d'un site web avec Terraform sur AWS, nous devons établir une communication sécurisée et efficace entre Terraform et AWS. Ce processus garantit que Terraform peut gérer les ressources AWS de manière efficace tout en respectant les meilleures pratiques en matière de sécurité.

 

Configuration d'un utilisateur AWS sécurisé pour Terraform

Création d'un utilisateur IAM dédié

Pour commencer, il est crucial de créer un utilisateur dédié dans AWS Identity and Access Management (IAM) spécifiquement pour Terraform. Cet utilisateur, que nous pouvons nommer "tf_s3_cloudfront", aura des autorisations adaptées aux ressources que Terraform gérera :

  • La création d'un utilisateur IAM distinct pour Terraform aide à isoler les autorisations et à auditer les activités de Terraform séparément des autres utilisateurs et services.
  • Cette pratique est conforme au principe du moindre privilège, garantissant que l'utilisateur n'a pas plus d'autorisations que nécessaire pour effectuer les tâches prévues.

Configurer la politique IAM

La politique IAM pour "tf_s3_cloudfront" doit être aussi restrictive que possible tout en permettant à Terraform d'effectuer les actions nécessaires. En fonction de vos besoins, la politique devrait inclure des autorisations pour S3 et CloudFront :

 

Code 1-1

 

  • La permission "s3": permet à Terraform de gérer les buckets S3 préfixés par "random-jokes-".
  • La permission "cloudfront": permet à Terraform de gérer les distributions CloudFront.

 

Gérer les identifiants AWS de manière sécurisée

Après avoir configuré l'utilisateur IAM, la gestion sécurisée des identifiants AWS (ID de clé d'accès et clé d'accès secrète) est primordiale :

  • Ne jamais coder en dur les identifiants : évitez de coder en dur les identifiants AWS dans les fichiers Terraform ou tout code source. Exposer des identifiants peut entraîner des vulnérabilités de sécurité.
  • Utiliser des variables d'environnement ou des fichiers de configuration : stockez les identifiants AWS dans des variables d'environnement ou utilisez le fichier de configuration des identifiants AWS (~/.aws/credentials). Terraform détecte automatiquement les identifiants définis par ces méthodes.
  • Intégration dans les pipelines CI/CD : lors de l'intégration de Terraform avec des pipelines CI/CD, utilisez les fonctionnalités de stockage sécurisé de votre outil CI/CD pour gérer les identifiants AWS.

 

L'importance de la sécurité et du principe du moindre privilège

Respecter les meilleures pratiques en matière de sécurité et le principe du moindre privilège est crucial dans la gestion de l'infrastructure cloud :

  • Minimiser les risques de sécurité : les politiques IAM restrictives et la gestion sécurisée des identifiants minimisent les risques potentiels de sécurité et les accès non autorisés.
  • Conformité et audit : l'utilisation d'utilisateurs IAM dédiés et le suivi des meilleures pratiques en matière de sécurité contribuent à la conformité avec les normes de sécurité et facilitent les audits.

En suivant ces étapes, vous vous assurez que Terraform interagit avec AWS de manière sécurisée et efficace, ouvrant la voie au déploiement sûr et efficace de votre site web.

 

Avec des bases de sécurité solidement établies, nous pouvons maintenant passer aux étapes du déploiement d'un site web sur AWS en utilisant Terraform, en ayant la certitude que notre infrastructure est non seulement efficace, mais aussi sécurisée et conforme aux meilleures pratiques.

 

 

Déployer un site web sur AWS en utilisant Terraform

Maintenant, explorons les étapes pour télécharger un site web sur AWS S3 et le définir comme origine d'une distribution CloudFront en utilisant Terraform.

 

Etape 1 : Configuration de Terraform

Commencez par rédiger des fichiers de configuration Terraform qui définissent les ressources AWS requises. Cela implique de créer "main.tf", "variables.tf", "provider.tf" et d'autres fichiers de configuration nécessaires :

  • provider.tf : configure le fournisseur AWS avec les identifiants et la région nécessaires.
  • variables.tf : définit des variables telles que la région AWS, le nom du bucket S3 et les paramètres CloudFront.
  • main.tf : contient la logique principale pour la création et la configuration des ressources AWS telles que les buckets S3, les distributions CloudFront, et plus encore.
  • output.tf : ce fichier spécifie les valeurs de sortie que Terraform rapportera à l'utilisateur. Ces sorties peuvent être cruciales pour comprendre les résultats de la configuration, tels que les URL, les ID ou d'autres données importantes.

 

Etape 2 : Création d'un bucket S3

Définissez un bucket S3 dans Terraform pour stocker les fichiers de votre site web. Activez l'hébergement de site web sur le bucket et configurez les paramètres d'accès public selon vos besoins.

 

Code 2-1

 

Etape 3 : Configuration du site web sur S3

Téléchargez les fichiers statiques de votre site web (par exemple, HTML, CSS, JavaScript) dans le bucket S3 en utilisant la ressource "aws_s3_object". Cette étape implique de spécifier le chemin du fichier et de s'assurer que le type de contenu correct est défini.

 

Code 3-1

 

Etape 4 : Configuration de CloudFront

Créez une distribution CloudFront avec votre bucket S3 comme origine. Cela implique de définir une ressource de distribution CloudFront, de configurer l'identité d'accès à l'origine (OAI) et de définir les comportements de mise en cache.

 

Code 4-1

Code 5-1

 

Etape 5 : Mise en oeuvre de l'invalidation du cache

Mettez en œuvre l'invalidation du cache pour garantir que les mises à jour de votre site web sont reflétées rapidement. Vous pouvez réaliser cela en utilisant une ressource "null_resource" avec un provisioner "local-exec" dans Terraform.

 

Code 6-1

 

Après avoir exploré la mise en œuvre de la configuration principale, montrons le rôle des variables dans Terraform.

Les variables dans Terraform agissent comme des paramètres personnalisables, rendant nos configurations d'infrastructure plus adaptables et plus faciles à modifier. Définies dans le fichier "variables.tf", ces variables peuvent être attribuées et modifiées sans changer la logique principale de nos scripts Terraform.

 

Code 7-1

 

En exploitant ces variables, nous pouvons facilement personnaliser nos ressources AWS, telles que la spécification de la région pour notre distribution CloudFront ou la définition d'un préfixe pour les noms de nos buckets S3.    

 

 

Déployer un site web sur AWS en utilisant Terraform

Dans notre démonstration ici, l'accent principal est mis sur le déploiement du fichier "index.html", qui sert de point d'entrée pour notre site web statique hébergé sur AWS S3 et distribué via CloudFront. Comprendre la structure et les meilleures pratiques derrière cette configuration est crucial.

 

Compréhension de index.html et de son rôle :
  • Au cœur du site web : le fichier index.html est essentiellement la page d'accueil ou l'interface principale de votre site web statique. Il contient la structure HTML et est généralement le premier fichier chargé lorsque quelqu'un visite votre site.
  • Contenu et structure : ce fichier peut inclure des références à d'autres ressources telles que CSS pour le style, JavaScript pour l'interactivité et du contenu multimédia, formant le cœur de l'interface utilisateur du site web.

 

Analyse détaillée du code index.html :

Le "index.html" fourni est une page web bien structurée conçue pour afficher des "blagues aléatoires". Décortiquons ses principaux composants.

 

Code 8-1

Code 9-1

 

Structure HTML :

  • <!DOCTYPE html> : cette déclaration définit le type de document et la version HTML, indiquant que le document est un document HTML5.
  • <html lang="en"> : l'élément racine du document HTML, avec lang="en" spécifiant que la langue principale est l'anglais.


Section <head> :

  • <head> : contient les métadonnées sur le document, les liens vers les feuilles de style et le titre. <meta charset="UTF-8"> : spécifie l'encodage des caractères pour le document HTML.
  • <meta name="viewport" content="width=device-width, initial-scale=1.0"> : assure que la page est responsive et s'affiche bien sur tous les appareils.
  • <title>Random Jokes</title> : définit le titre de la page web, affiché dans la barre de titre ou l'onglet du navigateur.

 

Styles CSS internes :

<style> : contient les styles CSS utilisés pour styliser le contenu HTML. Cela comprend :

  • l'importation d'une police depuis Google Fonts.
  • la mise en forme pour le corps, le conteneur de blague, le texte de la blague et le bouton.
  • le style du corps définit la couleur de fond, la police et centre le contenu.
  • le style du bouton change au survol pour améliorer l'interaction utilisateur.

 

Section <body> :

  • <body> : définit le corps du document et contient tout le contenu du document, tel que du texte, des liens hypertexte, des images, des tableaux, des listes, etc.
  • <div id="joke-container"> : un conteneur qui contient la blague et le bouton.
  • <div id="joke"> : affiche le texte de la blague.
  • <button id="next-joke-btn"> : un bouton pour charger la prochaine blague.

 

JavaScript pour le contenu dynamique :

<script> : inclut du JavaScript pour rendre la page interactive.
  • Un écouteur d'événements est attaché au bouton "Next Joke".
  • La fonction "fetchJoke" récupère une blague aléatoire depuis une API et met à jour le texte de la blague sur la page.
  • Une gestion des erreurs est incluse pour afficher un message si la récupération de la blague échoue.

 

Ce fichier "index.html" est un excellent exemple d'une page web simple mais interactive. Il combine la structure HTML, le style CSS et la fonctionnalité JavaScript pour créer une expérience conviviale où les visiteurs peuvent profiter d'une nouvelle blague à chaque clic sur le bouton. L'utilisation d'API externes pour le contenu dynamique et les principes de conception responsive en font une page web moderne et attrayante.

Dans notre configuration Terraform, ce fichier est placé stratégiquement dans le répertoire "static/html" pour maintenir notre projet organisé et rationaliser le processus de déploiement vers AWS S3 et CloudFront.

 

Bonnes pratiques : organisation du fichier index.html 

Nous plaçons le fichier "index.html" à l'intérieur du répertoire "static/html". Cette structure est une bonne pratique pour plusieurs raisons :

  • Clarté et organisation : elle sépare clairement le contenu statique (comme les fichiers HTML, CSS, JavaScript) des autres parties du code d'infrastructure, ce qui rend le projet plus organisé et plus facile à naviguer.
  • Scalabilité : à mesure que votre site web s'agrandit pour inclure plus de pages et de ressources, cette structure organisée devient de plus en plus bénéfique.
  • Sécurité : conserver le contenu statique dans un répertoire spécifique aide à mettre en œuvre plus efficacement des pratiques de sécurité, telles que les permissions d'accès.

 

Le rôle de Terraform dans le déploiement de index.html

En utilisant Terraform, nous automatisons le déploiement du fichier "index.html" dans le bucket S3. Voici un extrait de la configuration Terraform qui accomplit cela :

 

Code 10-1

 

  • Téléchargement automatisé : Terraform télécharge automatiquement le fichier "index.html" depuis le répertoire local "static/html" vers le bucket S3 spécifié.
  • Gestion de contenu dynamique : les modifications apportées au fichier "index.html" peuvent être facilement déployées en relançant Terraform, garantissant que la dernière version de votre site est toujours disponible.

 

Guide visuel : exécution des commandes Terraform

1.Exécution de "terraform init" : initialisation de Terraform pour télécharger les plugins nécessaires et configurer l'environnement.

 

Code 11-1

 

2.Exécution de "terraform plan" : présentation des modifications que Terraform apportera à votre infrastructure AWS.

 

Code 12-1

Code 13-1

 

Interprétation de la sortie du plan Terraform

Une étape critique consiste à exécuter "terraform plan". Cette commande fournit un aperçu des actions que Terraform effectuera lors de l'application de votre configuration. Décortiquons une sortie typique que vous pourriez rencontrer.


Plan : 10 à ajouter, 0 à modifier, 0 à détruire

Cette sortie peut être décomposée comme suit :

  • 10 à ajouter : Terraform a identifié 10 ressources qui doivent être créées pour correspondre à votre état désiré. Il peut s'agir de nouvelles ressources AWS telles que des buckets S3, des distributions CloudFront, des rôles IAM, etc.
  • 0 à modifier : il n'y a pas de ressources existantes qui doivent être mises à jour. Si Terraform avait détecté des divergences entre votre configuration et l'état actuel des ressources, ce nombre refléterait le nombre de ressources à modifier.
  • 0 à détruire : aucune ressource n'est prévue pour être supprimée. Si vous supprimez une ressource de votre configuration ou apportez des modifications nécessitant le remplacement de ressources existantes, ce nombre indique combien de ressources seront détruites et potentiellement recréées.


L'importance de la sortie du plan

  • Révision et confirmation : la sortie du plan vous permet de revoir et de confirmer les modifications avant leur application. Cette étape est cruciale pour éviter toute modification non intentionnelle de votre infrastructure.
  • Sécurité et visibilité : cela fournit un mécanisme de sécurité en vous donnant une visibilité sur la façon dont votre infrastructure va changer sans apporter de modifications immédiates.
  • Audit et documentation : cette sortie peut être utilisée à des fins d'audit et comme documentation des modifications apportées à votre infrastructure.

 

3 .En utilisant "terraform apply" : appliquer les changements pour déployer "index.html" dans le bucket S3 et configurer CloudFront.

 

Code 14-1

Code 15-1

 

 

Comprendre la sortie de Terraform et les test dans le navigateur

Après avoir exécuté "terraform apply", Terraform fournit des variables de sortie qui donnent des informations importantes sur les ressources qu'il a créées ou modifiées. Décortiquons la sortie de notre exécution Terraform et comprenons comment tester notre site web dans un navigateur.

 

La sortie de Terraform détaillée :

Code 16-1

 

  • cloudfront_distribution_domain : il s'agit du nom de domaine assigné à votre distribution CloudFront. C'est via cette URL que les utilisateurs accéderont à votre site web. CloudFront agit comme un réseau de diffusion de contenu pour servir efficacement votre site web aux utilisateurs depuis des emplacements mondiaux.
  • s3_bucket_name : le nom du bucket S3 où les fichiers de votre site web sont stockés. Ce nom de bucket est généré dynamiquement en utilisant une combinaison d'un préfixe spécifié et d'une chaîne aléatoire pour l'unicité.
  • s3_bucket_url : l'URL directe pour accéder au bucket S3. Bien que utile pour un accès direct, généralement, vous utiliserez l'URL CloudFront pour un accès public afin de profiter de la mise en cache CDN et de la distribution.

 

Tester le site web dans un navigateur
  • Accès via CloudFront : ouvrez un navigateur web et accédez à http://d2ajbha7qpdos6.cloudfront.net. Cette URL devrait charger votre site web, servant le fichier "index.html" à partir du bucket S3 via CloudFront.
  • Accès via l'URL du bucket S3 : vous pouvez également accéder au site web directement via l'URL du bucket S3 (http://random-jokes-ezld0h.s3-website.eu-central-1.amazonaws.com). Cependant, cette méthode d'accès ne bénéficie pas du réseau de distribution de CloudFront.

Code 17-1

Code 18-1

 

Aussi, comme vous pouvez le constater, nous ne pouvons pas accéder à l'URL du bucket S3. Intentionnellement, elle est bloquée pour le monde extérieur et vous recevrez un message "accès refusé". Dans notre code, seul CloudFront peut accéder au contenu du S3 en tant qu'origine.

 

Code 19-1

 

Démonstration de la mise à jour dynamique du contenu 

Voyons comment les mises à jour de votre site web sont gérées :

  • Mettez à jour index.html : apportez une modification à votre fichier "index.html" dans le répertoire "static/html".
  • Réappliquez la configuration Terraform : exécutez à nouveau "terraform apply". Terraform téléchargera le fichier "index.html" mis à jour dans votre bucket S3.
  • Invalidation du cache : Terraform effectuera également une invalidation du cache dans CloudFront, garantissant que le contenu mis à jour est servi aux utilisateurs.
  • Vérifiez la mise à jour : actualisez l'URL de la distribution CloudFront dans votre navigateur. Vous devriez voir les modifications reflétées, démontrant l'efficacité de Terraform dans la gestion et le déploiement des mises à jour du site web.

Pour illustrer cela, je vais modifier le "index.html" en ajoutant des points d'exclamation à côté du texte du bouton "Next Joke".

 

Code 20-1

 

Comme vous pouvez le constater, nous pouvons voir le changement après avoir utilisé la commande "terraform apply" dans la sortie. De plus, Terraform gère lui-même l'invalidation du cache pour voir notre modification dans le navigateur :

 

Code 21-1

Code 22-1

 

 

Utilisation du code

Si vous souhaitez essayer ce projet d'IaC vous-même, vous pouvez accéder au code Terraform complet sur mon GitHub. Il vous suffit de cloner le projet et de suivre les instructions dans le fichier README.md pour configurer votre propre site web statique sur AWS S3 avec CloudFront.

En utilisant ce projet comme point de départ, vous pouvez déployer et gérer rapidement vos sites web statiques sur AWS avec Terraform. N'oubliez pas de passer en revue et d'adapter le code à vos besoins spécifiques.

Bon développement !

 

 

Conclusion

Alors que le Cloud Computing continue d'évoluer, des outils comme Terraform deviennent indispensables pour les développeurs et les ingénieurs. Ils simplifient non seulement les complexités associées à l'infrastructure cloud, mais garantissent également que ces infrastructures sont robustes, sécurisées et agiles. Ce guide témoigne des capacités de Terraform, offrant un modèle pour un hébergement web cloud efficace et sécurisé.

 

Que vous soyez un professionnel du cloud expérimenté ou nouveau dans l'infrastructure cloud, les idées et les pratiques décrites dans cet article offrent des connaissances précieuses pour tirer pleinement parti d'AWS et de Terraform. Le parcours, de la configuration d'un utilisateur AWS avec des politiques IAM spécifiques à la visualisation d'un site web en direct, met en évidence le pouvoir transformateur de la combinaison des services AWS avec le processus d'automatisation de Terraform.

 

Alors que nous envisageons les progrès futurs dans la technologie cloud, l'intégration de ces outils et principes jouera sans aucun doute un rôle clé dans la définition de paysages numériques efficaces, sécurisés et évolutifs.

Partager cet article