Skip to main content

Déploiement sur Amazon Elastic Container Service

Vous pouvez effectuer un déploiement sur ECS (Amazon Elastic Container Service) dans le cadre de vos workflows de déploiement continu (CD).

Remarque : Les exécuteurs hébergés sur GitHub ne sont pas pris en charge sur GitHub Enterprise Server. Vous pouvez voir plus d’informations sur le support futur planifié dans la GitHub public roadmap.

Introduction

Ce guide explique comment utiliser GitHub Actions pour créer une application conteneurisée, l’envoyer (push) à Amazon Elastic Container Registry (INTUNE) et la déployer sur Amazon Elastic Container Service (ECS) en cas d’envoi (push) vers la branche main.

À chaque envoi (push) main dans votre référentiel GitHub, le workflow GitHub Actions génère et envoie (push) une nouvelle image conteneur vers Amazon ECR, puis déploie une nouvelle définition de tâche vers Amazon ECS.

Remarque : Si vos workflows GitHub Actions doivent accéder aux ressources d’un fournisseur de cloud qui prend en charge OpenID Connecter (OIDC), vous pouvez configurer vos workflows pour qu’ils s’authentifient directement auprès du fournisseur de cloud. Cela vous permet d’arrêter de stocker ces informations d’identification en tant que secrets de longue durée, et de fournir d’autres avantages en matière de sécurité. Pour plus d’informations, consultez « À propos du renforcement de la sécurité avec OpenID Connect ». et « Configuration d’OpenID Connect dans Amazon Web Services ».

Prérequis

Avant de créer votre workflow GitHub Actions, vous devez suivre les étapes de configuration suivantes pour Amazon ECR et ECS :

  1. Créez un référentiel Amazon ECR pour stocker vos images.

    Par exemple à l’aide de l’interface CLI AWS :

    Bash
    aws ecr create-repository \
        --repository-name MY_ECR_REPOSITORY \
        --region MY_AWS_REGION
    
    

    Vérifiez que vous utilisez le même nom de référentiel Amazon ECR (représenté ici par MY_ECR_REPOSITORY) pour la variable ECR_REPOSITORY dans le flux de travail ci-dessous.

    Vérifiez que vous utilisez la même valeur de région AWS pour la variable AWS_REGION (représentée ici par MY_AWS_REGION) dans le flux de travail ci-dessous.

  2. Créez une définition de tâche, un cluster et un service Amazon ECS.

    Pour plus d’informations, suivez l’assistant de démarrage sur la console Amazon ECS ou le guide de démarrage dans la documentation Amazon ECS.

    Veillez à noter les noms que vous avez définis pour le service et le cluster Amazon ECS et à les utiliser pour les variables ECS_SERVICE et ECS_CLUSTER dans le flux de travail ci-dessous.

  3. Stockez votre définition de tâche Amazon ECS en tant que fichier JSON dans votre référentiel GitHub.

    Le format du fichier doit être identique à la sortie générée par :

    Bash
    
    aws ecs register-task-definition --generate-cli-skeleton
    
    

    Vérifiez que vous définissez la variable ECS_TASK_DEFINITION dans le flux de travail ci-dessous comme chemin d’accès au fichier JSON.

    Vérifiez que vous définissez la variable CONTAINER_NAME dans le flux de travail ci-dessous comme nom du conteneur dans la section containerDefinitions de la définition de tâche.

  4. Créez des secrets GitHub Actions nommés AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY pour stocker les valeurs de votre clé d’accès Amazon IAM.

    Pour plus d’informations sur la création des secrets pour GitHub Actions, consultez « Utilisation de secrets dans GitHub Actions ».

    Consultez la documentation de chaque action utilisée ci-dessous pour les stratégies IAM recommandées pour l’utilisateur IAM et les méthodes de gestion des informations d’identification de clé d’accès.

  5. Si vous le souhaitez, configurez un environnement de déploiement. Les environnements sont utilisés pour décrire une cible de déploiement général comme production, staging ou development. Quand un workflow GitHub Actions est déployé dans un environnement, l’environnement s’affiche dans la page principale du dépôt. Vous pouvez utiliser des environnements pour exiger l’approbation d’un travail, restreindre les branches pouvant déclencher un workflow, contrôler les déploiements avec des règles de protection de déploiement personnalisées, ou limiter l’accès aux secrets. Pour plus d’informations sur la création d’environnements, consultez « Gestion des environnements pour le déploiement ».

Création du workflow

Une fois les conditions préalables remplies, vous pouvez procéder à la création du workflow.

L’exemple de flux de travail suivant montre comment créer une image conteneur et l’envoyer à Amazon ECR. Il met ensuite à jour la définition de tâche avec le nouvel ID d’image et déploie la définition de tâche sur Amazon ECS.

Vérifiez que vous fournissez vos propres valeurs pour toutes les variables dans la clé env du flux de travail.

Si vous avez configuré un environnement de déploiement, remplacez la valeur environment par le nom de votre environnement. Si vous n’avez pas configuré d’environnement , supprimez la clé environment.

YAML
# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub.
# Elles sont fournies par un tiers et régies par
# des conditions d’utilisation du service, une politique de confidentialité et un support distincts.
# documentation en ligne.

# GitHub recommande d’épingler les actions à un SHA de commit.
# Pour obtenir une version plus récente, vous devez mettre à jour le SHA.
# Vous pouvez également référencer une balise ou une branche, mais l’action peut changer sans avertissement.

name: Deploy to Amazon ECS

on:
  push:
    branches:
      - main

env:
  AWS_REGION: MY_AWS_REGION                   # set this to your preferred AWS region, e.g. us-west-1
  ECR_REPOSITORY: MY_ECR_REPOSITORY           # set this to your Amazon ECR repository name
  ECS_SERVICE: MY_ECS_SERVICE                 # set this to your Amazon ECS service name
  ECS_CLUSTER: MY_ECS_CLUSTER                 # set this to your Amazon ECS cluster name
  ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition
                                               # file, e.g. .aws/task-definition.json
  CONTAINER_NAME: MY_CONTAINER_NAME           # set this to the name of the container in the
                                               # containerDefinitions section of your task definition

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@0e613a0980cbf65ed5b322eb7a1e075d28913a83
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@62f4f872db3836360b72999f4b87f1ff13310f3a

      - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          IMAGE_TAG: ${{ github.sha }}
        run: |
          # Build a docker container and
          # push it to ECR so that it can
          # be deployed to ECS.
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT

      - name: Fill in the new image ID in the Amazon ECS task definition
        id: task-def
        uses: aws-actions/amazon-ecs-render-task-definition@c804dfbdd57f713b6c079302a4c01db7017a36fc
        with:
          task-definition: ${{ env.ECS_TASK_DEFINITION }}
          container-name: ${{ env.CONTAINER_NAME }}
          image: ${{ steps.build-image.outputs.image }}

      - name: Deploy Amazon ECS task definition
        uses: aws-actions/amazon-ecs-deploy-task-definition@df9643053eda01f169e64a0e60233aacca83799a
        with:
          task-definition: ${{ steps.task-def.outputs.task-definition }}
          service: ${{ env.ECS_SERVICE }}
          cluster: ${{ env.ECS_CLUSTER }}
          wait-for-service-stability: true

Ressources supplémentaires

Pour le modèle de workflow d’origine, consultez aws.yml dans le référentiel GitHub Actions starter-workflows.

Pour plus d’informations sur les services utilisés dans ces exemples, consultez la documentation suivante :