Utiliser Pulumi sur Google Cloud avec YAML

1. Présentation

Dans cet atelier, vous allez apprendre à utiliser Pulumi, un outil Infrastructure as Code, pour provisionner et gérer des ressources Google Cloud.

Objectifs de l'atelier

Dans cet atelier, vous allez apprendre à effectuer les tâches suivantes :

  • Installer et configurer Pulumi
  • Écrire un programme YAML pour modéliser votre infrastructure sur Google Cloud
  • Provisionner et gérer des ressources cloud à l'aide de Pulumi
  • Utilisez pulumi convert pour convertir un programme YAML en programme Python.

2. Préparation

Configuration de l'environnement d'auto-formation

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères non utilisée par les API Google. Vous pouvez le modifier à tout moment.
  • L'ID du projet est unique parmi tous les projets Google Cloud et non modifiable une fois défini. La console Cloud génère automatiquement une chaîne unique. généralement, vous ne vous souciez pas de ce que c’est. Dans la plupart des ateliers de programmation, vous devrez référencer l'ID du projet (il est généralement identifié comme PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre au hasard. Vous pouvez également essayer la vôtre pour voir si elle est disponible. Il ne peut pas être modifié après cette étape et restera actif pendant toute la durée du projet.
  • Pour votre information, il existe une troisième valeur, le numéro de projet, utilisé par certaines API. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite activer la facturation dans la console Cloud pour utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour arrêter les ressources afin d'éviter que des frais ne vous soient facturés au-delà de ce tutoriel, vous pouvez supprimer les ressources que vous avez créées ou l'ensemble du projet. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai gratuit pour bénéficier d'un crédit de 300 $.

3. Configurer l'infrastructure

Installer et configurer Pulumi

Dans Cloud Shell, exécutez la commande suivante pour installer Pulumi.

curl -fsSL https://get.pulumi.com | sh

Ajoutez Pulumi au chemin et consultez le message d'aide de Pulumi.

export PATH=${PATH}:~/.pulumi/bin
# view the help message to verify pulumi runs
pulumi -h

Exécutez les commandes suivantes pour définir l'ID du projet et autoriser l'accès. Vous devez suivre les instructions fournies par les commandes

export PROJECT_ID=$(gcloud config get-value project)
gcloud auth application-default login

Dans Cloud Shell, créez un bucket GCS et utilisez-le comme backend.

gsutil mb gs://pulumi-${PROJECT_ID}
pulumi login gs://pulumi-${PROJECT_ID}

Créer un projet

Dans Cloud Shell, créez le répertoire racine du projet.

mkdir pulumi-lab && cd pulumi-lab

Définir le fichier de projet(point d’entrée de Pulumi)

cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi

runtime: yaml
main: yaml-repo/
EOT

Définir les ressources YAML

Créer un répertoire pour stocker les définitions de ressources cloud au format YAML

mkdir yaml-repo

Créez le fichier yaml-repo/Pulumi.yaml avec les définitions de ressources suivantes :

  1. Bucket
  2. Liaison IAM
  3. Un objet texte avec la chaîne "Hello World!"
  4. Et quelques sorties
resources:
  # Create a GCP resource (Storage Bucket)
  my-bucket:
    type: gcp:storage:Bucket
    properties:
      location: US
      website:
        mainPageSuffix: index.html
      uniformBucketLevelAccess: true

  my-bucket-binding:
    type: gcp:storage:BucketIAMBinding
    properties:
      bucket: ${my-bucket.name}
      role: "roles/storage.objectViewer"
      members: ["allUsers"]

  index-object:
    type: gcp:storage:BucketObject
    properties:
      bucket: ${my-bucket}
      source:
        fn::stringAsset: Hello World!

outputs:
  bucketName: ${my-bucket.url}

Déployer les ressources

Initialiser et configurer la pile

export PULUMI_CONFIG_PASSPHRASE=pulumi-lab
pulumi stack init dev
pulumi config set gcp:project $PROJECT_ID

Vérifiez la configuration de la pile. Vous devriez voir la clé gcp:project avec votre ID de projet comme valeur.

pulumi config

À ce stade, la structure de répertoire devrait se présenter comme suit :

├── Pulumi.dev.yaml
├── Pulumi.yaml
└── yaml-repo
    └── Pulumi.yaml

Déployer la pile

pulumi up

Cette commande évalue votre programme et détermine les mises à jour de ressources à effectuer. Tout d'abord, un aperçu s'affiche. Il décrit les modifications qui seront apportées lorsque la commande

(Résultat)

Previewing update (dev):
Downloading plugin gcp v6.44.0: 45.69 MiB / 45.69 MiB [=============] 100.00% 1s
     Type                             Name               Plan
 +   pulumi:pulumi:Stack              pulumi-lab-dev     create
 +   ├─ gcp:storage:Bucket            my-bucket          create
 +   ├─ gcp:storage:BucketObject      index-object       create
 +   └─ gcp:storage:BucketIAMBinding  my-bucket-binding  create


Outputs:
    bucketName: output<string>

Resources:
    + 4 to create

Do you want to perform this update?  [Use arrows to move, type to filter]
  yes
> no
  details

Sélectionnez yes (oui) pour provisionner les ressources. Le résultat doit se présenter comme suit :

Do you want to perform this update? yes
Updating (dev):
     Type                             Name               Status
 +   pulumi:pulumi:Stack              pulumi-lab-dev     created (3s)
 +   ├─ gcp:storage:Bucket            my-bucket          created (1s)
 +   ├─ gcp:storage:BucketObject      index-object       created (0.78s)
 +   └─ gcp:storage:BucketIAMBinding  my-bucket-binding  created (5s)


Outputs:
    bucketName: "gs://my-bucket-874aa08"

Resources:
    + 4 created

Duration: 11s

Exécutez la commande suivante pour imprimer les résultats qui ont été définis

pulumi stack output

Exécutez la commande suivante pour vérifier la modification

gsutil ls $(pulumi stack output bucketName)

Le résultat doit se présenter comme suit :

(Résultat)

gs://my-bucket-11a9046/index-object-77a5d80

4. Convertir le fichier YAML en Python

Convertissons l'exemple ci-dessus en programme Python Pulumi

pulumi convert --language python --out ./py-repo

Inspectez le code généré dans py-repo.

cat py-repo/__main__.py

(Résultat)

import pulumi
import pulumi_gcp as gcp

my_bucket = gcp.storage.Bucket("my-bucket",
    location="US",
    website=gcp.storage.BucketWebsiteArgs(
        main_page_suffix="index.html",
    ),
    uniform_bucket_level_access=True)
my_bucket_binding = gcp.storage.BucketIAMBinding("my-bucket-binding",
    bucket=my_bucket.name,
    role="roles/storage.objectViewer",
    members=["allUsers"])
index_object = gcp.storage.BucketObject("index-object",
    bucket=my_bucket.id,
    source=pulumi.StringAsset("Hello World!"))
pulumi.export("bucketName", my_bucket.url)
.......

Activer l'environnement virtuel Python

source py-repo/bin/activate

Mettez à jour le fichier de projet Pulumi.yaml pour qu'il pointe vers le programme Python. Notez que l'environnement d'exécution et l'entrée principale ont été modifiés.

cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi

runtime: python
main: py-repo/
EOT

Essayez de redéployer la pile et sélectionnez yes (oui).

pulumi up

Aucune modification ne devrait apparaître et le résultat devrait ressembler à ceci :

(Résultat)

Previewing update (dev):
     Type                 Name            Plan
     pulumi:pulumi:Stack  pulumi-lab-dev


Resources:
    4 unchanged

Do you want to perform this update? yes
Updating (dev):
     Type                 Name            Status
     pulumi:pulumi:Stack  pulumi-lab-dev


Outputs:
    bucketName: "gs://my-bucket-c2b49ad"

Resources:
    4 unchanged

Duration: 6s

5. Supprimer les ressources

Supprimer les ressources créées

pulumi destroy

Votre confirmation se présentera comme suit :

Previewing update (dev):
     Type                 Name            Plan
     pulumi:pulumi:Stack  pulumi-lab-dev


Resources:
    4 unchanged

Do you want to perform this update?  [Use arrows to move, type to filter]
  yes
> no
  details


Do you want to perform this destroy? yes
Destroying (dev):
     Type                             Name               Status
 -   pulumi:pulumi:Stack              pulumi-lab-dev     deleted
 -   ├─ gcp:storage:BucketIAMBinding  my-bucket-binding  deleted (5s)
 -   ├─ gcp:storage:BucketObject      index-object       deleted (1s)
 -   └─ gcp:storage:Bucket            my-bucket          deleted (0.73s)


Outputs:
  - bucketName: "gs://my-bucket-874aa08"

Resources:
    - 4 deleted

Duration: 10s

6. Félicitations !

Félicitations, vous avez terminé l'atelier !