1. Présentation
Cet atelier vous explique comment utiliser Pulumi, un outil d'Infrastructure as Code permettant de provisionner et de 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
- 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 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 (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID de votre 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. Il ne peut pas être modifié après cette étape et restera actif pendant 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 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
Ajouter Pulumi au chemin et afficher 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 données 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 des 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 :
- Bucket
- Liaison IAM
- Objet texte avec la chaîne "Hello World!"
- Et quelques résultats
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. La clé gcp:project avec votre ID de projet comme valeur devrait s'afficher.
pulumi config
À ce stade, la structure de répertoires 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. Un aperçu des modifications qui seront apportées lorsque vous exécuterez la commande s'affiche d'abord.
(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 YAML en Python
Convertissons l'exemple ci-dessus en programme Python Pulumi
pulumi convert --language python --out ./py-repo
Inspecter 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 Oui.
pulumi up
Aucun changement ne devrait être apporté, 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 !