Configura una pipeline CI/CD per carichi di lavoro ibridi su Amazon ECS Anywhere utilizzando AWS CDK e GitLab - Prontuario AWS

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 pipeline CI/CD per carichi di lavoro ibridi su Amazon ECS Anywhere utilizzando AWS CDK e GitLab

Creato dal dott. Rahul Sharad Gaikwad (AWS)

Riepilogo

Avviso: AWS non CodeCommit è più disponibile per i nuovi clienti. I clienti esistenti di AWS CodeCommit possono continuare a utilizzare il servizio normalmente. Ulteriori informazioni.

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

Prerequisiti

Limitazioni

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

Architettura

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 repository

Architettura Target

Diagramma dell'architettura per la configurazione del cluster Amazon ECS e della pipeline CI/CD.

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 that sets up and deploys the CI/CD pipeline, come segue:

  1. Eseguire il provisioning del cluster Amazon ECS

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

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

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

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

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

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

  2. Configurazione e distribuzione della pipeline CI/CD

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

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

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

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

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

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

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

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

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

Automazione e scalabilità

Questo modello utilizza AWS CDK come strumento di infrastruttura come codice (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.

Strumenti

Servizi AWS

  • AWS Cloud Development Kit (AWS CDK) è un framework di sviluppo software che aiuta a definire e fornire l'infrastruttura cloud AWS in codice.

  • AWS CodeCommit è 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 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) è 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) è un servizio di registro di immagini di container gestito sicuro, scalabile e affidabile.

  • Amazon Elastic Container Service (Amazon ECS) è 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 Anywhere, che fornisce supporto per la registrazione di un server o una macchina virtuale locale nel cluster Amazon ECS.

Altri strumenti

  • Node.js è un ambiente di JavaScript runtime basato sugli eventi progettato per la creazione di applicazioni di rete scalabili.

  • 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 è 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 CDK.

Best practice

Prendi in considerazione le seguenti best practice per la distribuzione di questo pattern:

Epiche

AttivitàDescrizioneCompetenze richieste

Verifica la versione di AWS CDK.

Verifica la versione di AWS CDK Toolkit inserendo il seguente comando.

cdk --version

Questo modello richiede la versione 2.27.0 o successiva. Se disponi di una versione precedente, segui le istruzioni nella documentazione di AWS CDK per aggiornarla.

DevOps ingegnere

Verifica la versione di npm.

Verifica la versione di npm inserendo il seguente comando.

npm --version

Questo modello richiede la versione 7.20.3 o successiva. Se hai una versione precedente, segui le istruzioni nella documentazione di npm per aggiornarla.

DevOps ingegnere

Configura le credenziali AWS.

Configura le credenziali AWS inserendo il aws configure comando e seguendo le istruzioni.

$aws configure AWS Access Key ID [None]: <your-access-key-ID> AWS Secret Access Key [None]: <your-secret-access-key> Default region name [None]: <your-Region-name> Default output format [None]:
DevOps ingegnere
AttivitàDescrizioneCompetenze richieste

Clona il repository di codice AWS CDK.

  1. Clona la pipeline CI/CD per Amazon ECS Anywhere utilizzando il repository AWS CDK per questo pattern inserendo il seguente comando.

    git clone https://github.com/aws-samples/amazon-ecs-anywhere-cicd-pipeline-cdk-sample.git
  2. Naviga nella directory clonata inserendo il seguente comando.

    cd amazon-ecs-anywhere-cicd-pipeline-cdk-sample
DevOps ingegnere

Avvia l'ambiente.

Distribuisci il CloudFormation modello nell'account e nella regione AWS che desideri utilizzare inserendo il seguente comando.

cdk bootstrap <account-number>/<Region>

Per ulteriori informazioni, consulta Bootstrapping nella documentazione di AWS CDK.

DevOps ingegnere
AttivitàDescrizioneCompetenze 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.

$cd EcsAnywhereCdk $npm install $npm fund

Questi comandi installano tutti i pacchetti dal repository di esempio. Per ulteriori informazioni, consulta npm ci e npm install nella documentazione di npm. Se riscontri errori sui pacchetti mancanti quando inserisci questi comandi, consulta la sezione Risoluzione dei problemi di questo modello.

DevOps ingegnere

Compilare il progetto.

Per creare il codice del progetto, inserisci il seguente comando.

npm run build

Per ulteriori informazioni sulla creazione e la distribuzione del progetto, consulta La tua prima app AWS CDK nella documentazione di AWS CDK.

DevOps ingegnere

Implementa lo stack di infrastruttura Amazon ECS Anywhere.

  1. Elenca gli stack inserendo il seguente comando.

    $cdk list
  2. Verifica che l'output restituisca le EcsAnywhereInfraStack ECSAnywherePipelineStack pile e.

  3. Distribuisci lo EcsAnywhereInfraStack stack inserendo il seguente comando.

    $cdk  deploy EcsAnywhereInfraStack
DevOps ingegnere

Verifica la creazione e l'output dello stack.

  1. Accedi alla Console di gestione AWS e apri la CloudFormation console all'indirizzo https://console.aws.amazon.com/cloudformation/.

  2. Nella pagina Stacks, seleziona lo EcsAnywhereInfraStack stack.

  3. Verifica che lo stato dello stack sia o. CREATE_IN_PROGRESS CREATE_COMPLETE

    La configurazione del cluster Amazon ECS può richiedere del tempo. Non procedere fino al completamento della creazione dello stack.

DevOps ingegnere
AttivitàDescrizioneCompetenze 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.

DevOps ingegnere

Registra la tua macchina virtuale come istanza esterna.

  1. Accedi alla VM Vagrant utilizzando il comando. vagrant ssh Per ulteriori informazioni, consulta la documentazione di Vagrant.

  2. Installa AWS CLI sulla macchina virtuale seguendo le istruzioni di installazione dell'interfaccia a riga di comando di AWS e inserendo i seguenti comandi. 

    $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" \ > -o "awscliv2.zip" $sudo apt install unzip $unzip awscliv2.zip $sudo ./aws/install $aws configure AWS Access Key ID [None]: <your-access-key-ID> AWS Secret Access Key [None]: <your-secret-access-key> Default region name [None]: <your-Region-name> Default output format [None]:
  1. Crea un codice di attivazione e un ID che puoi utilizzare per registrare la tua macchina virtuale con AWS Systems Manager e attivare l'istanza esterna. L'output di questo comando include l'ID di attivazione e i valori del codice di attivazione.

    aws ssm create-activation \ > --iam-role EcsAnywhereInstanceRole \ > | tee ssm-activation.json

    Se ricevi un errore quando esegui questo comando, consulta la sezione Risoluzione dei problemi.

  2. Esporta l'ID di attivazione e i valori del codice.

    export ACTIVATION_ID=<activation-ID> export ACTIVATION_CODE=<activation-code>
  3. Scarica lo script di installazione sulla tua macchina virtuale.

    curl --proto "https" -o "ecs-anywhere-install.sh" \ > "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh"
  4. Esegui lo script di installazione sulla tua macchina virtuale.

    sudo bash ecs-anywhere-install.sh \ --cluster EcsAnywhereCluster \ --activation-id $ACTIVATION_ID \ --activation-code $ACTIVATION_CODE \ --region <region-name>

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 nella documentazione di Amazon ECS. In caso di problemi, consulta la sezione Risoluzione dei problemi.

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.

$aws ssm describe-instance-information $aws ecs list-container-instances --cluster $CLUSTER_NAME
DevOps ingegnere
AttivitàDescrizioneCompetenze 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. Il comando seguente è un esempio.

aws codecommit put-file \ --repository-name EcsAnywhereRepo \ --branch-name main \ --file-path README.md \ --file-content "Test" \ --name "Dev Ops" \ --email "devops@example.com" \ --commit-message "Adding README."
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 (GitLab documentazione).

Nota

Per impostazione predefinita, il mirroring sincronizza automaticamente il repository. Se desideri aggiornare manualmente i repository, consulta Aggiornare un mirror (documentazione). GitLab

DevOps ingegnere

Implementa lo stack di pipeline CI/CD.

Distribuisci lo EcsAnywherePipelineStack stack inserendo il seguente comando.

$cdk deploy EcsAnywherePipelineStack
DevOps ingegnere

Testa la pipeline CI/CD.

  1. Apporta modifiche al codice dell'applicazione e invialo al repository locale di origine. GitLab Per ulteriori informazioni, consulta Opzioni push (GitLab documentazione). Ad esempio, modificate il ../application/index.html file per aggiornare il valore della versione dell'applicazione.

  2. Quando il codice viene replicato nel CodeCommit repository, viene avviata la pipeline CI/CD. Esegui una di queste operazioni:

    • Se utilizzi il mirroring automatico per sincronizzare il repository con il GitLab repository, continua con il CodeCommit passaggio successivo.

    • Se utilizzi il mirroring manuale, invia le modifiche al codice dell'applicazione al CodeCommit repository seguendo le istruzioni in Aggiornare un mirror (documentazione). GitLab

  3. Sul computer locale, in un browser Web, immettete http://localhost:80. Questo apre la pagina web di NGINX perché la porta 80 viene inoltrata a localhost in Vagrantfile. Conferma di poter visualizzare il valore della versione aggiornata dell'applicazione. Ciò convalida la distribuzione della pipeline e dell'immagine.

  4. (Facoltativo) Se desideri verificare la distribuzione nella Console di gestione AWS, procedi come segue:

    1. Apri la console Amazon ECS all'indirizzo https://console.aws.amazon.com/ecs/.

    2. Seleziona la Regione da utilizzare nella barra di navigazione.

    3. Nel pannello di navigazione scegli Cluster.

    4. Nella pagina Clusters, seleziona il EcsAnywhereClustercluster.

    5. Scegli Definizioni delle attività.

    6. Conferma che il contenitore è in funzione.

DevOps ingegnere
AttivitàDescrizioneCompetenze 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.

$cdk destroy EcsAnywherePipelineStack $cdk destroy EcsAnywhereInfraStack
DevOps ingegnere

Risoluzione dei problemi

ProblemaSoluzione

Errori relativi ai pacchetti mancanti durante l'installazione delle dipendenze dei pacchetti.

Immettete uno dei seguenti comandi per risolvere i pacchetti mancanti.

$npm ci

oppure

$npm install -g @aws-cdk/<package_name>

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.

$vagrant ssh $sudo systemctl restart ecs $sudo systemctl status ecs

Risorse correlate