1. Panoramica
Questo lab ti insegna a utilizzare Pulumi, uno strumento di Infrastructure as Code per eseguire il provisioning e gestire le risorse Google Cloud.
Cosa imparerai a fare
In questo lab imparerai a:
- Installa e configura Pulumi
- Scrivi un programma YAML per modellare la tua infrastruttura su Google Cloud
- Eseguire il provisioning e gestire le risorse cloud utilizzando Pulumi
- Utilizza pulumi convert per convertire il programma YAML in un programma Python
2. Configurazione e requisiti
Configurazione dell'ambiente autonomo
- Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.



- Il nome del progetto è il nome visualizzato per i partecipanti a questo progetto. È una stringa di caratteri non utilizzata dalle API di Google. Puoi aggiornarlo in qualsiasi momento.
- L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo l'impostazione). La console Cloud genera automaticamente una stringa univoca, di solito non ti interessa di cosa si tratta. Nella maggior parte dei codelab, devi fare riferimento all'ID progetto (in genere è identificato come
PROJECT_ID). Se non ti piace l'ID generato, puoi generarne un altro casuale. In alternativa, puoi provare a crearne uno e vedere se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà per tutta la durata del progetto. - Per tua informazione, esiste un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
- Successivamente, devi abilitare la fatturazione in Cloud Console per utilizzare le risorse/API Cloud. L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Per arrestare le risorse in modo da non incorrere in costi di fatturazione al termine di questo tutorial, puoi eliminare le risorse che hai creato o l'intero progetto. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.
3. Configurazione dell'infrastruttura
Installa e configura Pulumi
In Cloud Shell, esegui questo comando per installare Pulumi:
curl -fsSL https://get.pulumi.com | sh
Aggiungi Pulumi al percorso e visualizza il messaggio di aiuto di Pulumi
export PATH=${PATH}:~/.pulumi/bin
# view the help message to verify pulumi runs
pulumi -h
Esegui questi comandi per impostare l'ID progetto e autorizzare l'accesso. Devi seguire le istruzioni fornite dai comandi.
export PROJECT_ID=$(gcloud config get-value project)
gcloud auth application-default login
In Cloud Shell, crea un bucket GCS e utilizzalo come backend
gsutil mb gs://pulumi-${PROJECT_ID}
pulumi login gs://pulumi-${PROJECT_ID}
Crea un nuovo progetto
In Cloud Shell, crea la directory principale del progetto
mkdir pulumi-lab && cd pulumi-lab
Definisci il file di progetto(il punto di accesso a Pulumi)
cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi
runtime: yaml
main: yaml-repo/
EOT
Definisci risorse YAML
Crea una directory in cui archiviare le definizioni delle risorse cloud in formato YAML
mkdir yaml-repo
Crea il file yaml-repo/Pulumi.yaml con le seguenti definizioni di risorse
- Bucket
- Associazione IAM
- Un oggetto di testo con la stringa "Hello World!"
- e alcuni output
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}
Esegui il deployment delle risorse
Inizializza e configura lo stack
export PULUMI_CONFIG_PASSPHRASE=pulumi-lab
pulumi stack init dev
pulumi config set gcp:project $PROJECT_ID
Controlla la configurazione dello stack e dovresti visualizzare la chiave gcp:project con il tuo ID progetto come valore.
pulumi config
A questo punto, la struttura di directory dovrebbe avere il seguente aspetto
├── Pulumi.dev.yaml
├── Pulumi.yaml
└── yaml-repo
└── Pulumi.yaml
Esegui il deployment dello stack
pulumi up
Questo comando valuta il programma e determina gli aggiornamenti delle risorse da apportare. Innanzitutto, viene mostrata un'anteprima che illustra le modifiche che verranno apportate quando esegui il comando
(Output)
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
Seleziona Sì e verrà eseguito il provisioning delle risorse. L'output dovrebbe avere il seguente aspetto:
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'esecuzione del seguente comando stamperà gli output definiti
pulumi stack output
Esegui il comando seguente per verificare la modifica
gsutil ls $(pulumi stack output bucketName)
L'output avrà questo aspetto
(output)
gs://my-bucket-11a9046/index-object-77a5d80
4. Converti YAML in Python
Convertiamo l'esempio precedente in un programma Python Pulumi
pulumi convert --language python --out ./py-repo
Ispeziona il codice generato in py-repo
cat py-repo/__main__.py
(output)
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)
.......
Attiva l'ambiente virtuale Python
source py-repo/bin/activate
Aggiorna il file di progetto Pulumi.yaml in modo che rimandi al programma Python. Nota che la durata e la voce principale sono state modificate
cat <<EOT > Pulumi.yaml
name: pulumi-lab
description: Try Pulumi
runtime: python
main: py-repo/
EOT
Prova a rieseguire il deployment dello stack e seleziona Sì.
pulumi up
Non dovrebbero esserci modifiche e l'output dovrebbe essere simile a questo
(output)
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. Elimina le risorse
Elimina le risorse create
pulumi destroy
La conferma avrà questo aspetto
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. Complimenti!
Complimenti, hai completato il lab.