

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à.

# Configura una CI/CD pipeline per carichi di lavoro ibridi su Amazon ECS Anywhere utilizzando AWS CDK e GitLab
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab"></a>

*Rafael Ortiz, Amazon Web Services*

## Riepilogo
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-summary"></a>

Amazon ECS Anywhere è un'estensione di Amazon Elastic Container Service (Amazon ECS). Fornisce supporto per la registrazione di un'*istanza esterna*, come un server locale o una macchina virtuale (VM), nel cluster Amazon ECS. Questa funzionalità aiuta a ridurre i costi e mitigare l'orchestrazione e le operazioni complesse dei container locali. Puoi utilizzare ECS Anywhere per distribuire ed eseguire applicazioni container in ambienti locali e cloud. Elimina la necessità per il team di apprendere più domini e set di competenze o di gestire software complessi da solo.

Questo modello descrive un step-by-step approccio per il provisioning di un cluster Amazon ECS con istanze Amazon ECS Anywhere utilizzando gli stack Amazon Web Services (AWS) Cloud Development Kit (AWS CDK). Quindi usi AWS CodePipeline per configurare una pipeline di integrazione e distribuzione continua (CI/CD). Quindi, replichi il tuo repository di GitLab codice su AWS CodeCommit e distribuisci la tua applicazione containerizzata sul cluster Amazon ECS.

Questo modello è progettato per aiutare coloro che utilizzano l'infrastruttura locale a eseguire applicazioni container e a gestire il codice base dell'applicazione GitLab . Puoi gestire questi carichi di lavoro utilizzando i servizi cloud AWS, senza disturbare l'infrastruttura locale esistente.

## Prerequisiti e limitazioni
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-prereqs"></a>

**Prerequisiti**
+ Un account AWS attivo.
+ Un'applicazione contenitore in esecuzione su un'infrastruttura locale.
+ Un GitLab repository in cui gestire la base di codice dell'applicazione. Per ulteriori informazioni, vedete [Repository](https://docs.gitlab.com/ee/user/project/repository/) ()GitLab.
+ AWS Command Line Interface (AWS CLI), installata e configurata. Per ulteriori informazioni, consulta [Installazione o aggiornamento della versione più recente dell'interfaccia a riga di comando di AWS (documentazione dell'interfaccia a riga](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) di comando di AWS).
+ AWS CDK Toolkit, installato e configurato a livello globale. Per ulteriori informazioni, consulta [Installare il CDK AWS](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install) (documentazione AWS CDK).
+ npm, installato e configurato per AWS CDK in. TypeScript Per ulteriori informazioni, consulta [Download e installazione di Node.js e npm (documentazione npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)).

**Limitazioni**
+ Per limitazioni e considerazioni, consulta [Istanze esterne (Amazon ECS Anywhere) nella documentazione di Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere.html#ecs-anywhere-considerations).

**Versioni del prodotto**
+ AWS CDK Toolkit versione 2.27.0 o successiva
+ npm versione 7.20.3 o successiva
+ Node.js versione 16.6.1 o successiva

## Architecture
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-architecture"></a>

**Stack tecnologico Target**
+ AWS CDK
+ AWS CloudFormation
+ AWS CodeBuild
+ AWS CodeCommit
+ AWS CodePipeline
+ Amazon ECS Anywhere
+ Amazon Elastic Container Registry (Amazon ECR)
+ AWS Identity and Access Management (IAM)
+ Gestore di sistema AWS
+ GitLab deposito

**Architettura Target**

![\[Diagramma dell'architettura per la configurazione del cluster e CI/CD della pipeline Amazon ECS.\]](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/b0f35986-a839-4b01-8eb0-4748182ddafc/images/85b8d4d9-3591-4d69-a54b-64aa543498f1.png)


Questo diagramma rappresenta due flussi di lavoro principali descritti in questo modello, il provisioning del cluster Amazon ECS e la configurazione della CI/CD pipeline che configura e distribuisce la pipeline, come segue: CI/CD 

1. **Eseguire il provisioning del cluster Amazon ECS**

   1. Quando distribuisci il primo stack CDK AWS, viene creato uno CloudFormation stack su AWS.

   1. Questo CloudFormation stack fornisce un cluster Amazon ECS e le relative risorse AWS.

   1. Per registrare un'istanza esterna con un cluster Amazon ECS, devi installare AWS Systems Manager Agent (SSM Agent) sulla tua macchina virtuale e registrare la macchina virtuale come istanza gestita da AWS Systems Manager. 

   1. È inoltre necessario installare l'agente contenitore Amazon ECS e Docker sulla macchina virtuale per registrarla come istanza esterna nel cluster Amazon ECS.

   1. Quando l'istanza esterna è registrata e configurata con il cluster Amazon ECS, può eseguire più contenitori sulla macchina virtuale, che è registrata come istanza esterna.

   1. Il cluster Amazon ECS è attivo e può eseguire i carichi di lavoro delle applicazioni tramite contenitori. L'istanza del contenitore Amazon ECS Anywhere viene eseguita in un ambiente locale ma è associata al cluster Amazon ECS nel cloud.

1. **Configurazione e distribuzione della pipeline CI/CD **

   1. Quando distribuisci il secondo stack CDK AWS, viene creato un altro CloudFormation stack su AWS.

   1. Questo CloudFormation stack fornisce una pipeline CodePipeline e le relative risorse AWS.

   1. Invia e unisci le modifiche al codice dell'applicazione in un repository locale. GitLab  

   1. Il GitLab repository viene replicato automaticamente nel repository. CodeCommit 

   1. Gli aggiornamenti al repository vengono avviati automaticamente CodeCommit . CodePipeline 

   1. CodePipeline copia il codice CodeCommit e crea l'applicazione incorporata distribuibile. CodeBuild

   1. CodePipeline crea un'immagine Docker dell'ambiente di CodeBuild compilazione e la invia al repository Amazon ECR.

   1. CodePipeline avvia CodeDeploy azioni che estraggono l'immagine del contenitore dal repository Amazon ECR.

   1. CodePipeline distribuisce l'immagine del contenitore sul cluster Amazon ECS.

**Automazione e scalabilità**

Questo modello utilizza AWS CDK come strumento Infrastructure as Code (IaC) per configurare e distribuire questa architettura. AWS CDK ti aiuta a orchestrare le risorse AWS e configurare Amazon ECS Anywhere e la pipeline. CI/CD 

## Tools (Strumenti)
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-tools"></a>

**Servizi AWS**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) è un framework di sviluppo software che aiuta a definire e fornire l'infrastruttura cloud AWS in codice.
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) è un servizio di controllo delle versioni che consente di archiviare e gestire archivi Git in modo privato, senza dover gestire il proprio sistema di controllo del codice sorgente.
+ [AWS](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) ti CodePipeline aiuta a modellare e configurare rapidamente le diverse fasi di un rilascio di software e ad automatizzare i passaggi necessari per rilasciare continuamente le modifiche al software.
+ [AWS Command Line Interface (AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)) è uno strumento open source che ti aiuta a interagire con i servizi AWS tramite comandi nella tua shell a riga di comando.
+ [Amazon Elastic Container Registry (Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)) è un servizio di registro di immagini di container gestito sicuro, scalabile e affidabile.
+ [Amazon Elastic Container Service (Amazon ECS)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) è un servizio rapido e scalabile di gestione dei container che ti aiuta a eseguire, arrestare e gestire container in un cluster. Questo modello utilizza anche [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere.html) Anywhere, che fornisce supporto per la registrazione di un server o una macchina virtuale locale nel cluster Amazon ECS.

**Altri strumenti**
+ [Node.js](https://nodejs.org/en/docs/) è un ambiente di JavaScript runtime basato sugli eventi progettato per la creazione di applicazioni di rete scalabili.
+ [npm](https://docs.npmjs.com/about-npm) è un registro software che viene eseguito in un ambiente Node.js e viene utilizzato per condividere o prendere in prestito pacchetti e gestire la distribuzione di pacchetti privati.
+ [Vagrant](https://developer.hashicorp.com/vagrant/docs) è un'utilità open source per la creazione e la manutenzione di ambienti di sviluppo software virtuali portatili. A scopo dimostrativo, questo modello utilizza Vagrant per creare una macchina virtuale locale.

**Archivio di codice**

Il codice per questo pattern è disponibile nella [pipeline GitHub CI/CD per Amazon ECS Anywhere utilizzando il repository AWS](https://github.com/aws-samples/amazon-ecs-anywhere-cicd-pipeline-cdk-sample) CDK.

## Best practice
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-best-practices"></a>

Prendi in considerazione le seguenti best practice per la distribuzione di questo pattern:
+ [Le migliori pratiche per lo sviluppo e la distribuzione di infrastrutture cloud con AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/best-practices.html)
+ [Le migliori pratiche per lo sviluppo di applicazioni cloud con AWS CDK](https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk/) (post sul blog AWS)

## Epiche
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-epics"></a>

### Verifica la configurazione di AWS CDK
<a name="verify-the-aws-cdk-configuration"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Verifica la versione di AWS CDK. | Verifica la versione di AWS CDK Toolkit inserendo il seguente comando.<pre>cdk --version</pre>Questo modello richiede la versione 2.27.0 o successiva. Se disponi di una versione precedente, segui le istruzioni nella [documentazione di AWS CDK](https://docs.aws.amazon.com/cdk/latest/guide/cli.html) per aggiornarla. | DevOps ingegnere | 
| Verifica la versione di npm. | Verifica la versione di npm inserendo il seguente comando.<pre>npm --version</pre>Questo modello richiede la versione 7.20.3 o successiva. Se hai una versione precedente, segui le istruzioni nella [documentazione di npm](https://docs.npmjs.com/try-the-latest-stable-version-of-npm) per aggiornarla. | DevOps ingegnere | 
| Configura le credenziali AWS. | Configura le credenziali AWS inserendo il `aws configure` comando e seguendo le istruzioni.<pre>$aws configure<br />AWS Access Key ID [None]: <your-access-key-ID><br />AWS Secret Access Key [None]: <your-secret-access-key><br />Default region name [None]: <your-Region-name><br />Default output format [None]:</pre> | DevOps ingegnere | 

### Avvia l'ambiente CDK AWS
<a name="bootstrap-the-aws-cdk-environment"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Clona il repository di codice AWS CDK. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html) | DevOps ingegnere | 
| Avvia l'ambiente. | Distribuisci il CloudFormation modello nell'account e nella regione AWS che desideri utilizzare inserendo il seguente comando.<pre>cdk bootstrap <account-number>/<Region></pre>Per ulteriori informazioni, consulta [Bootstrapping nella documentazione](https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html) di AWS CDK. | DevOps ingegnere | 

### Crea e distribuisci l'infrastruttura per Amazon ECS Anywhere
<a name="build-and-deploy-the-infrastructure-for-amazon-ecs-anywhere"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Installa le dipendenze del pacchetto e compila i TypeScript file. | Installa le dipendenze del pacchetto e compila TypeScript i file inserendo i seguenti comandi.<pre>$cd EcsAnywhereCdk<br />$npm install<br />$npm fund </pre>Questi comandi installano tutti i pacchetti dal repository di esempio. Per ulteriori informazioni, consulta [npm ci](https://docs.npmjs.com/cli/v7/commands/npm-ci) e [npm install](https://docs.npmjs.com/cli/v7/commands/npm-install) nella documentazione di npm. Se riscontri errori sui pacchetti mancanti quando inserisci questi comandi, consulta la sezione [Risoluzione dei problemi](#set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-troubleshooting) di questo modello. | DevOps ingegnere | 
| Compilare il progetto. | Per creare il codice del progetto, inserisci il seguente comando.<pre>npm run build</pre>Per ulteriori informazioni sulla creazione e la distribuzione del progetto, consulta La [tua prima app AWS CDK](https://docs.aws.amazon.com/cdk/latest/guide/hello_world.html#:~:text=the%20third%20parameter.-,Synthesize%20an%20AWS%20CloudFormation%20template,-Synthesize%20an%20AWS) nella documentazione di AWS CDK. | DevOps ingegnere | 
| Implementa lo stack di infrastruttura Amazon ECS Anywhere. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html) | DevOps ingegnere | 
| Verifica la creazione e l'output dello stack. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html) | DevOps ingegnere | 

### Configura una macchina virtuale locale
<a name="set-up-an-on-premises-vm"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Configura la tua VM. | Crea una VM Vagrant inserendo il `vagrant up` comando dalla directory principale in cui si trova Vagrantfile. [Per ulteriori informazioni, consulta la documentazione di Vagrant.](https://developer.hashicorp.com/vagrant/docs/cli/up) | DevOps ingegnere | 
| Registra la tua macchina virtuale come istanza esterna. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html)Questo configura la tua macchina virtuale come un'istanza esterna di Amazon ECS Anywhere e registra l'istanza nel cluster Amazon ECS. Per ulteriori informazioni, consulta [Registrazione di un'istanza esterna in un cluster](https://docs.amazonaws.cn/en_us/AmazonECS/latest/developerguide/ecs-anywhere-registration.html) nella documentazione di Amazon ECS. In caso di problemi, consulta la sezione [Risoluzione dei problemi](#set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-troubleshooting). | DevOps ingegnere | 
| Verifica lo stato di Amazon ECS Anywhere e della macchina virtuale esterna. | Per verificare se la tua macchina virtuale è connessa al piano di controllo di Amazon ECS e se è in esecuzione, usa i seguenti comandi.<pre>$aws ssm describe-instance-information<br />$aws ecs list-container-instances --cluster $CLUSTER_NAME</pre> | DevOps ingegnere | 

### Implementa la pipeline CI/CD
<a name="deploy-the-ci-cd-pipeline"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea un ramo nel CodeCommit repository. | Crea un ramo denominato `main` nel CodeCommit repository creando il primo commit per il repository. Puoi seguire la documentazione di AWS per [creare un commit in CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-create-commit.html#create-first-commit). Il comando seguente è un esempio.<pre>aws codecommit put-file \<br />  --repository-name EcsAnywhereRepo \<br />  --branch-name main \<br />  --file-path README.md \<br />  --file-content "Test" \<br />  --name "Dev Ops" \<br />  --email "devops@example.com" \<br />  --commit-message "Adding README."</pre> | DevOps ingegnere | 
| Configura il mirroring dei repository. | È possibile eseguire il mirroring di un GitLab repository da e verso fonti esterne. È possibile selezionare quale repository funge da origine. I rami, i tag e i commit vengono sincronizzati automaticamente. Configura un push mirror tra il GitLab repository che ospita l'applicazione e il repository. CodeCommit Per istruzioni, [consultate Configurare un push mirror da GitLab a CodeCommit](https://docs.gitlab.com/ee/user/project/repository/mirror/push.html#set-up-a-push-mirror-from-gitlab-to-aws-codecommit) (GitLab documentazione).Per impostazione predefinita, il mirroring sincronizza automaticamente il repository. Se desideri aggiornare manualmente i repository, consulta [Aggiornare un mirror](https://docs.gitlab.com/ee/user/project/repository/mirror/#update-a-mirror) (documentazione). GitLab  | DevOps ingegnere | 
| Implementa lo stack della CI/CD pipeline. | Distribuisci lo `EcsAnywherePipelineStack` stack inserendo il seguente comando.<pre>$cdk  deploy EcsAnywherePipelineStack</pre> | DevOps ingegnere | 
| Testa la CI/CD pipeline. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.html) | DevOps ingegnere | 

### Eliminazione
<a name="clean-up"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Pulisci ed elimina le risorse. | Dopo aver seguito questo schema, dovresti rimuovere le proof-of-concept risorse che hai creato. Per pulire, inserisci i seguenti comandi.<pre>$cdk destroy EcsAnywherePipelineStack<br />$cdk destroy EcsAnywhereInfraStack</pre> | DevOps ingegnere | 

## Risoluzione dei problemi
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-troubleshooting"></a>


| Problema | Soluzione | 
| --- | --- | 
| Errori relativi ai pacchetti mancanti durante l'installazione delle dipendenze dei pacchetti. | Immettete uno dei seguenti comandi per risolvere i pacchetti mancanti.<pre>$npm ci</pre>or<pre>$npm install -g @aws-cdk/<package_name></pre> | 
| Quando si esegue il `aws ssm create-activation` comando sulla macchina virtuale, viene visualizzato il seguente errore.`An error occurred (ValidationException) when calling the CreateActivation operation: Nonexistent role or missing ssm service principal in trust policy: arn:aws:iam::000000000000:role/EcsAnywhereInstanceRole` | Lo `EcsAnywhereInfraStack` stack non è completamente distribuito e il ruolo IAM necessario per eseguire questo comando non è stato ancora creato. Controlla lo stato dello stack nella console. CloudFormation Riprova il comando dopo che lo stato è cambiato in. `CREATE_COMPLETE` | 
| Viene `UNHEALTHY` restituito un controllo dello stato di Amazon ECS e viene visualizzato il seguente errore nella sezione **Servizi** del cluster nella console Amazon ECS.`service EcsAnywhereService was unable to place a task because no container instance met all of its requirements. Reason: No Container Instances were found in your cluster.` | Riavvia l'agente Amazon ECS sulla tua macchina virtuale Vagrant inserendo i seguenti comandi.<pre>$vagrant ssh<br />$sudo systemctl restart ecs<br />$sudo systemctl status ecs</pre> | 

## Risorse correlate
<a name="set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab-resources"></a>
+ [Pagina di marketing di Amazon ECS Anywhere](https://aws.amazon.com/ecs/anywhere/)
+ [Documentazione di Amazon ECS Anywhere](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere.html#ecs-anywhere-considerations)
+ Dimostrazione di [Amazon ECS Anywhere](https://www.youtube.com/watch?v=-eud6yUXsJM) (video)
+ Esempi GitHub di [workshop Amazon ECS Anywhere](https://github.com/aws-samples/aws-ecs-anywhere-workshop-samples) ()
+ [Mirroring del repository](https://docs.gitlab.com/ee/user/project/repository/mirror/) (documentazione) GitLab 