1. Présentation
Cet atelier vous explique comment utiliser Pulumi, un outil d'infrastructure en tant que 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
- Utiliser pulumi convert pour convertir un programme YAML en programme Python
2. Préparation
Configuration de l'environnement d'auto-formation
- 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.)



- 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 la 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 (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID du projet (généralement identifié par
PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre de manière aléatoire. Vous pouvez également en spécifier un et voir s'il est disponible. Après cette étape, l'ID n'est plus modifiable et restera donc le même pour toute la durée du projet. - Pour information, il existe une troisième valeur (le numéro de projet) que certaines API utilisent. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
- 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 désactiver les ressources et éviter ainsi que des frais ne vous soient facturés après ce tutoriel, vous pouvez supprimer le projet ou les ressources que vous avez créées. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais 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 d'accès et affichez 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éfinissez 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 des ressources YAML
Créez 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 :
- Bucket
- Liaison IAM
- Objet texte avec la chaîne "Hello World!"
- 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
Initialisez et configurez 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. La clé gcp:project doit s'afficher avec l'ID de votre projet comme valeur.
pulumi config
À ce stade, la structure de répertoires doit se présenter comme suit :
├── Pulumi.dev.yaml
├── Pulumi.yaml
└── yaml-repo
└── Pulumi.yaml
Déployez la pile :
pulumi up
Cette commande évalue votre programme et détermine les mises à jour de ressources à effectuer. Un aperçu s'affiche d'abord, décrivant les modifications qui seront apportées lorsque vous exécuterez 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 pour provisionner les ressources. Vous devez normalement obtenir le résultat suivant :
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
L'exécution de la commande suivante affiche les sorties qui ont été définies :
pulumi stack output
Exécutez la commande suivante pour constater la modification :
gsutil ls $(pulumi stack output bucketName)
Votre résultat ressemblera à ceci :
(Résultat)
gs://my-bucket-11a9046/index-object-77a5d80
4. Convertir YAML en Python
Convertissons l'exemple ci-dessus en programme Pulumi Python.
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)
.......
Activez 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.
pulumi up
Aucune modification ne doit être apportée et votre résultat doit 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
Supprimez les ressources qui ont été créées :
pulumi destroy
La 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.