Aperçu
[!TIP] Vous utilisez Azure DevOps ? Consultez le Lab 07-ADO — Pipelines YAML ADO et contrôles de coûts pour la variante ADO de ce lab.
Objectifs d’apprentissage
À la fin de ce lab, vous serez capable de :
- Construire un workflow GitHub Actions avec une stratégie de matrice pour l’analyse multi-applications
- Configurer l’authentification OIDC pour Azure avec la fédération d’identité de charge de travail
- Implémenter un workflow de contrôle de coûts dans les PR avec Infracost
- Mettre en place le téléversement SARIF inter-dépôts via l’API GitHub Code Scanning
- Déclencher, surveiller et déboguer les exécutions de workflow
Exercices
Exercice 7.1 : Examiner le workflow d’analyse
Vous allez parcourir le workflow d’analyse centralisé qui exécute les 4 outils sur les 5 applications de démonstration.
-
Ouvrez
.github/workflows/finops-scan.ymlet examinez l’architecture globale :finops-scan.yml ├── psrule-scan (matrix: 5 apps) → SARIF artifacts ├── checkov-scan (matrix: 5 apps) → SARIF artifacts ├── custodian-scan (matrix: 5 apps) → SARIF artifacts └── cross-repo-upload (matrix: 5 apps) └── Downloads all SARIF → uploads to each demo app's Security tab -
Examinez les déclencheurs du workflow :
on: schedule: - cron: '0 6 * * 1' # Weekly Monday 06:00 UTC workflow_dispatch:Le workflow s’exécute selon un calendrier hebdomadaire et peut être déclenché manuellement.
-
Examinez le bloc de permissions :
permissions: contents: read security-events: write id-token: writecontents: read— récupère le code du dépôtsecurity-events: write— téléverse les SARIF vers Code Scanningid-token: write— demande des jetons OIDC pour l’authentification Azure
-
Examinez la stratégie de matrice utilisée par chaque job d’analyse :
strategy: matrix: app: ['001', '002', '003', '004', '005']Cela crée 5 jobs parallèles — un pour chaque application de démonstration. Chaque job récupère le dépôt de l’application correspondante et exécute l’outil d’analyse.
- Examinez les étapes du job
psrule-scan:- Checkout scanner repo — récupère la configuration PSRule et les convertisseurs SARIF
- Checkout target app — clone le dépôt de l’application de démonstration dans
target-app/ - Run PSRule — utilise l’action
microsoft/ps-rule@v2.9.0avec la baselineAzure.GA_2024_12 - Upload artifact — enregistre le fichier SARIF comme artefact de build pour le job de téléversement inter-dépôts
- Examinez le job
custodian-scan. Contrairement à PSRule et Checkov, Cloud Custodian :- S’authentifie auprès d’Azure via OIDC (
azure/login@v2) - S’exécute sur des ressources actives au lieu de fichiers IaC
- Utilise
continue-on-error: truepour empêcher les échecs d’analyse de bloquer le pipeline - Convertit la sortie JSON en SARIF avec
custodian-to-sarif.py
- S’authentifie auprès d’Azure via OIDC (
- Examinez le job
cross-repo-upload(couvert dans le Lab 06, Exercice 6.5). Notez comment il dépend des trois jobs d’analyse et s’exécute même si l’analyse custodian échoue.

[!TIP] La stratégie de matrice multiplie le nombre de jobs : 3 outils × 5 applications = 15 jobs d’analyse + 5 jobs de téléversement = 20 jobs au total. GitHub Actions exécute les jobs de la matrice en parallèle, donc l’ensemble de l’analyse se termine dans le temps du job individuel le plus lent.
Exercice 7.2 : Configuration OIDC
Vous allez configurer la fédération OIDC Azure pour que GitHub Actions puisse s’authentifier sans stocker de secrets.
-
Exécutez le script de configuration OIDC :
./scripts/setup-oidc.ps1 - Le script effectue 5 étapes :
- Enregistrement d’application — crée ou récupère une application Azure AD nommée
finops-scanner-github-actions - Informations d’identification fédérées — crée des informations d’identification OIDC pour chaque combinaison dépôt et branche
- Principal de service — crée ou récupère le principal de service pour l’application
- Attribution de rôle — accorde le rôle
Readersur l’abonnement - Résumé — affiche le Client ID, le Tenant ID et le Subscription ID à configurer comme secrets GitHub
- Enregistrement d’application — crée ou récupère une application Azure AD nommée
-
Examinez le format du sujet des informations d’identification fédérées :
repo:devopsabcs-engineering/finops-scan-demo-app:ref:refs/heads/main repo:devopsabcs-engineering/finops-demo-app-001:environment:productionChaque information d’identification associe un dépôt GitHub spécifique + une branche (ou un environnement) à l’application Azure AD. C’est la revendication de sujet OIDC qu’Azure valide lors de l’émission des jetons.
- Une fois le script terminé, ajoutez les secrets suivants dans les paramètres de votre dépôt GitHub :
AZURE_CLIENT_ID— le client ID de l’enregistrement d’applicationAZURE_TENANT_ID— votre tenant ID Azure ADAZURE_SUBSCRIPTION_ID— l’ID de l’abonnement cible

[!IMPORTANT] La fédération OIDC élimine le besoin de secrets client ou de certificats. Le runner GitHub Actions demande un jeton à durée de vie courte au fournisseur OIDC de GitHub, et Azure le valide par rapport à la configuration des informations d’identification fédérées. Aucune information d’identification à longue durée de vie n’est stockée dans les secrets GitHub.
Exercice 7.3 : Déclencher le workflow d’analyse
Vous allez déclencher le workflow d’analyse manuellement et surveiller son exécution.
-
Déclenchez le workflow avec GitHub CLI :
gh workflow run finops-scan.yml -
Surveillez l’exécution du workflow :
gh run watchCela ouvre une vue interactive montrant tous les jobs de la matrice et leur progression.
-
Sinon, ouvrez le dépôt sur GitHub, cliquez sur Actions, et sélectionnez le workflow FinOps Scan pour suivre l’exécution dans le navigateur.
- Le workflow crée 20 jobs au total :
- 5 jobs d’analyse PSRule (un par application)
- 5 jobs d’analyse Checkov (un par application)
- 5 jobs d’analyse Cloud Custodian (un par application)
- 5 jobs de téléversement inter-dépôts (un par application)
- Attendez la fin de l’exécution. Les jobs PSRule et Checkov se terminent généralement en 1 à 2 minutes. Les jobs Cloud Custodian peuvent prendre plus de temps car ils interrogent les ressources Azure actives.

[!NOTE] Si les jobs Cloud Custodian échouent avec des erreurs d’authentification, vérifiez que vos informations d’identification OIDC sont correctement configurées (Exercice 7.2) et que les secrets
AZURE_CLIENT_ID,AZURE_TENANT_IDetAZURE_SUBSCRIPTION_IDsont définis dans les paramètres du dépôt.
Exercice 7.4 : Examiner les résultats du workflow
Vous allez inspecter les artefacts, les téléversements SARIF et l’onglet Sécurité après la fin du workflow.
-
Listez les artefacts du workflow :
gh run view --log -
Téléchargez les artefacts SARIF pour une application spécifique :
gh run download -n sarif-psrule-001 gh run download -n sarif-checkov-001 gh run download -n sarif-custodian-001 -
Ouvrez les fichiers SARIF téléchargés et vérifiez qu’ils contiennent des résultats.
-
Naviguez vers le dépôt de chaque application de démonstration sur GitHub et consultez l’onglet Security. Le job de téléversement inter-dépôts devrait avoir rempli les alertes Code Scanning des trois outils.
-
Comparez les résultats entre les outils :
- PSRule — violations d’étiquettes, nommage, régions et bonnes pratiques Azure
- Checkov — violations de sécurité, chiffrement et benchmarks CIS
- Cloud Custodian — état des ressources en temps réel (orphelins, surdimensionnées, inactives)


Exercice 7.5 : PR avec contrôle de coûts
Vous allez créer une pull request qui modifie les coûts d’infrastructure et observer le contrôle de coûts Infracost en action.
-
Créez une nouvelle branche :
git checkout -b test/cost-gate-demo -
Ouvrez le
infra/main.bicepde n’importe quelle application de démonstration et changez un SKU pour quelque chose de plus coûteux. Par exemple, augmentez l’App Service Plan de l’application 001 :sku: { name: 'P3v3', tier: 'PremiumV3' } -
Validez et poussez la modification :
git add . git commit -m "test: upgrade SKU to trigger cost gate" git push -u origin test/cost-gate-demo -
Créez une pull request :
gh pr create --title "test: upgrade SKU to trigger cost gate" --body "Testing Infracost cost gate workflow" - Attendez l’exécution du workflow
FinOps Cost Gate. Il :- Génère une référence de coûts depuis la branche
main - Exécute
infracost diffsur les changements de votre PR - Publie un commentaire résumant les coûts sur la PR montrant l’impact mensuel
- Téléverse un fichier SARIF avec les résultats de coûts
- Génère une référence de coûts depuis la branche
-
Examinez le commentaire Infracost sur la PR. Il montre un tableau avec les changements de coûts par ressource et l’impact mensuel total.
-
Fermez la PR sans fusionner (c’était un test) :
gh pr close --delete-branch

[!TIP] Le workflow de contrôle de coûts utilise le drapeau
--behavior updatepour le commentaire Infracost. Cela signifie que chaque push vers la branche de la PR met à jour le commentaire existant plutôt que d’en créer un nouveau, gardant la conversation de la PR propre.
Exercice 7.6 : Déploiement et suppression
Vous allez déclencher les workflows deploy-all et teardown-all pour comprendre le cycle de vie complet.
-
Déclenchez le workflow deploy-all :
gh workflow run deploy-all.yml -
Surveillez le déploiement :
gh run watchLe workflow deploy-all déploie les 5 applications de démonstration séquentiellement. Chaque application déploie son template Bicep dans un groupe de ressources dédié (
rg-finops-demo-001àrg-finops-demo-005). -
Une fois le déploiement terminé, vérifiez les ressources dans le portail Azure ou via le CLI :
az group list --query "[?starts_with(name, 'rg-finops-demo')].[name, location]" -o table -
Déclenchez le workflow teardown-all :
gh workflow run teardown-all.yml -
Le workflow de suppression nécessite une approbation d’environnement. Naviguez vers la page GitHub Actions et approuvez le déploiement de l’environnement
productionlorsque demandé. -
Après approbation, le workflow supprime les 5 groupes de ressources et leur contenu.

[!IMPORTANT] Le workflow de suppression utilise un environnement
productionavec des réviseurs requis comme barrière de sécurité. Cela empêche la suppression accidentelle. Dans les workflows FinOps en production, utilisez toujours des règles de protection d’environnement pour les opérations destructrices.
Point de vérification
Avant de terminer l’atelier, vérifiez :
- Le workflow
finops-scan.ymls’est exécuté avec succès avec les jobs de la matrice - Les artefacts SARIF ont été téléversés vers les onglets Sécurité des 5 dépôts d’applications
- Le workflow de contrôle de coûts a publié un commentaire Infracost sur une pull request
- Pouvez expliquer le format de la revendication de sujet des informations d’identification fédérées OIDC
Félicitations
Vous avez terminé les 8 labs de l’Atelier de gouvernance des coûts FinOps. Voici un résumé de ce que vous avez appris :
| Lab | Ce que vous avez appris |
|---|---|
| Lab 00 | Mise en place de l’environnement de développement avec les 4 outils d’analyse |
| Lab 01 | Identification des 5 violations FinOps des applications de démonstration et des 7 étiquettes de gouvernance requises |
| Lab 02 | Exécution de PSRule sur des templates Bicep pour l’analyse des bonnes pratiques Azure |
| Lab 03 | Exécution de Checkov pour l’analyse de sécurité et des benchmarks CIS |
| Lab 04 | Exécution de Cloud Custodian sur les ressources Azure actives pour la détection de violations en temps réel |
| Lab 05 | Utilisation d’Infracost pour estimer les coûts et comparer les changements d’infrastructure |
| Lab 06 | Compréhension du format SARIF et téléversement des résultats vers l’onglet Sécurité GitHub |
| Lab 07 | Construction de pipelines automatisés avec stratégie de matrice, authentification OIDC et contrôles de coûts dans les PR |
Vous avez maintenant les compétences pour implémenter une plateforme d’analyse FinOps complète qui :
- Analyse les templates IaC avant le déploiement (PSRule, Checkov, Infracost)
- Analyse les ressources actives après le déploiement (Cloud Custodian)
- Produit une sortie SARIF unifiée pour tous les outils
- S’intègre à l’onglet Sécurité GitHub pour la gestion centralisée des alertes
- Bloque les changements coûteux avec des contrôles de coûts dans les PR
- S’exécute automatiquement selon un calendrier et à la demande via GitHub Actions