

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# AWS Infrastruttura di test utilizzando LocalStack e Terraform Tests
<a name="test-aws-infra-localstack-terraform"></a>

*Ivan Girardi e Ioannis Kalyvas, Amazon Web Services*

## Riepilogo
<a name="test-aws-infra-localstack-terraform-summary"></a>

Questo modello ti aiuta a testare localmente l'infrastruttura come codice (IaC) AWS in Terraform senza la necessità di fornire l'infrastruttura nel tuo ambiente. AWS Integra il framework [Terraform](https://developer.hashicorp.com/terraform/language/tests) Tests con. [LocalStack](https://github.com/localstack/localstack) Il contenitore LocalStack Docker fornisce un ambiente di sviluppo locale che emula vari. Servizi AWS Questo ti aiuta a testare e iterare le implementazioni dell'infrastruttura senza incorrere in costi di. Cloud AWS

Questa soluzione offre i seguenti vantaggi:
+ **Ottimizzazione dei costi**: l'esecuzione di test LocalStack elimina la necessità di utilizzo Servizi AWS. In questo modo si evitano i costi associati alla creazione, al funzionamento e alla modifica di tali risorse. AWS 
+ **Velocità ed efficienza**: i test locali sono inoltre in genere più rapidi rispetto alla distribuzione delle risorse. AWS Questo ciclo di feedback rapido accelera lo sviluppo e il debug. Poiché LocalStack funziona localmente, puoi sviluppare e testare i tuoi file di configurazione Terraform senza una connessione Internet. È possibile eseguire il debug dei file di configurazione Terraform localmente e ricevere un feedback immediato, il che semplifica il processo di sviluppo.
+ **Coerenza e riproducibilità**: LocalStack fornisce un ambiente coerente per i test. Questa coerenza aiuta a garantire che i test producano gli stessi risultati, indipendentemente dalle AWS modifiche esterne o dai problemi di rete.
+ **Isolamento**: Testing with LocalStack impedisce di influire accidentalmente sulle AWS risorse attive o sugli ambienti di produzione. Questo isolamento consente di sperimentare e testare diverse configurazioni in tutta sicurezza.
+ **Automazione**[: l'integrazione con una pipeline di integrazione e distribuzione continua (CI/CD) consente di testare automaticamente i file di configurazione Terraform.](https://developer.hashicorp.com/terraform/language/files) La pipeline testa a fondo l'IaC prima dell'implementazione.
+ **Flessibilità**: è possibile simulare diverse Regioni AWS configurazioni e servizi per adattarle meglio agli ambienti di produzione. Account AWS

## Prerequisiti e limitazioni
<a name="test-aws-infra-localstack-terraform-prereqs"></a>

**Prerequisiti**
+ [Installa Docker](https://docs.docker.com/get-started/get-docker/)
+ [Abilita l'accesso](https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option) al socket Docker predefinito (). `/var/run/docker.sock` Per ulteriori informazioni, consulta la [documentazione relativa ad LocalStack ](https://docs.localstack.cloud/user-guide/aws/lambda/#migrating-to-lambda-v2).
+ [Installa Docker](https://docs.docker.com/compose/install/) Compose
+ [Installa](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) Terraform versione 1.6.0 o successiva
+ [Installa](https://developer.hashicorp.com/terraform/cli) Terraform CLI
+ [Configura il provider Terraform](https://hashicorp.github.io/terraform-provider-aws/) AWS 
+ (Facoltativo) [Installa](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) e [configura](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) AWS Command Line Interface (AWS CLI). Per un esempio di come utilizzare AWS CLI with LocalStack, consulta il repository GitHub [Test AWS infrastructure using LocalStack and Terraform Tests](https://github.com/aws-samples/localstack-terraform-test).

**Limitazioni**
+ Questo modello fornisce esempi espliciti per testare le risorse di Amazon Simple Storage Service (Amazon S3) AWS Lambda e AWS Step Functions Amazon DynamoDB. Tuttavia, puoi estendere questa soluzione per includere risorse aggiuntive. AWS 
+ Questo modello fornisce istruzioni per eseguire Terraform Tests localmente, ma è possibile integrare i test in qualsiasi CI/CD pipeline.
+ Questo modello fornisce istruzioni per l'uso dell'immagine LocalStack comunitaria. Se stai usando l'immagine LocalStack Pro, consulta la [documentazione LocalStack Pro](https://hub.docker.com/r/localstack/localstack-pro).
+ LocalStack fornisce servizi di emulazione per diversi. AWS APIs Per un elenco completo, vedere [AWS Service Feature Coverage](https://docs.localstack.cloud/user-guide/aws/feature-coverage/). Alcune funzionalità avanzate potrebbero richiedere un abbonamento a LocalStack Pro.

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

Il diagramma seguente mostra l'architettura di questa soluzione. I componenti principali sono un repository di codice sorgente, una CI/CD pipeline e un LocalStack contenitore Docker. Il LocalStack Docker Container ospita localmente quanto segue: Servizi AWS 
+ Un bucket Amazon S3 per l'archiviazione di file
+ Amazon CloudWatch per il monitoraggio e la registrazione
+ Una AWS Lambda funzione per l'esecuzione di codice serverless
+ Una macchina a AWS Step Functions stati per orchestrare flussi di lavoro in più fasi
+ Una tabella Amazon DynamoDB per l'archiviazione di dati NoSQL

![Una CI/CD pipeline crea e testa il contenitore LocalStack Docker e le risorse AWS.](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/34bfbdbf-14e7-42a0-9022-c85a9c30cdcd/images/dc61fac9-b92c-4841-9132-ff8bb865eed9.png)


Il diagramma mostra il flusso di lavoro seguente:

1. Si aggiunge e si esegue il commit di un file di configurazione Terraform nel repository del codice sorgente.

1. La CI/CD pipeline rileva le modifiche e avvia un processo di compilazione per l'analisi statica del codice Terraform. La pipeline crea ed esegue il contenitore Docker. LocalStack Quindi la pipeline avvia il processo di test.

1. La pipeline carica un oggetto in un bucket Amazon S3 ospitato nel contenitore Docker. LocalStack 

1. Il caricamento dell'oggetto richiama una funzione. AWS Lambda 

1. La funzione Lambda memorizza la notifica degli eventi di Amazon S3 in un registro. CloudWatch 

1. La funzione Lambda avvia una macchina a AWS Step Functions stati.

1. La macchina a stati scrive il nome dell'oggetto Amazon S3 in una tabella DynamoDB.

1. Il processo di test nella CI/CD pipeline verifica che il nome dell'oggetto caricato corrisponda alla voce nella tabella DynamoDB. Verifica inoltre che il bucket S3 sia distribuito con il nome specificato e che la funzione sia stata implementata correttamente. AWS Lambda 

## Tools (Strumenti)
<a name="test-aws-infra-localstack-terraform-tools"></a>

**Servizi AWS**
+ [Amazon](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) ti CloudWatch aiuta a monitorare i parametri delle tue AWS risorse e delle applicazioni su cui esegui AWS in tempo reale.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) è un servizio di database NoSQL interamente gestito che offre prestazioni elevate, prevedibili e scalabili.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) è un servizio di calcolo che consente di eseguire il codice senza gestire i server o effettuarne il provisioning. Esegue il codice solo quando necessario e si ridimensiona automaticamente, quindi paghi solo per il tempo di elaborazione che utilizzi.
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) è un servizio di archiviazione degli oggetti basato sul cloud che consente di archiviare, proteggere e recuperare qualsiasi quantità di dati.
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)è un servizio di orchestrazione senza server che consente di combinare AWS Lambda funzioni e altro Servizi AWS per creare applicazioni aziendali critiche.

**Altri strumenti**
+ [Docker](https://www.docker.com/) è un insieme di prodotti Platform as a Service (PaaS) che utilizzano la virtualizzazione a livello di sistema operativo per fornire software in container.
+ [Docker Compose è uno strumento per definire ed eseguire](https://docs.docker.com/compose/) applicazioni multi-contenitore.
+ [LocalStack](https://localstack.cloud)è un emulatore di servizi cloud che viene eseguito in un unico contenitore. Utilizzando LocalStack, è possibile eseguire carichi di lavoro sul computer locale che utilizzano Servizi AWS, senza connettersi a. Cloud AWS
+ [Terraform](https://www.terraform.io/) è uno strumento IaC HashiCorp che ti aiuta a creare e gestire risorse cloud e locali.
+ [Terraform Tests](https://developer.hashicorp.com/terraform/language/tests) ti aiuta a convalidare gli aggiornamenti della configurazione dei moduli Terraform attraverso test analoghi all'integrazione o al test unitario.

**Archivio di codice**

Il codice per questo modello è disponibile nell'[AWS infrastruttura di GitHub test utilizzando LocalStack il repository Terraform Tests](https://github.com/aws-samples/localstack-terraform-test).

## Best practice
<a name="test-aws-infra-localstack-terraform-best-practices"></a>
+ Questa soluzione verifica AWS l'infrastruttura specificata nei file di configurazione Terraform e non distribuisce tali risorse in. Cloud AWS Se desideri distribuire le risorse, segui il [principio del privilegio minimo (documentazione IAM) e [configura](https://developer.hashicorp.com/terraform/language/backend) correttamente il backend](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) Terraform (documentazione Terraform).
+ Durante l'integrazione LocalStack in una CI/CD pipeline, ti consigliamo di non eseguire il contenitore Docker in modalità privilegio. LocalStack Per ulteriori informazioni, consulta [Privilegi di runtime e funzionalità Linux](https://docs.docker.com/engine/containers/run/#runtime-privilege-and-linux-capabilities) (documentazione Docker) e [Sicurezza per](https://docs.gitlab.com/runner/security/) i runner autogestiti (documentazione). GitLab 

## Epiche
<a name="test-aws-infra-localstack-terraform-epics"></a>

### Implementazione della soluzione
<a name="deploy-the-solution"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Clonare il repository. | In una shell bash, inserisci il seguente comando. Questo clona l'[AWS infrastruttura di test utilizzando LocalStack il repository Terraform Tests](https://github.com/aws-samples/localstack-terraform-test) da: GitHub<pre>git clone https://github.com/aws-samples/localstack-terraform-test.git</pre> | DevOps ingegnere | 
| Esegui il LocalStack contenitore. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/test-aws-infra-localstack-terraform.html) | DevOps ingegnere | 
| Inizializza Terraform. | Inserisci il seguente comando per inizializzare Terraform:<pre>terraform init</pre> | DevOps ingegnere | 
| Esegui test Terraform. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/test-aws-infra-localstack-terraform.html) | DevOps ingegnere | 
| Eliminare le risorse. | Inserisci il seguente comando per distruggere il LocalStack contenitore:<pre>docker-compose down</pre> | DevOps ingegnere | 

## risoluzione dei problemi
<a name="test-aws-infra-localstack-terraform-troubleshooting"></a>


| Problema | Soluzione | 
| --- | --- | 
| `Error: reading DynamoDB Table Item (Files\|README.md): empty`risultato durante l'esecuzione del `terraform test` comando. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/test-aws-infra-localstack-terraform.html) | 

## Risorse correlate
<a name="test-aws-infra-localstack-terraform-resources"></a>
+ [Guida introduttiva a Terraform: Guida per AWS CDK ed AWS CloudFormation](https://docs.aws.amazon.com/prescriptive-guidance/latest/getting-started-terraform/introduction.html) esperti (Prescriptive Guidance)AWS 
+ [Migliori pratiche per l'utilizzo di Terraform AWS Provider](https://docs.aws.amazon.com/prescriptive-guidance/latest/terraform-aws-provider-best-practices/introduction.html) (Prescriptive Guidance)AWS 
+ [Terraform CI/CD e continuazione dei test AWS con il nuovo Terraform Test](https://aws.amazon.com/blogs/devops/terraform-ci-cd-and-testing-on-aws-with-the-new-terraform-test-framework/) Framework (post sul blog)AWS 
+ [Accelerazione della distribuzione del software utilizzando LocalStack Cloud Emulator da Marketplace AWS](https://aws.amazon.com/blogs/awsmarketplace/accelerating-software-delivery-localstack-cloud-emulator-aws-marketplace/) (post sul blog)AWS 

## Informazioni aggiuntive
<a name="test-aws-infra-localstack-terraform-additional"></a>

**Integrazione con Actions GitHub **

È possibile integrare LocalStack e Terraform Tests in una CI/CD pipeline utilizzando GitHub Actions. Per ulteriori informazioni, consulta la documentazione di [GitHub Actions](https://docs.github.com/en/actions). Di seguito è riportato un esempio di file di configurazione di 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
```