Configurez un pipeline CI/CD pour les charges de travail hybrides sur Amazon ECS Anywhere à l'aide d'AWS CDK et GitLab - Recommandations AWS

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.

Configurez un pipeline CI/CD pour les charges de travail hybrides sur Amazon ECS Anywhere à l'aide d'AWS CDK et GitLab

Créée par le Dr Rahul Sharad Gaikwad (AWS)

Référentiel de code : amazon-ecs-anywhere-cicd - pipeline-cdk-sample

Environnement : PoC ou pilote

Technologies : cloud hybride ; conteneurs et microservices ; infrastructure ; DevOps

Charge de travail : Open source

Services AWS : AWS CDK ; AWS CodePipeline ; Amazon ECS ; AWS Systems Manager ; AWS CodeCommit

Récapitulatif

Amazon ECS Anywhere est une extension d'Amazon Elastic Container Service (Amazon ECS). Elle prend en charge l'enregistrement d'une instance externe, telle qu'un serveur sur site ou une machine virtuelle (VM), sur votre cluster Amazon ECS. Cette fonctionnalité permet de réduire les coûts et d'atténuer l'orchestration et les opérations complexes des conteneurs locaux. Vous pouvez utiliser ECS Anywhere pour déployer et exécuter des applications de conteneur dans des environnements sur site et dans le cloud. Ainsi, votre équipe n'a plus besoin d'apprendre plusieurs domaines et compétences, ou de gérer elle-même des logiciels complexes.

Ce modèle décrit une step-by-step approche pour approvisionner un cluster Amazon ECS avec des instances Amazon ECS Anywhere à l'aide de piles Amazon Web Services (AWS) Cloud Development Kit (AWS CDK). Vous utilisez ensuite AWS CodePipeline pour configurer un pipeline d'intégration et de déploiement continus (CI/CD). Ensuite, vous répliquez votre référentiel de GitLab code sur AWS CodeCommit et vous déployez votre application conteneurisée sur le cluster Amazon ECS.

Ce modèle est conçu pour aider ceux qui utilisent une infrastructure sur site à exécuter des applications de conteneur et GitLab à gérer la base de code de l'application. Vous pouvez gérer ces charges de travail à l'aide des services cloud AWS, sans perturber votre infrastructure sur site existante.

Conditions préalables et limitations

Prérequis

Limites

Versions du produit

  • AWS CDK Toolkit version 2.27.0 ou ultérieure

  • npm version 7.20.3 ou ultérieure

  • Node.js version 16.6.1 ou ultérieure

Architecture

Pile technologique cible

  • 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)

  • Gestionnaire du système AWS

  • GitLab référentiel

Architecture cible

Schéma d'architecture de configuration du cluster Amazon ECS et du pipeline CI/CD.

Ce diagramme représente deux flux de travail principaux décrits dans ce modèle, à savoir le provisionnement du cluster Amazon ECS et la configuration du pipeline CI/CD qui configure et déploie le pipeline CI/CD, comme suit :

  1. Provisionnement du cluster Amazon ECS

    1. Lorsque vous déployez la première pile AWS CDK, elle crée une CloudFormation pile sur AWS.

    2. Cette CloudFormation pile fournit un cluster Amazon ECS et les ressources AWS associées.

    3. Pour enregistrer une instance externe auprès d'un cluster Amazon ECS, vous devez installer l'agent AWS Systems Manager (agent SSM) sur votre machine virtuelle et enregistrer la machine virtuelle en tant qu'instance gérée par AWS Systems Manager. 

    4. Vous devez également installer l'agent de conteneur Amazon ECS et Docker sur votre machine virtuelle pour l'enregistrer en tant qu'instance externe auprès du cluster Amazon ECS.

    5. Lorsque l'instance externe est enregistrée et configurée avec le cluster Amazon ECS, elle peut exécuter plusieurs conteneurs sur votre machine virtuelle, qui est enregistrée en tant qu'instance externe.

    6. Le cluster Amazon ECS est actif et peut exécuter les charges de travail des applications via des conteneurs. L'instance de conteneur Amazon ECS Anywhere s'exécute dans un environnement sur site mais est associée au cluster Amazon ECS dans le cloud.

  2. Configuration et déploiement du pipeline CI/CD

    1. Lorsque vous déployez la deuxième pile AWS CDK, elle en crée une autre CloudFormation sur AWS.

    2. Cette CloudFormation pile fournit un pipeline dans les ressources AWS CodePipeline et les ressources associées.

    3. Vous transférez et fusionnez les modifications du code de l'application dans un GitLab référentiel local. 

    4. Le GitLab référentiel est automatiquement répliqué dans le CodeCommit référentiel.

    5. Les mises à jour du CodeCommit dépôt CodePipeline démarrent automatiquement. 

    6. CodePipeline copie le code depuis CodeCommit et crée l'application déployable intégrée. CodeBuild

    7. CodePipeline crée une image Docker de l'environnement de CodeBuild construction et l'envoie vers le dépôt Amazon ECR.

    8. CodePipeline lance des CodeDeploy actions qui extraient l'image du conteneur depuis le dépôt Amazon ECR.

    9. CodePipeline déploie l'image du conteneur sur le cluster Amazon ECS.

Automatisation et mise à l'échelle

Ce modèle utilise le CDK AWS comme outil d'infrastructure sous forme de code (IaC) pour configurer et déployer cette architecture. AWS CDK vous aide à orchestrer les ressources AWS et à configurer Amazon ECS Anywhere et le pipeline CI/CD.

Outils

Services AWS

  • AWS Cloud Development Kit (AWS CDK) est un framework de développement logiciel qui vous aide à définir et à provisionner l'infrastructure du cloud AWS sous forme de code.

  • AWS CodeCommit est un service de contrôle de version qui vous permet de stocker et de gérer de manière privée des référentiels Git, sans avoir à gérer votre propre système de contrôle de source.

  • AWS vous CodePipeline aide à modéliser et à configurer rapidement les différentes étapes d'une version logicielle et à automatiser les étapes nécessaires à la publication continue des modifications logicielles.

  • L'interface de ligne de commande AWS (AWS CLI) est un outil open source qui vous permet d'interagir avec les services AWS par le biais de commandes dans votre shell de ligne de commande.

  • Amazon Elastic Container Registry (Amazon ECR) est un service géré de registre d'images de conteneurs sécurisé, évolutif et fiable.

  • Amazon Elastic Container Service (Amazon ECS) est un service de gestion de conteneurs évolutif et rapide, qui facilite l'exécution, l'arrêt et la gestion de conteneurs Docker sur un cluster. Ce modèle utilise également Amazon ECS Anywhere, qui permet d'enregistrer un serveur ou une machine virtuelle sur site dans votre cluster Amazon ECS.

Autres outils

  • Node.js est un environnement d' JavaScript exécution piloté par les événements conçu pour créer des applications réseau évolutives.

  • npm est un registre de logiciels qui s'exécute dans un environnement Node.js et est utilisé pour partager ou emprunter des packages et gérer le déploiement de packages privés.

  • Vagrant est un utilitaire open source permettant de créer et de maintenir des environnements de développement de logiciels virtuels portables. À des fins de démonstration, ce modèle utilise Vagrant pour créer une machine virtuelle sur site.

Référentiel de code

Le code de ce modèle est disponible dans le pipeline GitHub CI/CD pour Amazon ECS Anywhere à l'aide du référentiel AWS CDK.

Bonnes pratiques

Tenez compte des meilleures pratiques suivantes lors du déploiement de ce modèle :

Épopées

TâcheDescriptionCompétences requises

Vérifiez la version du kit AWS CDK.

Vérifiez la version du kit d'outils AWS CDK en saisissant la commande suivante.

cdk --version

Ce modèle nécessite la version 2.27.0 ou ultérieure. Si vous disposez d'une version antérieure, suivez les instructions de la documentation AWS CDK pour la mettre à jour.

DevOps ingénieur

Vérifiez la version de npm.

Vérifiez la version de npm en saisissant la commande suivante.

npm --version

Ce modèle nécessite la version 7.20.3 ou ultérieure. Si vous avez une version antérieure, suivez les instructions de la documentation de npm pour la mettre à jour.

DevOps ingénieur

Configurez les informations d'identification AWS.

Configurez les informations d'identification AWS en saisissant la aws configure commande et en suivant les instructions.

$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 ingénieur
TâcheDescriptionCompétences requises

Clonez le référentiel de code AWS CDK.

  1. Clonez le pipeline CI/CD pour Amazon ECS Anywhere à l'aide du référentiel AWS CDK pour ce modèle en saisissant la commande suivante.

    git clone https://github.com/aws-samples/amazon-ecs-anywhere-cicd-pipeline-cdk-sample.git
  2. Accédez au répertoire cloné en saisissant la commande suivante.

    cd amazon-ecs-anywhere-cicd-pipeline-cdk-sample
DevOps ingénieur

Démarrez l'environnement.

Déployez le CloudFormation modèle sur le compte et la région AWS que vous souhaitez utiliser en saisissant la commande suivante.

cdk bootstrap <account-number>/<Region>

Pour plus d'informations, consultez la section Bootstrapping dans la documentation AWS CDK.

DevOps ingénieur
TâcheDescriptionCompétences requises

Installez les dépendances du package et compilez les TypeScript fichiers.

Installez les dépendances du package et compilez les TypeScript fichiers en saisissant les commandes suivantes.

$cd EcsAnywhereCdk $npm install $npm fund 

Ces commandes installent tous les packages du référentiel d'échantillons. Pour plus d'informations, consultez npm ci et npm install dans la documentation de npm. Si vous recevez des erreurs concernant des packages manquants lorsque vous entrez ces commandes, consultez la section Dépannage de ce modèle.

DevOps ingénieur

Générez le projet.

Pour créer le code du projet, entrez la commande suivante.

npm run build

Pour plus d'informations sur la création et le déploiement du projet, consultez Votre première application AWS CDK dans la documentation du CDK AWS.

DevOps ingénieur

Déployez la pile d'infrastructure Amazon ECS Anywhere.

  1. Répertoriez les piles en saisissant la commande suivante.

    $cdk list
  2. Vérifiez que la sortie renvoie les ECSAnywherePipelineStack piles EcsAnywhereInfraStack et.

  3. Déployez la EcsAnywhereInfraStack pile en saisissant la commande suivante.

    $cdk  deploy EcsAnywhereInfraStack
DevOps ingénieur

Vérifiez la création et la sortie de la pile.

  1. Connectez-vous à l'AWS Management Console et ouvrez-la à l' CloudFormation adresse https://console.aws.amazon.com/cloudformation/.

  2. Sur la page Stacks, sélectionnez la EcsAnywhereInfraStack pile.

  3. Vérifiez que l'état de la pile est l'un CREATE_IN_PROGRESS ou l'autreCREATE_COMPLETE.

    La configuration du cluster Amazon ECS peut prendre un certain temps. Ne poursuivez pas tant que la création de la pile n'est pas terminée.

DevOps ingénieur
TâcheDescriptionCompétences requises

Configurez votre machine virtuelle.

Créez une machine virtuelle Vagrant en entrant la vagrant up commande depuis le répertoire racine où se trouve Vagrantfile. Pour plus d'informations, consultez la documentation de Vagrant.

DevOps ingénieur

Enregistrez votre machine virtuelle en tant qu'instance externe.

  1. Connectez-vous à la machine virtuelle Vagrant à l'aide de la vagrant ssh commande. Pour plus d'informations, consultez la documentation de Vagrant.

  2. Installez l'AWS CLI sur la machine virtuelle en suivant les instructions d'installation de l'AWS CLI et en saisissant les commandes suivantes. 

    $ 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. Créez un code d'activation et un identifiant que vous pouvez utiliser pour enregistrer votre machine virtuelle auprès d'AWS Systems Manager et pour activer votre instance externe. Le résultat de cette commande inclut les valeurs de l'ID d'activation et du code d'activation.

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

    Si vous recevez un message d'erreur lorsque vous exécutez cette commande, consultez la section Dépannage.

  2. Exportez l'ID d'activation et les valeurs du code.

    export ACTIVATION_ID=<activation-ID> export ACTIVATION_CODE=<activation-code>
  3. Téléchargez le script d'installation sur votre machine virtuelle.

    curl --proto "https" -o "ecs-anywhere-install.sh" \ > "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh"
  4. Exécutez le script d'installation sur votre machine virtuelle.

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

Cela permet de configurer votre machine virtuelle en tant qu'instance externe Amazon ECS Anywhere et d'enregistrer l'instance dans le cluster Amazon ECS. Pour plus d'informations, consultez la section Enregistrement d'une instance externe dans un cluster dans la documentation Amazon ECS. Si vous rencontrez des problèmes, consultez la section Dépannage.

DevOps ingénieur

Vérifiez l'état d'Amazon ECS Anywhere et de la machine virtuelle externe.

Pour vérifier si votre machine virtuelle est connectée au plan de contrôle Amazon ECS et en cours d'exécution, utilisez les commandes suivantes.

$aws ssm describe-instance-information $aws ecs list-container-instances --cluster $CLUSTER_NAME
DevOps ingénieur
TâcheDescriptionCompétences requises

Créez une branche dans le CodeCommit dépôt.

Créez une branche nommée main dans le CodeCommit dépôt en créant le premier commit pour le référentiel. Vous pouvez suivre la documentation AWS pour créer un commit dans CodeCommit. Voici un exemple de commande.

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 ingénieur

Configurez la mise en miroir des dépôts.

Vous pouvez mettre en miroir un GitLab référentiel depuis et vers des sources externes. Vous pouvez sélectionner le référentiel qui servira de source. Les branches, les tags et les commits sont synchronisés automatiquement. Configurez un miroir push entre le GitLab référentiel hébergeant votre application et le CodeCommit référentiel. Pour obtenir des instructions, voir Configurer un miroir push de GitLab à CodeCommit (GitLab documentation).

Remarque : Par défaut, la mise en miroir synchronise automatiquement le référentiel. Si vous souhaitez mettre à jour les référentiels manuellement, voir Mettre à jour un miroir (GitLab documentation).

DevOps ingénieur

Déployez la pile de pipelines CI/CD.

Déployez la EcsAnywherePipelineStack pile en saisissant la commande suivante.

$cdk  deploy EcsAnywherePipelineStack
DevOps ingénieur

Testez le pipeline CI/CD.

  1. Modifiez le code de l'application et transférez-le vers le GitLab dépôt source sur site. Pour plus d'informations, consultez Options push (GitLab documentation). Par exemple, modifiez le ../application/index.html fichier pour mettre à jour la valeur de version de l'application.

  2. Lorsque le code est répliqué dans le CodeCommit dépôt, le pipeline CI/CD démarre. Effectuez l’une des actions suivantes :

    • Si vous utilisez la mise en miroir automatique pour synchroniser le GitLab dépôt avec le CodeCommit dépôt, passez à l'étape suivante.

    • Si vous utilisez la mise en miroir manuelle, transférez les modifications du code de l'application vers le CodeCommit dépôt en suivant les instructions de la section Mettre à jour un miroir (GitLab documentation).

  3. Sur votre ordinateur local, dans un navigateur Web, entrez http://localhost:80. Cela ouvre la page Web de NGINX car le port 80 est redirigé vers localhost dans Vagrantfile. Vérifiez que vous pouvez consulter la valeur de version mise à jour de l'application. Cela valide le déploiement du pipeline et de l'image.

  4. (Facultatif) Si vous souhaitez vérifier le déploiement dans l'AWS Management Console, procédez comme suit :

    1. Ouvrez la console Amazon ECS à partir de l'adresse https://console.aws.amazon.com/ecs/.

    2. Dans la barre de navigation, sélectionnez la région à utiliser.

    3. Dans le panneau de navigation, choisissez Clusters.

    4. Sur la page Clusters, sélectionnez le EcsAnywhereClustercluster.

    5. Choisissez Définitions de tâches.

    6. Vérifiez que le conteneur est en cours d'exécution.

DevOps ingénieur
TâcheDescriptionCompétences requises

Nettoyez et supprimez les ressources.

Après avoir suivi ce modèle, vous devez supprimer les proof-of-concept ressources que vous avez créées. Pour nettoyer, entrez les commandes suivantes.

$cdk destroy EcsAnywherePipelineStack $cdk destroy EcsAnywhereInfraStack
DevOps ingénieur

Résolution des problèmes

ProblèmeSolution

Erreurs relatives à des packages manquants lors de l'installation des dépendances des packages.

Entrez l'une des commandes suivantes pour résoudre les packages manquants.

$npm ci

or

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

Lorsque vous exécutez la aws ssm create-activation commande sur la machine virtuelle, le message d'erreur suivant s'affiche.

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

La EcsAnywhereInfraStack pile n'est pas complètement déployée et le rôle IAM nécessaire pour exécuter cette commande n'a pas encore été créé. Vérifiez l'état de la pile dans la CloudFormation console. Réessayez la commande une fois que le statut est passé àCREATE_COMPLETE.

Un bilan de santé Amazon ECS est renvoyé et l'erreur suivante s'affiche dans la section Services du cluster de la console Amazon ECS. UNHEALTHY

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.

Redémarrez l'agent Amazon ECS sur votre machine virtuelle Vagrant en saisissant les commandes suivantes.

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

Ressources connexes