Utilizza Pulumi su Google Cloud con YAML

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

  1. 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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.
  1. 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

  1. Bucket
  2. Associazione IAM
  3. Un oggetto di testo con la stringa "Hello World!"
  4. 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 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 .

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.