<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jean-Christophe Blondet</title>
    <description>The latest articles on DEV Community by Jean-Christophe Blondet (@jcbone16).</description>
    <link>https://dev.to/jcbone16</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4141976%2F83d4d85b-6ca9-4c1d-bbc5-06890f787853.png</url>
      <title>DEV Community: Jean-Christophe Blondet</title>
      <link>https://dev.to/jcbone16</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jcbone16"/>
    <language>en</language>
    <item>
      <title>Déployer sur AWS avec GitHub Actions sans clés d'accès : OIDC, contrôles et un retour arrière vraiment testé</title>
      <dc:creator>Jean-Christophe Blondet</dc:creator>
      <pubDate>Fri, 25 Sep 2026 07:40:22 +0000</pubDate>
      <link>https://dev.to/jcbone16/deployer-sur-aws-avec-github-actions-sans-cles-dacces-oidc-controles-et-un-retour-arriere-3gja</link>
      <guid>https://dev.to/jcbone16/deployer-sur-aws-avec-github-actions-sans-cles-dacces-oidc-controles-et-un-retour-arriere-3gja</guid>
      <description>&lt;p&gt;Dans beaucoup d'équipes, la mise en production tient à une personne. Elle connaît l'ordre des commandes, elle a les bons droits sur la console AWS, et elle sait quoi faire quand ça se passe mal. Le jour où elle est absente, on ne déploie pas, ou on déploie en croisant les doigts.&lt;/p&gt;

&lt;p&gt;Un pipeline de mise en production sert à sortir ce savoir de la tête d'une personne pour le mettre &lt;strong&gt;dans le dépôt&lt;/strong&gt;, sous une forme que toute l'équipe peut relire, lancer et, surtout, &lt;strong&gt;annuler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Cet article montre une mise en place réaliste avec GitHub Actions vers AWS (exemple : une application conteneurisée sur ECS), autour de trois idées :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Aucune clé d'accès AWS longue durée&lt;/strong&gt; stockée dans GitHub : on passe par OIDC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Des contrôles explicites&lt;/strong&gt; avant et après le déploiement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Un retour arrière écrit, et exécuté au moins une fois&lt;/strong&gt; avant d'en avoir besoin.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Les exemples sont volontairement génériques : adaptez les noms, la région et les commandes à votre projet.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Avant le YAML : écrire le périmètre
&lt;/h2&gt;

&lt;p&gt;Un pipeline sans périmètre devient vite une démo. Avant la première ligne, écrivez :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;quels dépôts et quelles branches&lt;/strong&gt; déclenchent un déploiement ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;quel artefact&lt;/strong&gt; part en production (une image Docker, un bundle statique…) ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;quels environnements AWS&lt;/strong&gt; (compte, région) sont ciblés ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;quels contrôles&lt;/strong&gt; sont bloquants (tests, lint, revue, approbation manuelle) ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ce que « retour arrière » veut dire&lt;/strong&gt; chez vous (redéployer la version précédente ? restaurer une base ?) et ce qui n'est &lt;strong&gt;pas&lt;/strong&gt; réversible ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;le critère de fin&lt;/strong&gt; : pour nous, le pipeline est terminé quand &lt;strong&gt;un membre de l'équipe l'a relancé lui-même&lt;/strong&gt;, pas quand la personne qui l'a écrit a réussi un déploiement.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Se connecter à AWS sans secret : OIDC
&lt;/h2&gt;

&lt;p&gt;GitHub Actions peut obtenir un jeton OIDC signé pour chaque exécution. AWS l'échange contre des identifiants temporaires d'un rôle IAM. Plus de &lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt; dans les secrets du dépôt, donc plus de clé à faire tourner ou à voir fuiter.&lt;/p&gt;

&lt;p&gt;Côté AWS, une seule fois :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Créer un &lt;strong&gt;fournisseur d'identité OIDC&lt;/strong&gt; IAM pour &lt;code&gt;https://token.actions.githubusercontent.com&lt;/code&gt;, audience &lt;code&gt;sts.amazonaws.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Créer &lt;strong&gt;deux rôles&lt;/strong&gt; : un pour construire et pousser l'image (branche &lt;code&gt;main&lt;/code&gt;), un pour déployer (environnement GitHub &lt;code&gt;production&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Politique de confiance du rôle de déploiement (remplacez &lt;code&gt;123456789012&lt;/code&gt;, &lt;code&gt;mon-org&lt;/code&gt; et &lt;code&gt;mon-depot&lt;/code&gt;) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Principal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Federated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sts:AssumeRoleWithWebIdentity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"StringEquals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"token.actions.githubusercontent.com:aud"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sts.amazonaws.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"token.actions.githubusercontent.com:sub"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"repo:mon-org/mon-depot:environment:production"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le point important est la condition &lt;code&gt;sub&lt;/code&gt; : seul un job de &lt;strong&gt;ce dépôt&lt;/strong&gt;, qui s'exécute dans &lt;strong&gt;l'environnement &lt;code&gt;production&lt;/code&gt;&lt;/strong&gt;, peut assumer ce rôle. Pour le rôle de build, la valeur devient &lt;code&gt;repo:mon-org/mon-depot:ref:refs/heads/main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Permissions à donner (principe du moindre privilège, à ajuster) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;rôle de build&lt;/strong&gt; : &lt;code&gt;ecr:GetAuthorizationToken&lt;/code&gt; et les actions de push sur le dépôt ECR concerné (&lt;code&gt;ecr:BatchCheckLayerAvailability&lt;/code&gt;, &lt;code&gt;ecr:InitiateLayerUpload&lt;/code&gt;, &lt;code&gt;ecr:UploadLayerPart&lt;/code&gt;, &lt;code&gt;ecr:CompleteLayerUpload&lt;/code&gt;, &lt;code&gt;ecr:PutImage&lt;/code&gt;) ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rôle de déploiement&lt;/strong&gt; : &lt;code&gt;ecs:RegisterTaskDefinition&lt;/code&gt;, &lt;code&gt;ecs:UpdateService&lt;/code&gt;, &lt;code&gt;ecs:DescribeServices&lt;/code&gt;, &lt;code&gt;ecr:DescribeImages&lt;/code&gt; (pour le contrôle du retour arrière), et &lt;code&gt;iam:PassRole&lt;/code&gt; limité aux rôles de tâche et d'exécution ECS de l'application.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Le workflow de déploiement
&lt;/h2&gt;

&lt;p&gt;Fichier &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy-production&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
  &lt;span class="na"&gt;id-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;   &lt;span class="c1"&gt;# nécessaire pour obtenir le jeton OIDC&lt;/span&gt;

&lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy-production&lt;/span&gt;
  &lt;span class="na"&gt;cancel-in-progress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;   &lt;span class="c1"&gt;# jamais deux déploiements en parallèle&lt;/span&gt;

&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eu-west-3&lt;/span&gt;
  &lt;span class="na"&gt;ECR_REPOSITORY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mon-app&lt;/span&gt;
  &lt;span class="na"&gt;ECS_CLUSTER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mon-cluster&lt;/span&gt;
  &lt;span class="na"&gt;ECS_SERVICE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mon-service&lt;/span&gt;
  &lt;span class="na"&gt;CONTAINER_NAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;make lint&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;make test&lt;/span&gt;

  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;checks&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/configure-aws-credentials@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;role-to-assume&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.AWS_BUILD_ROLE_ARN }}&lt;/span&gt;
          &lt;span class="na"&gt;aws-region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.AWS_REGION }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ecr&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecr-login@v2&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build et push de l'image (tag = SHA du commit)&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;REGISTRY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.ecr.outputs.registry }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;docker build -t "$REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA" .&lt;/span&gt;
          &lt;span class="s"&gt;docker push "$REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA"&lt;/span&gt;

  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;   &lt;span class="c1"&gt;# règles de protection de l'environnement (approbation, etc.)&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/configure-aws-credentials@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;role-to-assume&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.AWS_DEPLOY_ROLE_ARN }}&lt;/span&gt;
          &lt;span class="na"&gt;aws-region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.AWS_REGION }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;render&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecs-render-task-definition@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;task-definition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy/task-definition.json&lt;/span&gt;
          &lt;span class="na"&gt;container-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.CONTAINER_NAME }}&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ github.sha }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecs-deploy-task-definition@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;task-definition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.render.outputs.task-definition }}&lt;/span&gt;
          &lt;span class="na"&gt;cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.ECS_CLUSTER }}&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.ECS_SERVICE }}&lt;/span&gt;
          &lt;span class="na"&gt;wait-for-service-stability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Smoke test&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;curl --fail --silent --show-error --retry 5 --retry-delay 10 "${{ vars.HEALTHCHECK_URL }}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quelques choix à expliquer à l'équipe :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Le tag d'image est le SHA du commit.&lt;/strong&gt; On sait exactement ce qui tourne, et revenir en arrière revient à redéployer un SHA connu. Configurez le dépôt ECR en &lt;strong&gt;tags immuables&lt;/strong&gt; pour qu'un tag ne puisse pas être écrasé, et une &lt;strong&gt;règle de cycle de vie&lt;/strong&gt; qui conserve assez d'images pour pouvoir revenir en arrière.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;concurrency&lt;/code&gt;&lt;/strong&gt; empêche deux déploiements simultanés sur le même service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;environment: production&lt;/code&gt;&lt;/strong&gt; porte les règles de protection (relecteurs obligatoires, restriction aux branches autorisées). Leur disponibilité dépend de votre offre GitHub et de la visibilité du dépôt : vérifiez la documentation GitHub pour les dépôts privés.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;wait-for-service-stability&lt;/code&gt;&lt;/strong&gt; fait échouer le job si le service ECS ne se stabilise pas, au lieu de déclarer victoire trop tôt.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vars.*&lt;/code&gt; sont des &lt;strong&gt;variables&lt;/strong&gt; de dépôt ou d'environnement (ARN des rôles, registre ECR, URL de santé) : aucune n'est un secret.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Les contrôles : bloquants, lisibles, compris
&lt;/h2&gt;

&lt;p&gt;Un contrôle utile est &lt;strong&gt;écrit dans le dépôt&lt;/strong&gt;, &lt;strong&gt;exécuté à chaque fois&lt;/strong&gt;, et &lt;strong&gt;compris&lt;/strong&gt; par la personne qui relancera le pipeline :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;avant&lt;/strong&gt; : build, lint, tests (et éventuellement scan de dépendances ou d'image) ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pendant&lt;/strong&gt; : approbation manuelle via l'environnement si votre équipe la veut ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;après&lt;/strong&gt; : un smoke test sur un point de santé et, si besoin, quelques vérifications fonctionnelles rapides ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;traçabilité&lt;/strong&gt; : l'exécution GitHub garde le commit, l'image et l'horodatage de chaque déploiement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Côté ECS, activez aussi le &lt;strong&gt;disjoncteur de déploiement&lt;/strong&gt; (&lt;code&gt;deploymentCircuitBreaker&lt;/code&gt; avec &lt;code&gt;enable: true&lt;/code&gt; et &lt;code&gt;rollback: true&lt;/code&gt;) : si les nouvelles tâches n'arrivent pas à démarrer, ECS revient automatiquement à la dernière version stable. Ce n'est pas un retour arrière fonctionnel (une version qui démarre mais se comporte mal ne sera pas détectée), c'est un filet de sécurité de plus.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Le retour arrière : un workflow à part, testé à froid
&lt;/h2&gt;

&lt;p&gt;Le retour arrière doit être aussi simple à lancer que le déploiement. Fichier &lt;code&gt;.github/workflows/rollback.yml&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rollback-production&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;image_tag&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SHA&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;complet&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;du&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;commit&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;à&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;redéployer"&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
  &lt;span class="na"&gt;id-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;

&lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy-production&lt;/span&gt;
  &lt;span class="na"&gt;cancel-in-progress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eu-west-3&lt;/span&gt;
  &lt;span class="na"&gt;ECR_REPOSITORY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mon-app&lt;/span&gt;
  &lt;span class="na"&gt;ECS_CLUSTER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mon-cluster&lt;/span&gt;
  &lt;span class="na"&gt;ECS_SERVICE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mon-service&lt;/span&gt;
  &lt;span class="na"&gt;CONTAINER_NAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;rollback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;IMAGE_TAG&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ inputs.image_tag }}&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ inputs.image_tag }}&lt;/span&gt;   &lt;span class="c1"&gt;# définition de tâche de la même version que l'image&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/configure-aws-credentials@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;role-to-assume&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.AWS_DEPLOY_ROLE_ARN }}&lt;/span&gt;
          &lt;span class="na"&gt;aws-region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.AWS_REGION }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Vérifier que l'image existe&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws ecr describe-images --repository-name "$ECR_REPOSITORY" --image-ids imageTag="$IMAGE_TAG"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;render&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecs-render-task-definition@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;task-definition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy/task-definition.json&lt;/span&gt;
          &lt;span class="na"&gt;container-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.CONTAINER_NAME }}&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ inputs.image_tag }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecs-deploy-task-definition@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;task-definition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.render.outputs.task-definition }}&lt;/span&gt;
          &lt;span class="na"&gt;cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.ECS_CLUSTER }}&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.ECS_SERVICE }}&lt;/span&gt;
          &lt;span class="na"&gt;wait-for-service-stability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Smoke test&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;curl --fail --silent --show-error --retry 5 --retry-delay 10 "${{ vars.HEALTHCHECK_URL }}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trois détails qui évitent les mauvaises surprises :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L'entrée utilisateur passe par une variable d'environnement&lt;/strong&gt; (&lt;code&gt;IMAGE_TAG&lt;/code&gt;) dans les étapes &lt;code&gt;run&lt;/code&gt;, jamais interpolée directement dans le script : c'est la protection de base contre l'injection de commandes dans GitHub Actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On récupère la définition de tâche de la même version&lt;/strong&gt; que l'image (&lt;code&gt;ref:&lt;/code&gt; du checkout) : variables d'environnement et ressources restent cohérentes avec le code redéployé.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Les migrations de base de données ne se rembobinent pas toutes seules.&lt;/strong&gt; Si une version a modifié le schéma, le retour arrière applicatif ne suffit pas. Préférez des migrations compatibles dans les deux sens (ajouter d'abord, supprimer plus tard), et écrivez noir sur blanc ce qui n'est pas réversible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enfin, &lt;strong&gt;exécutez ce workflow une fois, avec l'équipe, un jour calme&lt;/strong&gt;. Un retour arrière qui n'a jamais tourné n'est qu'une hypothèse.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Et avec GitLab CI ou AWS CodePipeline ?
&lt;/h2&gt;

&lt;p&gt;Le choix de l'outil dépend surtout de l'endroit où vit déjà votre code et de qui doit pouvoir approuver :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitLab CI&lt;/strong&gt; : même logique OIDC. Le job déclare un jeton avec &lt;code&gt;id_tokens&lt;/code&gt; (audience &lt;code&gt;sts.amazonaws.com&lt;/code&gt;) puis appelle &lt;code&gt;aws sts assume-role-with-web-identity&lt;/code&gt;. Dans la politique de confiance, la condition porte sur la revendication &lt;code&gt;sub&lt;/code&gt; au format &lt;code&gt;project_path:mon-groupe/mon-projet:ref_type:branch:ref:main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS CodePipeline&lt;/strong&gt; : l'orchestration vit dans le compte AWS (souvent avec CodeBuild), ce qui plaît quand la contrainte est « tout dans AWS ». La source GitHub ou GitLab se branche via une connexion, et les pipelines récents proposent des mécanismes de retour arrière au niveau des étapes : vérifiez la documentation de votre version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aucun des trois n'est « le meilleur ». Le bon choix est celui que votre équipe saura relire et relancer.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Checklist de fin
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Aucun identifiant AWS longue durée dans GitHub : OIDC et rôles dédiés build/déploiement&lt;/li&gt;
&lt;li&gt;[ ] Conditions &lt;code&gt;sub&lt;/code&gt; restreintes au dépôt, à la branche ou à l'environnement&lt;/li&gt;
&lt;li&gt;[ ] Images taguées par SHA, tags immuables, rétention suffisante pour revenir en arrière&lt;/li&gt;
&lt;li&gt;[ ] Contrôles bloquants avant le déploiement, smoke test après&lt;/li&gt;
&lt;li&gt;[ ] Un seul déploiement à la fois (&lt;code&gt;concurrency&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[ ] Workflow de retour arrière écrit &lt;strong&gt;et exécuté une fois&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Documentation dans le dépôt : comment déployer, comment revenir en arrière, qui approuve&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Un membre de l'équipe a relancé le pipeline sans aide&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce dernier point est le vrai critère de réussite : le pipeline appartient à l'équipe, pas à la personne qui l'a écrit.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Chez CERVOX, c'est exactement ainsi que nous cadrons la mission « Mises en production automatisées » : pipeline dans votre dépôt, contrôles prévus, retour arrière exécuté une fois avec vous, et une fin quand votre équipe relance seule (détails sur &lt;a href="https://cervox.io/services/" rel="noopener noreferrer"&gt;nos missions AWS&lt;/a&gt;). Des questions sur l'OIDC ou le retour arrière ? Posez-les en commentaire.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>githubactions</category>
      <category>french</category>
    </item>
    <item>
      <title>Checklist : auditer un compte AWS en lecture seule</title>
      <dc:creator>Jean-Christophe Blondet</dc:creator>
      <pubDate>Thu, 24 Sep 2026 22:03:04 +0000</pubDate>
      <link>https://dev.to/jcbone16/checklist-auditer-un-compte-aws-en-lecture-seule-2998</link>
      <guid>https://dev.to/jcbone16/checklist-auditer-un-compte-aws-en-lecture-seule-2998</guid>
      <description>&lt;p&gt;Votre compte AWS « tourne », les factures arrivent, des applications répondent… et pourtant plus personne ne sait vraiment ce qu’il contient. Des ressources créées à la main, des accès hérités, des services oubliés, une architecture qui n’existe que dans la tête d’une personne partie : le risque n’est pas seulement technique, il est opérationnel.&lt;/p&gt;

&lt;p&gt;Dans ces situations, le premier réflexe utile n’est souvent &lt;strong&gt;pas&lt;/strong&gt; de « tout remettre au propre » tout de suite. C’est d’&lt;strong&gt;observer&lt;/strong&gt; : inventorier, structurer, documenter, puis décider. C’est exactement l’objet d’un &lt;strong&gt;audit de compte AWS en lecture seule&lt;/strong&gt; — une mission cadrée, avec un livrable que vous gardez, sans modifier l’existant tant que vous n’avez pas validé la suite.&lt;/p&gt;

&lt;p&gt;Cette checklist détaille quand ce type d’audit est pertinent, comment le mener, ce que vous recevez, et ce qu’il n’est &lt;strong&gt;pas&lt;/strong&gt;. La fiche mission correspondante est sur &lt;a href="https://cervox.io/services/" rel="noopener noreferrer"&gt;CERVOX Services&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quand un audit lecture seule est le bon premier pas
&lt;/h2&gt;

&lt;p&gt;Un audit en lecture seule est particulièrement utile lorsque l’une de ces situations vous parle :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compte hérité&lt;/strong&gt; : rachat, départ d’un prestataire, départ d’un admin, « c’était déjà là ».&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation absente ou obsolète&lt;/strong&gt; : diagrammes datés, runbooks inexistants, secrets et accès dispersés.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Doute sur le coût ou la surface&lt;/strong&gt; : la facture monte, mais on ne sait pas quelles ressources contribuent vraiment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avant une décision structurante&lt;/strong&gt; : migration, reprise en code (Infrastructure as Code), automatisation des mises en production, due diligence technique.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident ou friction récurrente&lt;/strong&gt; : on corrige au feeling, sans vision globale de l’existant.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En revanche, si vous avez déjà un problème &lt;strong&gt;urgent et localisé&lt;/strong&gt; (service cassé, bascule bloquée, erreur reproductible), une &lt;strong&gt;intervention sur un problème AWS&lt;/strong&gt; — mission distincte — peut être plus adaptée. L’audit reste pertinent ensuite pour éviter de reconstruire la même opacité.&lt;/p&gt;

&lt;p&gt;Principe utile : &lt;strong&gt;diagnostic avant travaux&lt;/strong&gt;. On regarde d’abord, on propose ensuite, vous décidez. Rien de sensible n’est modifié sans votre accord.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce que « lecture seule » signifie (et ce que ça n’est pas)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lecture seule&lt;/strong&gt; signifie que l’analyse s’appuie sur des accès qui &lt;strong&gt;consultent&lt;/strong&gt; l’existant (inventaire, configuration visible, journaux accessibles dans le périmètre) &lt;strong&gt;sans&lt;/strong&gt; appliquer de changements sur les ressources de production dans le cadre de cette mission.&lt;/p&gt;

&lt;p&gt;Concrètement :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On ne « nettoie » pas le compte pendant l’audit.&lt;/li&gt;
&lt;li&gt;On ne bascule pas d’architecture.&lt;/li&gt;
&lt;li&gt;On ne déploie pas de correctifs « au passage ».&lt;/li&gt;
&lt;li&gt;On ne revendique pas un label partenaire ou un cadre commercial AWS particulier : l’audit décrit ici est une &lt;strong&gt;mission d’analyse cadrée&lt;/strong&gt;, pas un programme certifié tiers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce que la lecture seule &lt;strong&gt;n’empêche pas&lt;/strong&gt; : formuler des recommandations claires, priorisées, et actionnables — pour que &lt;strong&gt;vous&lt;/strong&gt; (ou une mission ultérieure) choisissiez quoi faire ensuite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Périmètre écrit avant tout accès
&lt;/h2&gt;

&lt;p&gt;Avant d’ouvrir le moindre accès, le périmètre doit être écrit. C’est non négociable si l’on veut un critère de fin de mission compréhensible.&lt;/p&gt;

&lt;p&gt;Le périmètre précise typiquement :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compte(s) et régions&lt;/strong&gt; concernés (et ce qui est hors scope).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Objectifs&lt;/strong&gt; : inventaire, points d’attention, préparation migration, préparation reprise IaC, éclairage coûts, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Profondeur&lt;/strong&gt; : ce qui sera analysé en détail vs signalé comme « à approfondir ».&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contraintes&lt;/strong&gt; : fenêtres, interlocuteurs, données sensibles, interdictions explicites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Livrable attendu&lt;/strong&gt; et &lt;strong&gt;critère de fin&lt;/strong&gt; : quand l’audit est terminé.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sans ce cadre, un « audit » devient une exploration sans fin — ou une liste d’opinions. Avec ce cadre, vous savez ce que vous achetez : une analyse bornée, restituée.&lt;/p&gt;

&lt;h2&gt;
  
  
  Méthodologie (lecture seule uniquement)
&lt;/h2&gt;

&lt;p&gt;La méthode ci-dessous est un &lt;strong&gt;cadre de travail&lt;/strong&gt;, pas une checklist magique toutes situations. Elle reste volontairement générique : les outils AWS évoluent, et chaque compte a son histoire.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Accès limités à la mission
&lt;/h3&gt;

&lt;p&gt;Les accès sont limités à ce que la mission demande. Pour un audit, l’intention est la &lt;strong&gt;consultation&lt;/strong&gt;. En fin de mission, les accès sont retirés. Votre compte reste le vôtre.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Inventaire des ressources analysées
&lt;/h3&gt;

&lt;p&gt;On dresse un inventaire structuré de ce qui est &lt;strong&gt;dans le périmètre&lt;/strong&gt; : compute, stockage, bases, réseau, identité, orchestration, observabilité, budgets/alertes si présents, etc. L’objectif n’est pas d’énumérer « tout AWS », mais de rendre visible &lt;strong&gt;votre&lt;/strong&gt; réel.&lt;/p&gt;

&lt;p&gt;Livrable associé : une vue exploitable (tableaux, regroupements par usage / environnement / criticité — selon ce qui a été convenu).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Points d’attention formulés de façon actionnable
&lt;/h3&gt;

&lt;p&gt;Un point d’attention utile dit :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;quoi&lt;/strong&gt; est observé ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pourquoi&lt;/strong&gt; cela mérite attention (risque, coût, fragilité opérationnelle, dépendance) ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;quelle suite possible&lt;/strong&gt; (approfondir, corriger, documenter, accepter le risque).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On évite les formulations vagues du type « à revoir » sans contexte. On évite aussi de transformer l’audit en remédiation improvisée.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Analyse structurée
&lt;/h3&gt;

&lt;p&gt;L’analyse organise l’existant : surfaces exposées, dépendances critiques, zones peu documentées, écarts entre « ce qui est censé tourner » et « ce qui tourne ». Selon le périmètre, on peut croiser configuration visible et signaux opérationnels (journaux, alarmes, budgets) &lt;strong&gt;lorsqu’ils sont accessibles en lecture&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Recommandations = propositions, pas exécution automatique
&lt;/h3&gt;

&lt;p&gt;Les recommandations sont des &lt;strong&gt;propositions&lt;/strong&gt;. Elles ne constituent pas, à elles seules, une mise en conformité marketing, ni une promesse de résultat chiffré inventé. Elles préparent des missions distinctes si vous le souhaitez (intervention, reprise en code, CI/CD, migration, etc.).&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Restitution et documentation
&lt;/h3&gt;

&lt;p&gt;L’audit se termine quand le périmètre défini a été analysé et que le &lt;strong&gt;dossier d’audit&lt;/strong&gt; vous est remis — avec restitution. La documentation fait partie de la mission, selon le périmètre convenu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Livrables typiques
&lt;/h2&gt;

&lt;p&gt;Conformément à la description de la mission « Audit de compte AWS » sur &lt;a href="https://cervox.io/services/" rel="noopener noreferrer"&gt;cervox.io/services/&lt;/a&gt;, vous pouvez recevoir notamment :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;inventaire&lt;/strong&gt; des ressources analysées ;&lt;/li&gt;
&lt;li&gt;les &lt;strong&gt;principaux points d’attention&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;une &lt;strong&gt;analyse structurée&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;des &lt;strong&gt;recommandations&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;la &lt;strong&gt;restitution&lt;/strong&gt; et la &lt;strong&gt;documentation&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Terminé quand :&lt;/strong&gt; le périmètre défini a été analysé et le dossier d’audit vous est remis.&lt;/p&gt;

&lt;p&gt;Mots-clés de la fiche mission (rappel) : AWS · lecture seule · inventaire · architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce que cet audit n’est PAS
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ce n’est pas…&lt;/th&gt;
&lt;th&gt;Pourquoi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Une licence de tout modifier « pour améliorer »&lt;/td&gt;
&lt;td&gt;Lecture seule = pas de remédiation glissée dans l’audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Un abonnement de run / infogérance&lt;/td&gt;
&lt;td&gt;Une mission, une fin — pas d’abonnement pour cette offre&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Une garantie de baisse de facture chiffrée a priori&lt;/td&gt;
&lt;td&gt;Les coûts dépendent de votre usage ; l’audit éclaire, il n’invente pas de %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Un remplacement d’une due diligence M&amp;amp;A complète&lt;/td&gt;
&lt;td&gt;La due diligence technique est une mission voisine, au périmètre souvent plus large&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Une promesse « on connaît déjà votre compte »&lt;/td&gt;
&lt;td&gt;Chaque compte est analysé dans &lt;strong&gt;son&lt;/strong&gt; périmètre écrit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Suites possibles (missions distinctes)
&lt;/h2&gt;

&lt;p&gt;Après restitution, vous choisissez. Exemples de suites (chacune = nouveau périmètre) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intervention&lt;/strong&gt; sur un problème identifié ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure reprise en code&lt;/strong&gt; (Terraform, AWS CDK, Pulumi…) ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mises en production automatisées&lt;/strong&gt; (pipeline + contrôles + retour arrière si prévu) ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migration&lt;/strong&gt; vers AWS, ou depuis AWS vers un cloud européen, selon votre situation ;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Due diligence technique&lt;/strong&gt; si le contexte est une opération capitalistique.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rien n’est enchaîné automatiquement : vous gardez la décision.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ courte
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Faut-il donner accès au compte AWS ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui, avec des accès limités à ce que la mission demande. Un audit se fait en lecture seule. Les accès sont retirés à la fin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Où restent le code et l’infrastructure ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Chez vous. Les ressources restent dans votre compte ; le livrable d’audit (dossier) vous est remis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Combien ça coûte ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Le prix dépend du périmètre. Après un échange de 20 minutes, une estimation écrite peut être fournie sous 24 h ouvrées. Le prix définitif est fixé dans une proposition écrite, avant intervention. Pas d’abonnement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intervenez-vous à distance ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui pour l’essentiel des interventions, en France et au Benelux ; sur site lorsque la situation le nécessite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Travaillez-vous seulement sur AWS ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Principalement AWS. Azure et Google Cloud peuvent être étudiés selon la mission.&lt;/p&gt;




&lt;p&gt;Si votre compte AWS existe mais que sa cartographie réelle vous manque, commencez par le cadrer : décrivez la situation en quelques lignes. Nous indiquons si une mission d’audit lecture seule est pertinente, puis nous écrivons le périmètre avec vous.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://cervox.io/services/" rel="noopener noreferrer"&gt;Décrire votre situation sur CERVOX Services&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contact : &lt;a href="mailto:contact@cervox.io"&gt;contact@cervox.io&lt;/a&gt; · +33 4 44 05 07 68&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>cloud</category>
      <category>french</category>
    </item>
  </channel>
</rss>
