Le Blog Amazon Web Services

Créez un pipeline de livraison continue pour vos images de conteneur avec Amazon ECR comme source

Depuis le 27 Novembre 2018, il est possible d’utiliser Amazon Elastic Container Registry (Amazon ECR) comme fournisseur de source dans AWS CodePipeline. Il est ainsi possible de déclencher une mise à jour d’un pipeline AWS CodePipeline simplement en téléchargeant une nouvelle image sur Amazon ECR. Cela facilite la création et la configuration d’un pipeline de livraison continue (Contiuous Delivery) utilisant les outils de développement AWS pour CI/CD.

Vous pouvez utiliser Amazon ECR comme source si vous implémentez un déploiement bleu/vert avec AWS CodeDeploy. Pour plus d’informations sur l’utilisation de la console Amazon Elastic Container Service (Amazon ECS) pour implémenter un déploiement bleu / vert sans AWS CodePipeline, consultez Création d’un service à l’aide d’un déploiement bleu/vert.

Cet article illustre comment créer un pipeline de déploiement continu (CD) complet et de bout en bout avec Amazon ECR et AWS CodePipeline. Il vous guidera tout au long de la configuration d’un pipeline pour créer vos images lorsque l’image de base en amont est mise à jour.

Prérequis

Pour la suite de l’article, vous aurez besoin des ressources suivantes :

  • Un référentiel de code source contenant le fichier Dockerfile décrivant l’image de base ainsi qu’un référentiel d’images Docker pour stocker votre image. Dans cet exemple, nous utilisons pour l’image de base un fichier Dockerfile contenant simplement les directives suivantes:
FROM alpine:3.8 
RUN apk update 
RUN apk add nodejs
  • Un référentiel avec le fichier Dockerfile de votre application et son code source ainsi qu’un référentiel pour stocker votre image Docker. Pour le fichier Dockerfile de l’application, nous utilisons notre image de base à laquelle on ajoutera notre code d’application :
FROM 012345678910.dkr.ecr.us-east-1.amazonaws.com/base-image
ENV PORT=80
EXPOSE $PORT
COPY app.js /app/
CMD ["node", "/app/app.js"]

Remarque: Remplacez 012345678919 par l’ID de votre compte AWS et us-east-1 par la région dans laquelle vous déployez vos ressources.

Cet exemple utilise AWS CodeCommit pour les référentiels de code source et Amazon ECR pour les référentiels d’images Docker. Pour plus d’informations, consultez Créer un référentiel AWS CodeCommit dans le guide d’utilisateur AWS CodeCommit et Création d’un référentiel dans le guide d’utilisateur Amazon ECR.

Remarque: les référentiels de code source et les référentiels d’images doivent être créés dans la même région AWS.

Configurer les rôles de service IAM (Identity and Access Management)

Dans cet exemple, on utilise AWS CodeBuild et AWS CodePipeline pour créer les images Docker et les pousser vers Amazon ECR. Les deux services utilisent des rôles de service de gestion des identités et des accès (IAM) pour effectuer des appels à l’API d’Amazon ECR. Les rôles de service doivent avoir une stratégie qui fournit des autorisations pour effectuer ces appels à l’API Amazon ECR. La procédure suivante utilise la console IAM pour créer un rôle de service auquel on attachera les autorisations nécessaires pour le bon fonctionnement de AWS CodeBuild.

Création d’un rôle de service pour AWS CodeBuild

Suivez ces étapes pour créer un rôle de service AWS CodeBuild en utilisant la console IAM.
À l’étape 10, assurez-vous d’ajouter également la stratégie AmazonEC2ContainerRegistryPowerUser à votre rôle.

Création d’un fichier de spécification de build pour l’image de base

Un fichier de spécification de build (ou build spec) est une suite de commandes de build et de paramètres associés, au format YAML, qu’AWS CodeBuild utilise pour exécuter un build. Ajoutez un fichier buildspec.yml à votre référentiel de code source pour indiquer à AWS CodeBuild comment créer votre image de base. L’exemple de spécification de construction utilisé ici réalise les étapes suivantes :

  • Étape de pre-build :
    • Connexion à Amazon ECR,
    • Définition de l’URI du référentiel vers votre image ECR et ajout d’un tag d’image avec les sept premiers caractères de l’ID du commit Git.
  • Étape de build :
    • Création de l’image Docker et ajout d’un tag à l’image avec latest et l’ID du commit Git.
  • Étape post-build :
    • Envoi de l’image avec les deux tags dans votre référentiel Amazon ECR.
version: 0.2
phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
      - REPOSITORY_URI=012345678910.dkr.ecr.us-east-1.amazonaws.com/base-image
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG

Ajout d’un fichier buildspec.yml à votre référentiel source

  1. Ouvrez un éditeur de texte, puis copiez et collez la spécification de build ci-dessus dans un nouveau fichier.
  2. Remplacez REPOSITORY_URI avec sa valeur (012345678910.dkr.ecr.us-east-1.amazonaws.com/base-image) par votre URI de référentiel Amazon ECR (sans aucun tag d’image) pour votre image Docker. Remplacez base-image par le nom de votre image Docker de base.
  3. Faites un Commit puis un Push de votre fichier buildspec.yml vers votre référentiel de code source.

git add .
git commit -m "Adding build specification."
git push

Création d’un fichier de spécification de build pour votre application

Ajoutez un fichier buildspec.yml à votre référentiel de code source pour indiquer à AWS CodeBuild comment construire votre code source et l’image de votre application. L’exemple de spécification de build utilisé ici décrit les étapes suivantes :

  • Étape de pre-build :
    • Connexion à Amazon ECR,
    • Définition de l’URI du référentiel vers votre image ECR et ajout d’un tag d’image avec les sept premiers caractères de l’ID de build CodeBuild.
  • Étape de build :
    • Création de l’image Docker et ajout de tag d’image avec latest et l’ID du commit Git.
  • Étape post-build :
    • Enregistrement de l’image avec les deux tags dans votre référentiel ECR.
version: 0.2
phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 012345678910.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
      - REPOSITORY_URI=012345678910.dkr.ecr.us-east-1.amazonaws.com/hello-world
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=build-$(echo $CODEBUILD_BUILD_ID | awk -F":" '{print $2}')
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
artifacts:
  files:
    - imageDetail.json

Remarque: Pour REPOSITORY_URI, remplacez 012345678919 par l’ID de votre compte AWS et us-east-1 par la région dans laquelle vous déployez vos ressources.

Pour ajouter un fichier buildspec.yml à votre référentiel source

  1. Ouvrez un éditeur de texte, puis copiez et collez la spécification de build ci-dessus dans un nouveau fichier.
  2. Remplacez 012345678910 par votre ID de compte dans la commande suivante: aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 012345678910.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
  3. Remplacez REPOSITORY_URI avec sa valeur (012345678910.dkr.ecr.us-east-1.amazonaws.com/hello-world) par votre URI de référentiel Amazon ECR (sans aucun tag d’image) pour votre image Docker. Remplacez hello-world par le nom du conteneur dans la définition de tâche de votre service qui fait référence à votre image Docker.
  4. Faites un Commit puis un Push de votre fichier buildspec.yml vers votre référentiel de code source.

git add .
git commit -m "Adding build specification."
git push

Création d’un pipeline de déploiement continu pour votre image de base

Utilisez AWS CodePipeline pour créer vos étapes de pipeline:

  1. Ouvrez la console AWS CodePipeline à l’adresse https://console.aws.amazon.com/codepipeline/.
  2. Sur la page de Bienvenue, choisissez Créer un pipeline. Si c’est la première fois que vous utilisez AWS CodePipeline, une page d’introduction apparaît à la place de bienvenue. Choisissez Commencer maintenant.
  3. Dans l’étape 1: Paramètres de pipeline, saisissez le nom de votre pipeline dans le champs Nom de pipeline, et cliquez sur Suivant. Pour cette procédure pas à pas, le nom du pipeline est base-image.
  4. Dans l’étape 2: Source, pour le Fournisseur Source, choisissez AWS CodeCommit.
    1. Pour Nom du référentiel, choisissez le nom du référentiel AWS CodeCommit à utiliser comme emplacement source pour votre pipeline.
    2. Pour Nom de la branche, choisissez la branche à utiliser, puis cliquez sur suivant.
  5. Dans l’étape 3: Génération (Build), choisissez AWS CodeBuild, puis choisissez Créer un projet.
    1. Pour Nom du projet, choisissez un nom unique pour votre projet de génération. Pour cette procédure pas à pas, le nom du projet est base-image.
    2. Pour Système d’exploitation, choisissez Ubuntu.
    3. Pour Environnement(s) d’exécution, choisissez Standard.
    4. Pour Image, choisissez aws/codebuild/standard:5.0.
    5. Pour Privilégié, cochez la case Activer cet indicateur si vous souhaitez créer des images Docker ou pour que vos générations bénéficient de privilèges élevés.
    6. Pour Rôle de service, cliquez sur Rôle de service existant, puis choisissez le rôle de service CodeBuild que vous avez créé précédemment, puis décochez la case Autoriser AWS CodeBuild à modifier ce rôle de service afin qu’il puisse être utilisé avec ce projet de génération.
    7. Cliquez sur Continuer vers CodePipeline.
    8. Cliquez sur Suivant.
  6. Dans l’étape 4: Déploiement, choisissez Ignorer l’étape de déploiement et acceptez le warning de la pop up.
  7. Dans l’étape 5: Révision, vérifiez la configuration de votre pipeline, puis choisissez Créer un pipeline.

Création d’un pipeline de déploiement continu pour l’image de votre application

L’exécution du pipeline d’image applicative est déclenchée par des modifications du code source de l’application et par des modifications de l’image de base en amont. Vous créez d’abord un pipeline, puis vous le modifiez pour ajouter une deuxième étape Source.

  1. Ouvrez la console AWS CodePipeline à l’adresse https://console.aws.amazon.com/codepipeline/.
  2. Sur la page Bienvenue, choisissez Créer un pipeline.
  3. Dans l’étape 1: Paramètres de pipeline, pour le nom du pipeline, tapez le nom de votre pipeline. Pour cette procédure pas à pas, le nom du pipeline est hello-world.
  4. Pour le Rôle de service, choisissez Nouveau rôle de service. Cliquez ensuite sur Suivant.
  5. Dans l’étape 2: Source, pour le Fournisseur Source, choisissez Amazon ECR.
    1. Pour Nom du référentiel, choisissez le nom du référentiel Amazon ECR à utiliser comme emplacement source pour votre pipeline. Pour cette procédure pas à pas, le nom du référentiel est base-image.

  1. Dans l’étape 3: Génération, choisissez AWS CodeBuild, puis choisissez Créer un projet,
    1. Pour Nom du projet, choisissez un nom unique pour votre projet de génération. Pour cette procédure pas à pas, le nom du projet est hello-world.
    2. Pour Système d’exploitation, choisissez Ubuntu.
    3. our Environnement(s) d’exécution, choisissez Standard.
    4. Pour Image, choisissez aws/codebuild/standard:5.0.
    5. Pour Privilégié, cochez la case Activer cet indicateur si vous souhaitez créer des images Docker ou pour que vos générations bénéficient de privilèges élevés.
    6. Pour Rôle de service, cliquez sur Rôle de service existant, puis choisissez le rôle de service CodeBuild que vous avez créé précédemment, puis décochez la case Autoriser AWS CodeBuild à modifier ce rôle de service afin qu’il puisse être utilisé avec ce projet de génération.
    7. Cliquez sur Continuer vers CodePipeline.
    8. Cliquez sur Suivant.
  2. Dans l’étape 4: Déploiement, choisissez Ignorer l’étape de déploiement et acceptez le warning de la pop up.
  3. Dans l’étape 5: Révision, vérifiez la configuration de votre pipeline, puis choisissez Créer un pipeline.

Le pipeline échouera, car il manque le code source de l’application. Vous modifiez ensuite le pipeline pour ajouter une action supplémentaire à l’étape source.

  1. Ouvrez la console AWS CodePipeline à l’adresse https://console.aws.amazon.com/codepipeline/.
  2. Sur la page Bienvenue, choisissez votre pipeline dans la liste. Pour cette procédure pas à pas, le nom du pipeline est hello-world.
  3. Sur la page du pipeline, choisissez Modifier.
  4. Sur la page Édition: hello-world, dans Modifier: Source, choisissez Modifier l’étape.
  5. Cliquez sur l’icône d’édition de la Source existante
    1. Remplacez les Artefacts de sortie par BaseImage, puis cliquez sur Effectué.
  6. Cliquez sur Ajouter une action, puis entrez un nom pour l’action (par exemple, Code).
    1. Pour Fournisseur d’action, choisissez AWS CodeCommit.
    2. Pour Nom du référentiel, choisissez le nom du référentiel AWS CodeCommit pour le code source de votre application.
    3. Pour le Nom de la branche, choisissez la branche.
    4. Pour les Artefacts de sortie, spécifiez SourceArtifact, puis cliquez sur Effectué.
  7. Sur la page Modification: hello-world, cliquez sur Enregistrer et acceptez l’avertissement contextuel.

Testez votre pipeline de bout en bout

Votre pipeline doit avoir tout ce qu’il faut pour exécuter un déploiement continu AWS natif de bout en bout. Vous pouvez maintenant tester ses fonctionnalités en poussant un changement de code dans votre référentiel d’images de base.

  1. Apportez une modification à votre référentiel source configuré, puis validez et transmettez la modification.
  2. Ouvrez la console AWS CodePipeline à l’adresse https://console.aws.amazon.com/codepipeline/.
  3. Choisissez votre pipeline dans la liste.
  4. Regardez le pipeline progresser à travers ses étapes. Au fur et à mesure que l’image de base est créée et transmise à Amazon ECR, voyez également comment le deuxième pipeline est déclenché. Lorsque l’exécution de votre pipeline est terminée, l’image de votre application est poussée vers Amazon ECR et vous êtes maintenant prêt à déployer votre application. Pour plus d’informations sur le déploiement continu de votre application, consultez Créer un pipeline avec une source Amazon ECR et un déploiement d’ECS vers CodeDeploy dans le guide d’utilisateur AWS CodePipeline.

Conclusion

Dans cet article, nous vous avons montré comment créer un pipeline de déploiement continu (CD) complet et de bout en bout avec Amazon ECR et AWS CodePipeline. Vous avez vu comment lancer une mise à jour du pipeline AWS CodePipeline en téléchargeant une nouvelle image sur Amazon ECR. La prise en charge d’Amazon ECR dans AWS CodePipeline facilite la configuration d’un pipeline de livraison continue et l’utilisation des outils de développement AWS pour CI/CD.

Article original réalisé par Daniele Stroppa et traduit en français par Zineb Swidnane, Solutions Architect dans l’équipe AWS France.