

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.

# AWS Infrastructure de test à l'aide LocalStack de tests Terraform
<a name="test-aws-infra-localstack-terraform"></a>

*Ivan Girardi et Ioannis Kalyvas, Amazon Web Services*

## Résumé
<a name="test-aws-infra-localstack-terraform-summary"></a>

Ce modèle vous permet de tester localement l'infrastructure sous forme de code (IaC) pour AWS Terraform sans avoir à provisionner l'infrastructure dans votre AWS environnement. Il intègre le [framework Terraform Tests](https://developer.hashicorp.com/terraform/language/tests) à. [LocalStack](https://github.com/localstack/localstack) Le conteneur LocalStack Docker fournit un environnement de développement local qui émule divers. Services AWS Cela vous permet de tester et d'itérer les déploiements d'infrastructure sans encourir de coûts. AWS Cloud

Cette solution offre les avantages suivants :
+ **Optimisation des coûts — L'**exécution de tests permet d' LocalStack éliminer le besoin d'utilisation Services AWS. Cela vous évite d'encourir les coûts associés à la création, à l'exploitation et à la modification de ces AWS ressources.
+ **Rapidité et efficacité** — Les tests locaux sont également généralement plus rapides que le déploiement AWS des ressources. Cette boucle de rétroaction rapide accélère le développement et le débogage. Comme il LocalStack s'exécute localement, vous pouvez développer et tester vos fichiers de configuration Terraform sans connexion Internet. Vous pouvez déboguer les fichiers de configuration Terraform localement et recevoir des commentaires immédiats, ce qui rationalise le processus de développement.
+ **Cohérence et reproductibilité** : LocalStack fournit un environnement de test cohérent. Cette cohérence permet de garantir que les tests donnent les mêmes résultats, quels que soient les AWS changements externes ou les problèmes de réseau.
+ **Isolation** : les tests vous LocalStack évitent d'affecter accidentellement les AWS ressources réelles ou les environnements de production. Cette isolation permet d'expérimenter et de tester différentes configurations en toute sécurité.
+ **Automatisation** [— L'intégration à un pipeline d'intégration continue et de livraison continue (CI/CD) vous permet de tester automatiquement les fichiers de configuration Terraform.](https://developer.hashicorp.com/terraform/language/files) Le pipeline teste minutieusement l'iAc avant le déploiement.
+ **Flexibilité** — Vous pouvez simuler différentes Régions AWS configurations et configurations de service pour mieux correspondre à vos environnements de production. Comptes AWS

## Conditions préalables et limitations
<a name="test-aws-infra-localstack-terraform-prereqs"></a>

**Conditions préalables**
+ [Installer Docker](https://docs.docker.com/get-started/get-docker/)
+ [Activez l'accès](https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option) au socket Docker par défaut (`/var/run/docker.sock`). Pour plus d’informations, consultez la [documentation LocalStack ](https://docs.localstack.cloud/user-guide/aws/lambda/#migrating-to-lambda-v2).
+ [Installez](https://docs.docker.com/compose/install/) Docker Compose
+ [Installez](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) Terraform version 1.6.0 ou ultérieure
+ [Installez](https://developer.hashicorp.com/terraform/cli) Terraform CLI
+ [Configurer](https://hashicorp.github.io/terraform-provider-aws/) le fournisseur Terraform AWS 
+ (Facultatif) [Installez](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) et [configurez](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) le AWS Command Line Interface (AWS CLI). Pour un exemple d'utilisation du AWS CLI with LocalStack, consultez l'[AWS infrastructure de GitHub test utilisant LocalStack et le référentiel de tests Terraform](https://github.com/aws-samples/localstack-terraform-test).

**Limites**
+ Ce modèle fournit des exemples explicites pour tester les ressources Amazon Simple Storage Service (Amazon S3) AWS Lambda, AWS Step Functions, et Amazon DynamoDB. Toutefois, vous pouvez étendre cette solution pour inclure des AWS ressources supplémentaires.
+ Ce modèle fournit des instructions pour exécuter des tests Terraform localement, mais vous pouvez intégrer des tests dans n'importe quel CI/CD pipeline.
+ Ce modèle fournit des instructions pour utiliser l'image de LocalStack la communauté. Si vous utilisez l'image LocalStack Pro, consultez la [documentation LocalStack Pro](https://hub.docker.com/r/localstack/localstack-pro).
+ LocalStack fournit des services d'émulation pour différents. AWS APIs Pour une liste complète, voir [Couverture des fonctionnalités du AWS service](https://docs.localstack.cloud/user-guide/aws/feature-coverage/). Certaines fonctionnalités avancées peuvent nécessiter un abonnement LocalStack Pro.

## Architecture
<a name="test-aws-infra-localstack-terraform-architecture"></a>

Le schéma suivant montre l'architecture de cette solution. Les principaux composants sont un référentiel de code source, un CI/CD pipeline et un conteneur LocalStack Docker. Le conteneur LocalStack Docker héberge les éléments suivants Services AWS localement :
+ Un compartiment Amazon S3 pour stocker des fichiers
+ Amazon CloudWatch pour la surveillance et la journalisation
+ Une AWS Lambda fonction pour exécuter du code sans serveur
+ Une machine à AWS Step Functions états pour orchestrer des flux de travail en plusieurs étapes
+ Une table Amazon DynamoDB pour stocker des données NoSQL

![Un CI/CD pipeline crée et teste le conteneur LocalStack Docker et les ressources AWS.](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/34bfbdbf-14e7-42a0-9022-c85a9c30cdcd/images/dc61fac9-b92c-4841-9132-ff8bb865eed9.png)


Le schéma suivant illustre le flux de travail suivant :

1. Vous ajoutez et validez un fichier de configuration Terraform dans le référentiel de code source.

1. Le CI/CD pipeline détecte les modifications et lance un processus de génération pour l'analyse statique du code Terraform. Le pipeline construit et exécute le conteneur LocalStack Docker. Ensuite, le pipeline lance le processus de test.

1. Le pipeline télécharge un objet dans un compartiment Amazon S3 hébergé dans le conteneur LocalStack Docker.

1. Le téléchargement de l'objet appelle une AWS Lambda fonction.

1. La fonction Lambda enregistre la notification d'événement Amazon S3 dans un CloudWatch journal.

1. La fonction Lambda démarre une machine à AWS Step Functions états.

1. La machine d'état écrit le nom de l'objet Amazon S3 dans une table DynamoDB.

1. Le processus de test du CI/CD pipeline vérifie que le nom de l'objet chargé correspond à l'entrée de la table DynamoDB. Il vérifie également que le compartiment S3 est déployé avec le nom spécifié et que la AWS Lambda fonction a été déployée avec succès.

## Outils
<a name="test-aws-infra-localstack-terraform-tools"></a>

**Services AWS**
+ [Amazon](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) vous CloudWatch aide à surveiller les indicateurs de vos AWS ressources et des applications que vous utilisez AWS en temps réel.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) est un service de base de données NoSQL entièrement géré, offrant des performances rapides, prévisibles et évolutives.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) est un service de calcul qui vous aide à exécuter du code sans avoir à allouer ni à 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)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 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.
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)est un service d'orchestration sans serveur qui vous aide à combiner des AWS Lambda fonctions et autres Services AWS pour créer des applications critiques pour l'entreprise.

**Autres outils**
+ [Docker](https://www.docker.com/) est un ensemble de produits de plateforme en tant que service (PaaS) qui utilisent la virtualisation au niveau du système d'exploitation pour fournir des logiciels dans des conteneurs.
+ [Docker Compose](https://docs.docker.com/compose/) est un outil permettant de définir et d'exécuter des applications multi-conteneurs.
+ [LocalStack](https://localstack.cloud)est un émulateur de service cloud qui s'exécute dans un conteneur unique. En utilisant LocalStack, vous pouvez exécuter des charges de travail sur votre machine locale qui l'utilise Services AWS, sans vous connecter au AWS Cloud.
+ [Terraform](https://www.terraform.io/) est un outil IaC HashiCorp qui vous aide à créer et à gérer des ressources sur site et dans le cloud.
+ [Terraform Tests](https://developer.hashicorp.com/terraform/language/tests) vous aide à valider les mises à jour de configuration des modules Terraform par le biais de tests analogues à des tests d'intégration ou unitaires.

**Référentiel de code**

Le code de ce modèle est disponible dans l'[AWS infrastructure de GitHub test à l'aide du LocalStack référentiel Terraform Tests](https://github.com/aws-samples/localstack-terraform-test).

## Bonnes pratiques
<a name="test-aws-infra-localstack-terraform-best-practices"></a>
+ Cette solution teste AWS l'infrastructure spécifiée dans les fichiers de configuration Terraform et ne déploie pas ces ressources dans le. AWS Cloud Si vous souhaitez déployer les ressources, suivez le [principe du moindre privilège](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) (documentation IAM) et [configurez correctement le backend Terraform (documentation Terraform](https://developer.hashicorp.com/terraform/language/backend)).
+ Lors de l'intégration LocalStack dans un CI/CD pipeline, nous vous recommandons de ne pas exécuter le conteneur LocalStack Docker en mode privilège. Pour plus d'informations, consultez [Privilèges d'exécution et fonctionnalités Linux](https://docs.docker.com/engine/containers/run/#runtime-privilege-and-linux-capabilities) (documentation Docker) et [Sécurité pour les coureurs autogérés](https://docs.gitlab.com/runner/security/) (GitLab documentation).

## Épopées
<a name="test-aws-infra-localstack-terraform-epics"></a>

### Déploiement de la solution
<a name="deploy-the-solution"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Pour cloner le référentiel. | Dans un shell bash, entrez la commande suivante. Cela clone l'[AWS infrastructure de test à l'aide d'un référentiel LocalStack de tests Terraform](https://github.com/aws-samples/localstack-terraform-test) à partir de : GitHub<pre>git clone https://github.com/aws-samples/localstack-terraform-test.git</pre> | DevOps ingénieur | 
| Faites fonctionner le LocalStack conteneur. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/test-aws-infra-localstack-terraform.html) | DevOps ingénieur | 
| Initialisez Terraform. | Entrez la commande suivante pour initialiser Terraform :<pre>terraform init</pre> | DevOps ingénieur | 
| Exécutez des tests Terraform. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/test-aws-infra-localstack-terraform.html) | DevOps ingénieur | 
| nettoyer les ressources. | Entrez la commande suivante pour détruire le LocalStack conteneur :<pre>docker-compose down</pre> | DevOps ingénieur | 

## Résolution des problèmes
<a name="test-aws-infra-localstack-terraform-troubleshooting"></a>


| Problème | Solution | 
| --- | --- | 
| `Error: reading DynamoDB Table Item (Files\|README.md): empty`résultat lors de l'exécution de la `terraform test` commande. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/test-aws-infra-localstack-terraform.html) | 

## Ressources connexes
<a name="test-aws-infra-localstack-terraform-resources"></a>
+ [Commencer à utiliser Terraform : conseils pour AWS CDK et AWS CloudFormation experts](https://docs.aws.amazon.com/prescriptive-guidance/latest/getting-started-terraform/introduction.html) (conseils AWS prescriptifs)
+ [Meilleures pratiques d'utilisation du AWS fournisseur Terraform](https://docs.aws.amazon.com/prescriptive-guidance/latest/terraform-aws-provider-best-practices/introduction.html) (directives AWS prescriptives)
+ [Terraform CI/CD et poursuite des tests AWS avec le nouveau cadre de test Terraform](https://aws.amazon.com/blogs/devops/terraform-ci-cd-and-testing-on-aws-with-the-new-terraform-test-framework/) (article de blog)AWS 
+ [Accélérer la livraison de logiciels à l'aide de LocalStack Cloud Emulator depuis AWS Marketplace](https://aws.amazon.com/blogs/awsmarketplace/accelerating-software-delivery-localstack-cloud-emulator-aws-marketplace/) (article de AWS blog)

## Informations supplémentaires
<a name="test-aws-infra-localstack-terraform-additional"></a>

**Intégration avec les GitHub actions**

Vous pouvez intégrer LocalStack et terraformer des tests dans un CI/CD pipeline à l'aide GitHub d'actions. Pour plus d'informations, consultez la [documentation sur GitHub les actions](https://docs.github.com/en/actions). Voici un exemple de fichier de configuration d' GitHub actions :

```
name: LocalStack Terraform Test

on:
  push:
    branches:
      - '**'

  workflow_dispatch: {}

jobs:
  localstack-terraform-test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4

    - name: Build and Start LocalStack Container
      run: |
        docker compose up -d

    - name: Setup Terraform
      uses: hashicorp/setup-terraform@v3
      with:
        terraform_version: latest

    - name: Run Terraform Init and Validation
      run: |
        terraform init
        terraform validate
        terraform fmt --recursive --check
        terraform plan
        terraform show

    - name: Run Terraform Test
      run: |
        terraform test

    - name: Stop and Delete LocalStack Container
      if: always()
      run: docker compose down
```