Utiliser des recommandations pour l'Infrastructure as Code


Présentation

Google Cloud Policy Intelligence aide les entreprises à comprendre et à gérer leurs stratégies afin de réduire les risques. Avec davantage de visibilité et d'automatisation, les clients peuvent renforcer la sécurité sans augmenter leur charge de travail.

L'outil de recommandation vous permet de récupérer des recommandations pour les ressources Google Cloud, ce qui vous permet d'améliorer la sécurité dans le cloud, de réduire les coûts, etc. Pour obtenir la liste des recommandations compatibles, consultez la documentation de l'outil de recommandation. Ce tutoriel décrit l'utilisation des recommandations de dimensionnement d'instances de VM et les recommandations de gestion de l'authentification et des accès (IAM). L'outil de recommandation utilise le machine learning pour fournir aux administrateurs des recommandations sur la suppression d'un accès inutile aux ressources Google Cloud et le redimensionnement des instances Compute Engine afin d'optimiser l'utilisation des ressources.

Chaque recommandation comprend une action suggérée et son impact. Après avoir examiné les recommandations pour les impacts identifiés et d'autres considérations spécifiques à votre environnement, vous pouvez sélectionner les recommandations que vous souhaitez appliquer. Vous pouvez appliquer des recommandations manuellement à partir de la console Google Cloud ou automatiquement en les intégrant dans votre pipeline Infrastructure as Code (IaC).

L'IaC vous permet d'automatiser la création de vos ressources Google Cloud. Vous devez maintenir votre dépôt IaC à jour et l'utiliser pour déployer les modifications de routes apportées à votre organisation Google Cloud. Les stratégies IaC au sein des entreprises s'avèrent généralement bénéfiques lorsqu'elles sont mises en œuvre avec rigueur et servent de version unique de vérité pour votre infrastructure cloud. Il est essentiel que votre dépôt IaC soit à jour afin d'éviter les écarts entre la version de votre infrastructure reflétée dans votre dépôt IaC et celle de votre organisation.

Recommandations IAM

Parmi les autres bonnes pratiques, l'une des plus courantes concernant la sécurité consiste à appliquer le principe du moindre privilège et à bien réfléchir sur la manière dont les modifications apportées à votre organisation sont déployées et synchronisées avec votre dépôt IaC.

Recommandations de dimensionnement des VM

Les recommandations de dimensionnement vous aident à réduire les coûts. Il s'agit de suggestions permettant de redimensionner le type de machine de vos instances afin d'utiliser plus efficacement les ressources d'instance.

Ce tutoriel explique comment concevoir et créer un pipeline d'automatisation pour appliquer une recommandation Policy Intelligence de manière automatisée. Lors de la création de ce pipeline d'automatisation, vous apprendrez également à maintenir votre dépôt IaC à jour avec les modifications que vous décidez d'apporter à votre organisation Google Cloud, en fonction des recommandations de dimensionnement de VM et des liaisons de stratégie IAM que l'outil de recommandation met à disposition.

Ce tutoriel utilise Hashicorp Terraform comme outil IaC, mais vous pouvez exploiter les modèles et composants architecturaux utilisés dans le pipeline d'automatisation décrit même si vous utilisez un outil de gestion IaC différent tel que Deployment Manager. Dans le cadre de ce tutoriel, vous devrez modifier le codebase Open Source pour l'adapter à votre mise en œuvre IaC spécifique.

Ce guide s'adresse aux architectes, propriétaires de produits et développeurs qui seraient éventuellement chargés de l'administration, de la sécurité et de la planification de l'infrastructure de Google Cloud.

Architecture du pipeline d'automatisation

Le schéma suivant montre les composants que vous utilisez dans ce pipeline d'automatisation.

Composants du pipeline d'automatisation

Une tâche Cloud Scheduler planifiée exécute le service de recherche de recommandations. Ce service appelle l'API Recommender pour récupérer les recommandations de l'outil de recommandation pour les projets que vous spécifiez. Il analyse ensuite ces recommandations de dimensionnement de VM et de stratégies IAM pour les mapper à la configuration spécifiée dans vos fichiers manifestes Terraform. Le service met à jour vos fichiers manifestes IaC pour refléter ces recommandations. Il génère une demande d'extraction avec les modifications apportées afin que vous puissiez examiner les mises à jour. Une fois que vous avez examiné et fusionné la demande d'extraction, une tâche Cloud Build déploie les modifications apportées à votre infrastructure dans votre organisation Google Cloud.

Une fois la compilation terminée et l'état Terraform enregistré, plusieurs services Google Cloud auxiliaires vous permettent de suivre les recommandations traitées dans le pipeline et les notifications générées. Vous en apprendrez plus sur ces services au cours de ce tutoriel.

La liste suivante décrit le rôle de chaque composant et les conditions requises pour le contrôle des accès :

Outils de recommandation Platform Intelligence
Rôle : générer des recommandations de sécurité et de dimensionnement des VM

Contrôle des accès : le compte de service Google Cloud doit disposer des autorisations IAM requises pour récupérer des recommandations à l'aide de l'API Recommender.

Examinez le rôle des outils de recommandation et les autorisations requises pour sélectionner celui qui conviendra le mieux au compte de service que vous utilisez pour exécuter le service de l'outil de recommandation.

Cloud Scheduler

Rôle : Cloud Scheduler déclenche le service de recherche de recommandations. Cloud Scheduler vous permet de configurer plusieurs tâches pour appeler autant d'instances du service d'analyse que nécessaire. Chaque appel doit transmettre les entrées suivantes :

  • Liste des projets pour lesquels des recommandations doivent être traitées
  • Type de recommandation
  • Nom du dépôt IaC

Contrôle des accès : Créez ou identifiez un compte de service Google Cloud à utiliser pour les appels de Cloud Scheduler au service d'analyse de votre outil de recommandation.

Attribuez au compte de service le rôle d'agent de service Cloud Scheduler afin qu'il puisse exécuter des tâches Cloud Scheduler. En outre, attribuez au compte de service le rôle de demandeur Cloud Run, car ce compte appelle un service Cloud Run.

Pour plus de précisions, consultez la documentation sur la configuration de l'accès authentifié pour les tâches du planificateur.

Service Cloud Run

Rôle : le service d'analyse de l'outil de recommandation est le composant où réside toute la logique de traitement. Il comporte plusieurs routes, chacune ayant un objectif spécifique :

  • Rechercher des recommandations par type
  • Mettre à jour l'état des recommandations en cours de traitement

Contrôle des accès : utilisez des stratégies IAM pour gérer l'accès à ce service.

Attribuez également un compte de service dédié au service. Cela garantit que seul ce service peut appeler d'autres services tels que Firestore.

Hashicorp Terraform

Usage : Terraform 0.12 est l'outil IaC.

Un compilateur Cloud Build pour Terraform permet d'appeler des commandes Terraform. Le compte de service Cloud Build est utilisé à cette fin.

Cloud Build

Rôle : Google Cloud Build automatise le déploiement de l'infrastructure en fonction des modifications apportées aux fichiers manifestes IaC selon les recommandations Policy Intelligence.

Contrôle des accès : le compte de service Cloud Build doit disposer des autorisations appropriées pour interagir avec les ressources de votre projet de test.

Consultez la documentation sur la configuration d'un compte de service Cloud Build.

GitHub

Rôle : le dépôt IaC utilise GitHub pour le contrôle des sources. Le dépôt IaC dans GitHub est intégré à Cloud Build. Lorsque des commits sont effectués dans la branche maître, une tâche Cloud Build est déclenchée pour exécuter un ensemble de tâches préconfigurées.

Contrôle des accès : vous devez générer des clés SSH pour autoriser l'accès à votre dépôt IaC.

Vous devez également générer un jeton d'accès personnel pour envoyer des commits vers GitHub.

Firestore

Cloud Firestore est une base de données de documents NoSQL entièrement gérée et évolutive, qui est utilisée dans cette architecture pour conserver des informations sur les ID de recommandation récupérés par le service d'analyse de l'outil de recommandation, ainsi que des détails pertinents pour les commits Git.

Ces détails conservés dans Firestore jouent un rôle intégral dans la boucle de rétroaction du pipeline de bout en bout. Après avoir récupéré une recommandation générée par l'API Recommender et avant de la traiter, le service définit l'état de la recommandation sur CLAIMED. Une fois la recommandation appliquée, le service interroge la base de données pour récupérer les ID de recommandation qui ont été appliqués lors de l'exécution de la tâche Cloud Build, et définit l'état de la recommandation sur SUCCEEDED. Si la tâche Cloud Build échoue, l'état de la recommandation est remplacé par FAILED.

Contrôle des accès : reportez-vous à la section Rôles Firestore pour plus de détails. Le service d'analyse de l'outil de recommandation lit les données de Firestore. Il nécessite le rôle roles/datastore.user pour effectuer cette opération.

Pub/Sub

Rôle : Cloud Build publie des messages dans un sujet Pub/Sub lorsque l'état de la compilation change, par exemple lors de la création de la compilation, lorsque la compilation passe à un état fonctionnel et lorsque votre compilation se termine.

Le sujet Pub/Sub dans lequel Cloud Build publie des messages se nomme "cloud-builds". Il est automatiquement créé lorsque vous activez l'API Cloud Build dans votre projet.

Contrôle des accès : vous pouvez configurer des abonnements en mode push pour fournir un en-tête d'authentification permettant au service d'autoriser la requête. Pour plus d'informations, consultez la page Utiliser des abonnements en mode push.

Objectifs

  • Créer un pipeline d'automatisation pour
    • Surveiller de manière proactive les recommandations Policy Intelligence
    • Rechercher des recommandations et appliquer les mises à jour à un dépôt IaC existant
  • Découvrir comment utiliser une suite de services Google Cloud, Hashicorp Terraform et GitHub pour créer ce pipeline
  • Découvrir les conditions requises et les bonnes pratiques à connaître pour créer ce pipeline
  • Tester le pipeline

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

  • Cloud Run
  • Cloud Build
  • Instance
  • Cloud Storage
  • Firestore
  • Pub/Sub
  • Cloud Scheduler
  • Outil de recommandation

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

Dans ce tutoriel, nous partons du principe que vous disposez d'un compte GitHub et que vous connaissez Git, Node.js, Terraform et Docker.

Notes de version et conditions requises

Les outils et les fichiers manifestes IaC peuvent être utilisés de multiples façons.

Consultez les informations suivantes pour déterminer comment adapter ce tutoriel à votre pipeline IaC et quels types de modifications peuvent être nécessaires.

  • Ce pipeline utilise Terraform version 0.12. Des modifications importantes de la syntaxe de configuration HCL ou des modifications apportées à la structure du fichier d'état Terraform peuvent entraîner des problèmes destructifs.
  • Ce pipeline suppose que les structures de répertoires IaC ne sont pas imbriquées et qu'un dépôt IaC gère les ressources d'un ou plusieurs projets Google Cloud.
  • Les variables Terraform transmises en tant que variables d'environnement et les arguments de ligne de commande ne sont pas compatibles. Le prototype suppose une configuration déclarative des variables Terraform dans un fichier tfvars.
  • L'outil de recommandation génère des recommandations IAM lorsqu'un sous-ensemble d'autorisations associé à un rôle n'a pas été utilisé depuis 60 jours. Il en est de même pour les recommandations de dimensionnement de VM. Pour les besoins de ce tutoriel, nous fournissons des exemples de charges utiles de recommandations pouvant servir à tester le pipeline.
  • Les boucles dans Terraform ne sont pas compatibles avec cette version.
  • Les modules Terraform ne sont pas compatibles. Le codebase est Open Source et nous supposons que vous apporterez les améliorations spécifiques nécessaires au flux d'analyse en fonction de la structure de vos répertoires et de l'utilisation des modules.

La version actuelle du service d'analyse de l'outil de recommandation Open Source est conforme aux limitations connues des recommandations IAM suivantes :

Prérequis

  1. Sélectionnez ou créez deux projets Google Cloud.

    Accéder à la page de sélection du projet

    • Un projet build qui héberge et exécute le pipeline d'automatisation.
    • Un projet test qui héberge les ressources Google Cloud utilisées pour tester le pipeline d'automatisation.
  2. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  3. Dans le projet test, activez les API Recommender et Compute Engine.

    Activer les API

  4. Dans le projet build, activez les API Cloud Run, Firestore, Pub/Sub, Cloud Scheduler, IAM et CloudResourceManager.

    Activer les API

Une fois que vous avez terminé ce tutoriel, évitez de continuer à payer des frais en supprimant les ressources que vous avez créées. Consultez la section Effectuer un nettoyage pour en savoir plus.

Configurer votre environnement

  1. Dans la console Google Cloud, sélectionnez votre projet build.
  2. Dans la console Google Cloud, accédez à Cloud Shell.

    Accéder à Cloud Shell

    En bas de la fenêtre de la console Google Cloud, une session Cloud Shell s'ouvre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

    Utilisez Cloud Shell pour toutes les commandes de terminal de ce tutoriel.

  3. Créez une variable d'environnement destinée à contenir le numéro de projet de votre projet build à l'aide de la commande ci-dessous :

    export BUILD_PROJECT_ID=$DEVSHELL_PROJECT_ID
    
  4. Créez une variable d'environnement destinée à contenir le numéro de projet de votre projet test. Copiez l'ID du projet de test manuellement et remplacez PROJECT-ID par celui-ci :

    export TEST_PROJECT_ID=PROJECT-ID
    
  5. Vous définissez des paramètres par défaut pour les valeurs utilisées tout au long du tutoriel, telles que la région et la zone. Dans ce tutoriel, la région par défaut est us-central1 et la zone par défaut est us-central1-b.

  6. Définissez la région et la zone par défaut pour ce tutoriel en exécutant la commande suivante :

    gcloud config set compute/zone us-central1-b --project $BUILD_PROJECT_ID
    gcloud config set compute/zone us-central1-b --project $TEST_PROJECT_ID
    
  7. Définissez votre projet build comme projet par défaut :

    gcloud config set project $BUILD_PROJECT_ID
    
  8. Créez une variable d'environnement nommée BUILD_PROJECT_NUMBER pour votre buildnuméro de projet

    export BUILD_PROJECT_NUMBER=$(gcloud projects describe $DEVSHELL_PROJECT_ID --format='value(projectNumber)')
    
  9. Clonez le dépôt GitHub pour ce tutoriel :

Créer un bucket pour le fichier d'état Terraform

Créez un bucket Cloud Storage dans votre projet de compilation pour stocker le fichier d'état Terraform.

gsutil mb -p ${BUILD_PROJECT_ID} -l us-central1 \
 gs://recommender-tf-state-$BUILD_PROJECT_ID

Créer un dépôt GitHub

Créez un dépôt GitHub qui servira d'exemple de dépôt IaC.

  1. Créez un dépôt GitHub privé. Ce dépôt IAC-REPO-NAME servira de dépôt IaC dans ce tutoriel.

  2. Dans les ensembles de données suivants, vous allez transférer les fichiers du sous-répertoire sample-iac du dépôt cloné vers votre compte GitHub.

    1. Dans Cloud Shell, copiez le répertoire sample-iac dans votre répertoire d'accueil. Vous utiliserez ce répertoire pour créer un dépôt local et le transférer vers GitHub.

      cp -r recommender-iac-pipeline-nodejs-tutorial/sample-iac $HOME
      
    2. Accédez au nouveau répertoire.

      cd $HOME/sample-iac
      
    3. Initialisez le dépôt sur votre machine locale.

      git init
      
    4. Ajoutez IAC-REPO-NAME comme dépôt distant, en remplaçant IAC-REPO-NAME et GITHUB-ACCOUNT par les valeurs appropriées.

      git remote add origin http://github.com/GITHUB-ACCOUNT/IAC-REPO-NAME
      
    5. Remplacez les espaces réservés dans les fichiers de ce dépôt par l'ID de votre projet test et le nom du bucket Cloud Storage Terraform.

      sed -i "s|__PROJECT_ID__|${TEST_PROJECT_ID}|g" ./terraform.tfvars
      
      sed -i "s|__STATE_BUCKET_NAME__|recommender-tf-state-$BUILD_PROJECT_ID|g" ./backend.tf
      
    6. Ajoutez les fichiers, validez-les et transférez-les vers GitHub.

      git add .
      git commit -m "First Commit"
      git push origin master
      
    7. Connectez-vous à votre compte GitHub lorsque vous y êtes invité.

Générer des clés SSH pour votre dépôt

Configurez l'authentification par clé SSH avec votre dépôt IaC dans GitHub et importez les clés dans Cloud Storage.

  1. Générez des clés SSH pour votre dépôt GitHub.

    1. Générez une paire de clés SSH. Remplacez [email protected] par votre adresse e-mail GitHub. Dans Cloud Shell :

      ssh-keygen -t rsa -b 4096 -m PEM -C "[email protected]"
      
    2. Lorsque vous êtes invité à "Saisir un fichier dans lequel enregistrer la clé", appuyez sur Entrée. Cette action accepte l'emplacement du fichier par défaut.

    3. Lorsque vous êtes invité à saisir une phrase secrète, appuyez sur Enter.

  2. Notez le répertoire SSH-KEYS-DIR dans lequel vous enregistrez les clés SSH téléchargées. Par défaut, l'emplacement est $HOME/.ssh/.

  3. Copiez la clé publique SSH que vous avez générée dans votre dépôt GitHub en tant que clé de déploiement.

    1. Copiez la clé publique SSH que vous avez générée dans Cloud Shell. Remplacez SSH-KEYS-DIR par le chemin d'accès de votre répertoire.

      cat SSH-KEYS-DIR/id_rsa.pub
      
    2. Dans votre compte GitHub, accédez au dépôt IAC-REPO-NAME.

    3. Cliquez sur Settings > Deploy Keys (Paramètres > Déployer les clés).

    4. Cliquez sur Ajouter une clé de déploiement et collez la clé publique SSH que vous avez copiée. Choisissez un titre pour la clé.

    5. Cochez la case "Autoriser l'accès en écriture".

    6. Cliquez sur Enregistrer.

  4. Revenez à votre session Cloud Shell.

  5. Créez le fichier known_hosts pour GitHub. Dans votre session Cloud Shell, exécutez la commande suivante :

    ssh-keyscan github.com >> ~/.ssh/known_hosts
    
  6. Créez un bucket Cloud Storage dans votre projet build, puis importez vos clés SSH et votre fichier known_hosts. Remplacez SSH-KEYS-DIR par le chemin d'accès au répertoire dans lequel vous avez généré les clés SSH.

    gsutil mb -p ${BUILD_PROJECT_ID} -l us-central1 gs://github-keys-$BUILD_PROJECT_ID
    
    gsutil cp SSH-KEYS-DIR/id_rsa* gs://github-keys-$BUILD_PROJECT_ID
    gsutil cp SSH-KEYS-DIR/known_hosts gs://github-keys-$BUILD_PROJECT_ID
    
  7. Générez un jeton d'accès personnel pour GitHub. Ce jeton est utilisé lors de l'exécution d'opérations Git à l'aide d'appels d'API effectués par le service d'analyse de l'outil de recommandation pour générer des requêtes d'extraction et archiver les manifestes IaC mis à jour.

    1. Dans votre compte GitHub, dans le coin supérieur droit de n'importe quelle page, cliquez sur votre photo de profil, puis sur Paramètres.

    2. Dans la barre latérale de gauche, cliquez sur Paramètres du développeur.

    3. Dans la barre latérale de gauche, cliquez sur Jetons d'accès personnels.

    4. Cliquez sur "Générer un nouveau jeton".

    5. Attribuez un nom descriptif à votre jeton.

    6. Sélectionnez dépôt comme champs d'application.

    7. Cliquez sur Générer un jeton.

    8. Copiez le jeton dans votre presse-papiers.

    9. Dans votre session Cloud Shell, créez une variable d'environnement.

      export GITHUB_PAT=personal-access-token-you-copied
      

Configurer Cloud Build

  1. Connectez votre dépôt Git IAC-REPO-NAME pour l'intégrer à Cloud Build.

    1. Accédez à la page Application Cloud Build sur GitHub Marketplace.
    2. Faites défiler la page, puis cliquez sur Configurer avec Google Cloud Build en bas de la page.
    3. Si vous y êtes invité, connectez-vous à GitHub.
    4. Sélectionnez Sélectionner uniquement les dépôts. Utilisez la liste déroulante Sélectionner des dépôts pour n'autoriser l'accès à votre IAC-REPO-NAME que dans l'application Cloud Build.
    5. Cliquez sur Installer.
    6. Connectez-vous à Google Cloud.

      La page "Autorisation" s'affiche et vous invite à autoriser l'application Google Cloud Build à se connecter à Google Cloud.

    7. Cliquez sur Autoriser Google Cloud Build par GoogleCloudBuild. Vous êtes redirigé vers Google Cloud Console.

    8. Sélectionnez votre projet Google Cloud.

    9. Cochez la case pour accorder votre autorisation, puis cliquez sur Suivant.

    10. Sur la page Sélectionner un dépôt qui s'affiche, sélectionnez le dépôt GitHub IAC-REPO-NAME.

    11. Cliquez sur Connecter un dépôt.

    12. Cliquez sur Créer un déclencheur. Cette action crée automatiquement une définition de déclencheur.

    13. Cliquez sur Créer pour enregistrer le déclencheur de compilation.

    Pour en savoir plus, consultez la page Exécuter des compilations sur GitHub.

  2. Le répertoire que vous avez copié contient un fichier cloudbuild.yaml. Ce fichier de configuration décrit les étapes qu'une tâche Cloud Build exécute lors du déclenchement.

    steps:
    - name: hashicorp/terraform:0.12.0
      args: ['init']
    - name: hashicorp/terraform:0.12.0
      args: ['apply', '-auto-approve']
    
  3. Ajoutez des autorisations à votre compte de service Cloud Build pour lui permettre de créer des comptes de service, d'associer des rôles et des machines virtuelles (instances Compute Engine) dans le projet de test.

    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:[email protected] \
      --role roles/compute.admin \
      --project $TEST_PROJECT_ID
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:[email protected] \
      --role roles/iam.serviceAccountAdmin \
      --project $TEST_PROJECT_ID
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
    --member serviceAccount:[email protected] \
    --role roles/iam.securityAdmin \
    --project $TEST_PROJECT_ID
    
  4. Ouvrez la page Déclencheurs de compilation dans la console Google Cloud.

  5. Sélectionnez un projet build, puis cliquez sur Ouvrir.

  6. Mettez à jour la définition du déclencheur :

    1. Cliquez sur le menu , puis sur Modifier.
    2. Dans le champ Configuration, sélectionnez l'option Fichier de configuration Cloud Build (yaml ou json), et saisissez cloudbuild.yaml dans le champ de texte.
    3. Cliquez sur Enregistrer.
  7. Pour tester manuellement le déclencheur de compilation, cliquez sur Exécuter sur l'entrée de votre déclencheur dans la liste.

  8. Vérifiez qu'une instance Compute Engine nommé tf-compute-1 et un compte de service nommé Terraform Recommender Test ont bien été créés dans votre projet de test par la tâche Cloud Build exécutée à l'étape précédente.

Déployer le service Cloud Run de l'outil de recommandation

  1. Dans Cloud Shell, remplacez les répertoires par le répertoire créé en clonant le dépôt.

    cd $HOME/recommender-iac-pipeline-nodejs-tutorial/parser-service
    
  2. Configurez Google Cloud pour utiliser une région par défaut pour les services Cloud Run. Dans ce tutoriel, vous utilisez la région us-central1, mais vous pouvez en choisir une autre si vous le souhaitez.

    gcloud config set run/region us-central1
    
  3. Le répertoire parser-service comporte un sous-répertoire stub qui contient quelques exemples de charge utile JSON avec lesquels vous pouvez tester le service d'analyse de l'outil de recommandation. Exécutez les commandes suivantes pour remplacer les espaces réservés PROJECT_ID dans ces fichiers JSON par votre ID de projet de test.

    sed -i "s|__PROJECT_ID__|${TEST_PROJECT_ID}|g" ./stub/iam.json
    sed -i "s|__PROJECT_ID__|${TEST_PROJECT_ID}|g" ./stub/vm.json
    
  4. Exécutez la commande suivante afin de créer une variable d'environnement pour votre image Docker.

    export IMAGE=gcr.io/$BUILD_PROJECT_ID/recommender-parser:1.0
    
  5. Créez l'image et importez-la dans Container Registry.

    gcloud builds submit --tag $IMAGE .
    
  6. Créez un compte de service pour que le service d'analyse de l'outil de recommandation interagisse avec les autres services Google Cloud du pipeline. Il est recommandé d'accorder des autorisations précises à vos services Cloud Run. Pour plus de détails, consultez la page Identité du service Cloud Run.

    gcloud beta iam service-accounts create recommender-parser-sa \
      --description "Service account that the recommender-parser service uses to invoke other Google Cloud services" \
      --display-name "recommender-parser-sa" \
      --project $BUILD_PROJECT_ID
    
  7. Le service d'analyse de l'outil de recommandations doit accéder aux clés GitHub et au fichier d'état Terraform que vous avez importé dans les buckets Cloud Storage créés précédemment. Ajoutez le compte de service en tant que membre au bucket Cloud Storage.

    gsutil iam ch serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com:objectCreator,objectViewer \
    gs://github-keys-$BUILD_PROJECT_ID
    
    gsutil iam ch serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com:objectCreator,objectViewer \
    gs://recommender-tf-state-$BUILD_PROJECT_ID
    
  8. Autorisez le compte de service d'analyse de l'outil de recommandation à accéder à Firestore, à l'API Recommender et à l'API Service Usage.

    gcloud projects add-iam-policy-binding $BUILD_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/datastore.user
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/recommender.iamAdmin
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/recommender.iamViewer
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/recommender.computeAdmin
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/serviceusage.serviceUsageConsumer
    
  9. Déployez le service Cloud Run, nommé recommender-parser, en exécutant la commande. Remplacez GITHUB-ACCOUNT par le nom d'utilisateur de votre compte GitHub, et non par un e-mail. Acceptez toutes les invites du système.

    gcloud run deploy \
     --image=${IMAGE} \
     --no-allow-unauthenticated \
     --region us-central1 \
     --platform managed \
     --service-account recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
     --set-env-vars="GITHUB_ACCOUNT=github.com:GITHUB-ACCOUNT,GITHUB_PAT=${GITHUB_PAT},SSH_KEYS_BUCKET=github-keys-${BUILD_PROJECT_ID},TERRAFORM_STATE_BUCKET=recommender-tf-state-$BUILD_PROJECT_ID" \
     --project $BUILD_PROJECT_ID \
     recommender-parser
    

Configurer Firestore

  1. Dans Google Cloud Console, dans votre projet build, accédez à la page Firestore.
  2. Lorsque vous êtes invité à sélectionner le mode, cliquez sur Sélectionner le mode natif.
  3. Sélectionnez us-east1 comme emplacement par défaut.
  4. Cliquez sur Create Database (Créer une base de données).

Le service recommender-parser écrit des documents dans cette base de données aux fins suivantes :

  • Pour garder une trace des recommandations récupérées depuis l'API Recommender
  • Pour appeler l'API Recommender une fois les recommandations traitées afin de mettre à jour l'état de chaque recommandation traitée sur SUCCEEDED ou FAILED, selon le cas. Il s'agit d'une étape clé qui rend le pipeline idempotent en garantissant que les recommandations ne sont pas traitées de manière incomplète ou plusieurs fois.

Configurer une tâche Cloud Scheduler

  1. Créez un compte de service que les tâches Cloud Scheduler utilisent pour exécuter le service d'analyse de l'outil de recommandation.

    gcloud beta iam service-accounts create recommender-scheduler-sa \
      --description "Service Account used by Cloud Scheduler to invoke the recommender-parser service" \
      --display-name "recommender-scheduler-sa" \
      --project $BUILD_PROJECT_ID
    
  2. Attribuez au compte de service le rôle d'exécuteur ou d'appelant pour pouvoir appeler le service Cloud Run.

    gcloud beta run services add-iam-policy-binding recommender-parser \
    --member=serviceAccount:recommender-scheduler-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
    --role=roles/run.invoker \
    --region=us-central1
    
  3. Obtenez l'URL du service de recommandation :

    gcloud beta run services list --platform managed --project $BUILD_PROJECT_ID
    

    Votre tâche Cloud Scheduler appelle la route recommandation/IAM du service d'analyse de l'outil de recommandation pour analyser des recommandations IAM et la route /recommender/vm pour analyser les recommandations de dimensionnement de machine virtuelle.

  4. Créez une variable pour le point de terminaison appelé par les tâches Cloud Scheduler. Remplacez RECOMMENDER-SERVICE-URL par l'URL du service de recommandation que vous avez copiée à l'étape précédente.

    export RECOMMENDER_ROUTE_TO_INVOKE_IAM=RECOMMENDER-SERVICE-URL/recommendation/iam
    

    Après avoir ajouté les informations sur la route, vous devriez obtenir une URL d'exemple semblable à celle-ci :

    RECOMMENDER-SERVICE-URL/recommendation/iam
    
  5. Créez une tâche Cloud Scheduler nommée recommender-iam-scheduler..

    • Modifiez le fuseau horaire sélectionné en fonction de votre emplacement.
    • Remplacez IAC-REPO-NAME par le nom du dépôt GitHub que vous avez créé.

    Le corps du message utilise trois entrées et vous devez le construire comme indiqué ci-dessous :

    • repo : nom du dépôt GitHub IAC-REPO-NAME que vous avez créé dans la section Créer un dépôt GitHub.

    • projects : liste/tableau d'ID de projets Google Cloud auxquels ce dépôt GitHub IaC correspond. Dans ce tutoriel, il s'agit de votre projet test.

    • stub : L'outil de recommandation génère des recommandations IAM lorsqu'un sous-ensemble d'autorisations associé à un rôle n'a pas été utilisé depuis 60 jours. Il en est de même pour les recommandations de dimensionnement de VM. Vous pouvez transmettre le paramètre stub défini sur true afin de pouvoir tester ce pipeline à la demande à l'aide des exemples de charges utiles de l'outil de recommandation fournies dans le dépôt que vous avez cloné pour ce tutoriel.

    gcloud beta scheduler jobs create http recommender-iam-scheduler \
      --project $BUILD_PROJECT_ID \
      --time-zone "America/Los_Angeles" \
      --schedule="0 */3 * * *" \
      --uri=$RECOMMENDER_ROUTE_TO_INVOKE_IAM \
      --description="Scheduler job to invoke recommendation pipeline" \
      --oidc-service-account-email="recommender-scheduler-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com" \
      --headers="Content-Type=application/json" \
      --http-method="POST" \
      --message-body="{ \"repo\": \"IAC-REPO-NAME\", \"projects\": [\"$TEST_PROJECT_ID\"], \"location\": \"global\", \"stub\": true }"
    

Étapes supplémentaires

Cloud Build publie des informations de compilation dans un sujet Pub/Sub nommé "cloud-builds" créé automatiquement lorsque vous avez activé l'API Cloud Build dans votre projet de compilation.

  1. Exécutez la commande suivante pour vérifier que le sujet cloud-builds existe dans votre projet build :

    gcloud pubsub topics describe cloud-builds
    

    Si le sujet existe, vous devez voir le résultat suivant, où BUILD-PROJECT-ID est l'ID de votre projet de compilation :

    name: projects/BUILD-PROJECT-ID/topics/cloud-builds
    

    Si vous recevez un message d'erreur indiquant que la ressource est introuvable, suivez les instructions pour vous abonner aux notifications de compilation afin de créer le sujet manuellement.

  2. Créez un compte de service permettant à Pub/Sub d'appeler le point de terminaison du service d'analyse de l'outil de recommandation.

    gcloud beta iam service-accounts create recommender-ci-subscription-sa \
      --description "Service Account used by Cloud Pub/Sub to push Cloud Build events to the recommender-parser service" \
      --display-name "recommender-ci-subscription-sa" \
      --project $BUILD_PROJECT_ID
    
  3. Le compte de service Pub/Sub doit être associé aux rôles nécessaires pour publier des messages et appeler le service d'analyse de l'outil de recommandation.

    gcloud projects add-iam-policy-binding $BUILD_PROJECT_ID \
      --member serviceAccount:recommender-ci-subscription-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/pubsub.publisher \
      --project $BUILD_PROJECT_ID
    
    gcloud projects add-iam-policy-binding $BUILD_PROJECT_ID \
      --member serviceAccount:recommender-ci-subscription-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/pubsub.subscriber \
      --project $BUILD_PROJECT_ID
    
    gcloud projects add-iam-policy-binding $BUILD_PROJECT_ID \
      --member serviceAccount:recommender-ci-subscription-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/run.invoker \
      --project $BUILD_PROJECT_ID
    
  4. Ajoutez le compte de service recommender-ci-subscription-sa que vous avez créé au service d'analyse de l'outil de recommandation en tant que membre disposant du rôle invoker.

    gcloud beta run services add-iam-policy-binding recommender-parser \
      --member=serviceAccount:recommender-ci-subscription-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/run.invoker --region=us-central1
    
  5. Accédez à Pub/Sub dans Google Cloud Console.

  6. Cliquez sur le sujet "cloud-builds".

  7. Cliquez sur Créer un abonnement.

  8. Pour l'ID d'abonnement, saisissez recommender-service-build-events.

  9. Dans le champ Type de distribution, sélectionnez Push.

  10. Dans le champ Point de terminaison, saisissez l'URL du service d'analyse de votre outil de recommandation en y ajoutant /ci.

  11. Cochez la case Activer l'authentification.

    1. Sélectionnez le compte de service recommender-ci-subscription-sa que vous avez créé.
    2. Cliquez sur Grant (Accorder) en réponse au message d'invite.
  12. Sélectionnez Délai de confirmation sous 60 secondes.

  13. Conservez les autres valeurs par défaut.

  14. Cliquez sur Créer.

Tester le pipeline

L'outil de recommandation génère des recommandations IAM lorsqu'un sous-ensemble d'autorisations associé à un rôle n'a pas été utilisé depuis 60 jours. Il en est de même pour les recommandations de dimensionnement de VM. Pour tester ce pipeline à la demande, utilisez les exemples de charges utiles JSON de recommandations fournies dans le sous-répertoire stub du dépôt que vous avez cloné pour ce tutoriel. Cela vous permet de tester le pipeline en excluant les appels d'API que le service d'analyse de l'outil de recommandation effectue vers le point de terminaison de l'API Recommender pour mettre à jour l'état des recommandations qu'il a appliquées.

Si vous avez des recommandations actives dans vos projets Google Cloud, vous pouvez également tester le pipeline de bout en bout sans avoir à utiliser de stubs. Le résultat décrit ci-dessous est pertinent lorsque vous utilisez les exemples de charges utiles pour tester le pipeline. Toutefois, la procédure de test de ce pipeline sans utiliser les exemples reste la même.

  1. Dans la console Google Cloud, accédez à votre projet de test et examinez la ressource qui a été créée. Vous devez disposer des éléments suivants :

    1. Une instance Compute Engine nommée tf-compute-1 avec le type de machine g1-small.
    2. Un compte de service nommé Terraform Recommender Test disposant du rôle editor pour votre projet de test.
  2. Sur la page de la console Cloud Scheduler de votre projet build, cliquez sur Exécuter maintenant pour la tâche de recommandation-iam-du planificateur.

  3. Cliquez sur la tâche pour afficher les journaux. Vous pouvez également afficher les journaux du service d'analyse de l'outil de recommandation pour obtenir une vue détaillée des étapes exécutées par le service.

  4. Une fois l'exécution du service terminée, accédez à votre dépôt GitHub IAC-REPO-NAME. Le service recommender-parser devrait automatiquement avoir généré une demande d'extraction. Examinez les fichiers manifestes IaC modifiés qui contiennent cette demande d'extraction, puis cliquez sur Merge pull Request (Fusionner la demande d'extraction) si vous êtes satisfait des modifications apportées à vos fichiers manifeste IaC.

  5. Un commit sur la branche maître est créé lorsque vous fusionnez la requête d'extraction. Cela déclenche une tâche Cloud Build qui déploie les modifications apportées aux ressources Google Cloud dans votre projet test. Patientez quelques instants que la tâche Cloud Build se termine, et vous pourrez ensuite consulter son état dans la console Google Cloud.

  6. Une fois la tâche terminée, accédez à votre projet de test. Les exemples de charges utiles fournis apportent les modifications suivantes aux ressources de votre projet de test :

    • Le rôle editor dont disposait le compte de service de test Terraform lors du déploiement est à présent remplacé par le rôle viewer.

Nettoyer

Pour éviter que les ressources utilisées dans ce tutoriel ne soient facturées sur votre compte Google Cloud, supprimez les deux projets que vous avez créés.

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

Pour supprimer le projet :

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Étapes suivantes

  • Découvrez des architectures de référence, des schémas et des bonnes pratiques concernant Google Cloud. Consultez notre Centre d'architecture cloud.
  • Apprenez-en plus sur Google Cloud Policy Intelligence dans la documentation.