Blog Ingénierie Comment déployer une application React sur Amazon S3 avec GitLab CI/CD
Mise à jour : March 27, 2025
Lecture : 13 min

Comment déployer une application React sur Amazon S3 avec GitLab CI/CD

Vous souhaitez déployer une application React sur Amazon S3 avec GitLab CI/CD ? Suivez notre guide étape par étape.

cover1.jpg

Amazon S3 dispose d'une fonctionnalité d'hébergement qui vous permet d'héberger un site Web statique directement à partir d'un bucket S3, également appelé compartiment. Lorsque vous hébergez votre site Web sur Amazon S3, son contenu est stocké dans un bucket S3 et servi directement à vos utilisateurs, sans besoin de ressources supplémentaires.

Combinez cela avec Amazon CloudFront et vous obtiendrez une solution rentable et évolutive pour l'hébergement de vos sites Web statiques. Une fonctionnalité particulièrement utile pour les applications à page unique.

Dans cet article, nous vous guidons dans la configuration de votre bucket Amazon S3, la configuration d'OpenID Connect (OIDC) dans AWS et le déploiement de votre application sur Amazon S3 à l'aide d'un pipeline GitLab CI/CD.

À la fin de cet article, vous disposerez d'un pipeline CI/CD construit dans GitLab qui se déploie automatiquement dans votre bucket Amazon S3.

Prérequis

Pour ce guide, vous aurez besoin des éléments suivants :

Dans un précédent tutoriel nous vous avons expliqué comment :

  • créer une nouvelle application React,
  • exécuter des tests unitaires dans le cadre du processus CI dans GitLab,
  • générer les résultats des tests ainsi que la couverture de code dans le pipeline.

Cet article constitue la suite de ce projet. Libre à vous de le parcourir et de le dupliquer (fork).

Configuration de votre bucket S3

Pour commencer, vous devez configurer votre bucket Amazon S3.

Créez votre compartiment

Après vous être connecté à votre compte AWS, recherchez « S3 » à l'aide de la barre de recherche et sélectionnez le service S3. Cela ouvrira la page d'accueil du service.

Vous devriez immédiatement voir l'option permettant de créer un bucket (compartiment). Ce compartiment est l'endroit où vous allez stocker votre application React une fois créée. Cliquez sur le bouton « Créer un compartiment » pour continuer.

Création d'un bucket S3

Donnez un nom à votre compartiment, sélectionnez votre région, laissez le reste des paramètres par défaut (nous y reviendrons plus tard) et continuez en cliquant sur le bouton « Créer un compartiment ».

Lorsque vous nommez votre compartiment, il est important de se rappeler que le nom doit être unique et suivre les règles de nommage des compartiments. Nous avons nommé le nôtre jw-gl-react.

Une fois votre compartiment créé, vous devriez être redirigé vers une liste de vos compartiments, comme montré ci-dessous.

Liste bucket S3 AWS

Configurez l'hébergement de site web statique

L'étape suivante consiste à configurer l'hébergement de site web statique. Ouvrez votre compartiment en cliquant sur son nom. Sélectionnez l'onglet « Propriétés » et faites défiler vers le bas pour trouver l'option d'hébergement de site web statique.

Configuration de l'hébergement de site web statique

Cliquez sur « Modifier », puis activez l'hébergement de site web statique. Pour les documents d’index et d’erreur, saisissez index.html, puis cliquez sur « Enregistrer les modifications ».

Activation de l'hébergement de site web statique sur Amazon S3

Configurez les autorisations de votre application React

Maintenant que vous avez activé l'hébergement de site web statique, vous devez mettre à jour vos autorisations afin que votre audience puisse accéder à votre site web. Revenez à votre compartiment et sélectionnez l'onglet « Autorisations ».

Sous « Bloquer l'accès public » (paramètres du compartiment), cliquez sur « Modifier », décochez « Bloquer tous les accès publics » et continuez en cliquant sur « Enregistrer les modifications ».

Bloquer l'accès public

Votre page devrait maintenant ressembler à ceci :

Configurer permission bucket S3 AWS

Maintenant, vous devez modifier la stratégie de compartiment. Pour cela, cliquez sur le bouton « Modifier » dans la section « Stratégie de compartiment » et collez le code suivant :

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::jw-gl-react/*"
        }
    ]
}

À la ligne « Ressource », remplacez jw-gl-react par le nom de votre compartiment et enregistrez les modifications.

Votre compartiment devrait ressembler à ceci :

Bucket S3 accès public

Chargement de votre application React

Maintenant, créons votre application React et publions-la manuellement dans votre bucket S3.

Pour créer l'application, assurez-vous que votre projet soit cloné sur votre machine locale et exécutez la commande suivante dans votre terminal à l'intérieur du répertoire de votre dépôt :

npm run build

Cela créera un dossier build à l'intérieur du répertoire de votre dépôt.

Dans votre compartiment, cliquez sur le bouton « Charger »

Chargement de l'application React

Faites glisser le contenu de votre dossier nouvellement créé (et non le dossier lui-même) dans la zone de chargement. Cela chargera le contenu de votre application React dans votre compartiment. Assurez-vous de cliquer sur « Charger » en bas de la page pour démarrer le chargement.

Revenez maintenant à l'onglet « Propriétés » de votre compartiment et faites défiler vers le bas pour trouver l'URL de votre site web statique.

URL du site web statique

Cliquez sur le lien et vous devriez voir votre application React nouvellement créée s'ouvrir dans votre navigateur.

Application React déployée

Configuration d’OpenID Connect dans AWS

Pour déployer sur votre bucket S3 depuis GitLab, nous allons utiliser un job GitLab CI/CD pour recevoir des informations d'identification temporaires d'AWS sans avoir besoin de stocker des secrets. Pour ce faire, nous allons configurer OpenID Connect pour la fédération d'identité entre GitLab et AWS. Nous suivrons la documentation de GitLab associée.

Ajoutez un fournisseur d'identité

La première étape consiste à ajouter GitLab en tant que fournisseur d’identité OpenID Connect (OIDC) dans IAM. AWS fournit des instructions, mais nous allons les parcourir étape par étape dans ce guide.

Ouvrez tout d'abord la console IAM dans AWS.

Console IAM dans AWS

Dans le volet de navigation de gauche, sous « Gestion des accès », choisissez « Fournisseurs d'identité », puis « Ajouter un fournisseur ». Pour le type de fournisseur, sélectionnez « OpenID Connect ».

Pour l'URL du fournisseur, saisissez l'adresse de votre instance GitLab, telle que https://gitlab.com ou https://gitlab.example.com.

Pour « Audience », saisissez quelque chose de générique mais spécifique à votre application React. Dans notre cas, nous allons utiliser react_s3_gl. Veillez à choisir quelque chose qui ne soit pas facile à deviner et prenez note de cette valeur, car vous l'utiliserez pour définir l'ID_TOKEN dans votre fichier .gitLab-ci.yml.

Après avoir saisi l'URL du fournisseur, cliquez sur « Obtenir une empreinte numérique » pour vérifier le certificat du serveur de votre fournisseur d'identité. Ensuite, continuez et cliquez sur « Ajouter un fournisseur » pour terminer.

Créez une politique d’autorisations

Après avoir créé le fournisseur d'identité, vous devez créer une politique d’autorisations.

Depuis le tableau de bord IAM, sous « Gestion des accès », sélectionnez « Politiques » puis « Créer une politique ». Sélectionnez l'onglet JSON et collez le code suivant en remplaçant jw-gl-react par le nom de votre compartiment à la ligne « Ressource ».

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::jw-gl-react"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::jw-gl-react/*"]
    }
  ]
}

Sélectionnez le bouton « Suivant : Balises » , ajoutez les balises souhaitées, puis sélectionnez le bouton « Suivant : Confirmer ». Entrez un nom pour votre politique avant de terminer sa création.

Configurez le rôle

Il est maintenant temps d'ajouter le rôle. Depuis le tableau de bord IAM, sous « Gestion des accès », sélectionnez « Rôles », puis cliquez sur « Créer un rôle » et choisissez « Identité Web ».

Dans la section « Identité Web », sélectionnez le fournisseur d'identité que vous avez créé précédemment. Pour l'audience, sélectionnez également l'audience que vous avez créée précédemment. Cliquez sur le bouton « Suivant » pour continuer.

Si vous souhaitez limiter l'autorisation à un groupe, un projet, une branche ou une balise spécifique, vous pouvez créer une « Politique d’approbation personnalisée » (Custom Trust Policy) au lieu d'une « Identité Web ».

Pour une liste complète des types de filtres qu'il est possible d'appliquer, consultez notre documentation.

Configuration du rôle dans l'IAM

Au cours de l'étape « Ajout des autorisations », sélectionnez la politique que vous avez créée, puis cliquez sur « Suivant » pour continuer. Donnez un nom à votre rôle et cliquez sur « Créer un rôle ».

Ouvrez le rôle que vous venez de créer. Dans la section « Récapitulatif », recherchez le nom de ressource Amazon (ARN) et enregistrez-le dans un endroit sécurisé. Vous l'utiliserez dans votre pipeline.

Déployer le rôle dans l'IAM

Déploiement sur votre compartiment Amazon S3 à l'aide d'un pipeline GitLab CI/CD

Dans votre projet, créez deux variables CI/CD :

  • La première variable doit être nommée ROLE_ARN. Pour la valeur, collez l'ARN du rôle que vous venez de créer.
  • La deuxième variable doit être nommée S3_BUCKET. Pour la valeur, collez le nom du compartiment que vous avez créé plus tôt.

Pour des raisons de sécurité, dans cet article nous avons choisi de masquer nos variables.

Récupérez vos identifiants temporaires

Dans votre fichier .gitlab-ci.yml, collez le code suivant :

.assume_role: &assume_role
    - >
      STS=($(aws sts assume-role-with-web-identity
      --role-arn ${ROLE_ARN}
      --role-session-name "GitLabRunner-${CI_PROJECT_ID}-${CI_PIPELINE_ID}"
      --web-identity-token $ID_TOKEN
      --duration-seconds 3600
      --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]'
      --output text))
    - export AWS_ACCESS_KEY_ID="${STS[0]}"
    - export AWS_SECRET_ACCESS_KEY="${STS[1]}"
    - export AWS_SESSION_TOKEN="${STS[2]}"

Cela va utiliser le service de jeton de sécurité AWS (AWS Security Token Service) pour générer des identifiants temporaires (3 600 secondes) en utilisant le rôle OpenID Connect que vous avez créé précédemment.

Créez le job de déploiement pour votre application React

Maintenant, ajoutons un job de compilation et de déploiement pour créer votre application et la déployer sur votre bucket S3.

Tout d'abord, mettez à jour les étapes dans votre fichier .gitlab-ci.yml pour inclure une étape build et deploy, comme indiqué ci-dessous :

stages:
  - build
  - test
  - deploy

Ensuite, ajoutons un job pour créer votre application. Collez le code suivant dans votre fichier .gitLab-ci.yml :

build artifact:
  stage: build
  image: node:latest
  before_script:
    - npm install
  script:
    - npm run build
  artifacts:
    paths:
      - build/
    when: always
  rules:
    - if: '$CI_COMMIT_REF_NAME == "main"'
      when: always

Cela va exécuter npm run build si le changement se produit sur la branche main et télécharger le répertoire de compilation (build directory) en tant qu'artefact à utiliser lors de l'étape suivante.

Ensuite, ajoutons un job qui sera réellement déployé sur votre bucket S3. Collez le code suivant dans votre fichier .gitLab-ci.yml :

deploy s3:
  stage: deploy
  image:
    name: amazon/aws-cli:latest
    entrypoint: 
      - '/usr/bin/env'
  id_tokens:
      ID_TOKEN:
        aud: react_s3_gl
  script:
    - *assume_role
    - aws s3 sync build/ s3://$S3_BUCKET
  rules:
    - if: '$CI_COMMIT_REF_NAME == "main"'
      when: always

Cela utilise les ancres YAML pour exécuter le script assume_role, puis utilise aws cli pour télécharger votre artefact de compilation dans le compartiment que vous avez défini en tant que variable. Ce job ne s'exécute que si le changement se produit sur la branche main.

Assurez-vous que la valeur aud correspond à celle que vous avez saisie pour votre audience au moment de la configuration du fournisseur d'identité. Dans notre cas, nous avons saisi react-s3_gl.

Votre fichier .gitLab-ci.yml complet devrait ressembler à ceci :

stages:
  - build
  - test
  - deploy

.assume_role: &assume_role
    - >
      STS=($(aws sts assume-role-with-web-identity
      --role-arn ${ROLE_ARN}
      --role-session-name "GitLabRunner-${CI_PROJECT_ID}-${CI_PIPELINE_ID}"
      --web-identity-token $ID_TOKEN
      --duration-seconds 3600
      --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]'
      --output text))
    - export AWS_ACCESS_KEY_ID="${STS[0]}"
    - export AWS_SECRET_ACCESS_KEY="${STS[1]}"
    - export AWS_SESSION_TOKEN="${STS[2]}"

unit test:
  image: node:latest
  stage: test
  before_script:
    - npm install
  script:
    - npm run test:ci
  coverage: /All files[^|]*\|[^|]*\s+([\d\.]+)/
  artifacts:
    paths:
      - coverage/
    when: always
    reports:
      junit:
        - junit.xml

build artifact:
  stage: build
  image: node:latest
  before_script:
    - npm install
  script:
    - npm run build
  artifacts:
    paths:
      - build/
    when: always
  rules:
    - if: '$CI_COMMIT_REF_NAME == "main"'
      when: always

deploy s3:
  stage: deploy
  image:
    name: amazon/aws-cli:latest
    entrypoint: 
      - '/usr/bin/env'
  id_tokens:
      ID_TOKEN:
        aud: react_s3_gl
  script:
    - *assume_role
    - aws s3 sync build/ s3://$S3_BUCKET
  rules:
    - if: '$CI_COMMIT_REF_NAME == "main"'
      when: always

Testez votre pipeline

Pour tester votre pipeline, dans App.js, modifiez cette ligne Edit <code>src/App.js</code> and save to reload. par ceci : This was deployed from GitLab. Maintenant, validez vos modifications dans la branche main. Le pipeline devrait se lancer et une fois terminé avec succès, vous devriez voir votre application mise à jour avec l'URL de votre site web statique.

Application React mise à jour

Vous disposez désormais d'un pipeline CI/CD construit dans GitLab qui reçoit des informations d'identification temporaires d'AWS à l'aide d'OpenID Connect et qui se déploie automatiquement dans votre compartiment Amazon S3. Pour aller plus loin, vous pouvez sécuriser votre application avec les outils de sécurité intégrés de GitLab.

Découvrez tout le code de ce projet.

Votre avis nous intéresse

Cet article de blog vous a plu ou vous avez des questions ou des commentaires ? Partagez vos réflexions en créant un nouveau sujet dans le forum de la communauté GitLab. Partager votre expérience

Lancez-vous dès maintenant

Découvrez comment la plateforme DevSecOps unifiée de GitLab peut aider votre équipe.

Commencer un essai gratuit

Découvrez le forfait qui convient le mieux à votre équipe

En savoir plus sur la tarification

Découvrez ce que GitLab peut offrir à votre équipe

Échanger avec un expert