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 :
-
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
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 variableECR_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 parMY_AWS_REGION
) dans le flux de travail ci-dessous. -
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
etECS_CLUSTER
dans le flux de travail ci-dessous. -
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
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 sectioncontainerDefinitions
de la définition de tâche. -
Créez des secrets GitHub Actions nommés
AWS_ACCESS_KEY_ID
etAWS_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.
-
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
oudevelopment
. 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 ou si votre workflow se trouve dans un référentiel privé et que vous n’utilisez pas GitHub Enterprise Cloud, supprimez la clé environment
.
# 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
# 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 :
- « Meilleures pratiques de sécurité dans IAM » dans la documentation Amazon AWS.
- Action officielle AWS « Configurer les informations d’identification AWS ».
- Action officielle AWS « Connexion » Amazon ECR.
- Action officielle AWS « Définition de tâche de rendu » Amazon ECS.
- Action officielle AWS « Définition de tâche de déploiement » Amazon ECS.