Utilizza Pulumi su Google Cloud con YAML

1. Panoramica

Questo lab insegna come utilizzare Pulumi, uno strumento Infrastructure as Code per eseguire il provisioning e la gestione delle risorse Google Cloud.

Cosa imparerai a fare

In questo lab imparerai a:

  • Installare e configurare Pulumi
  • Scrivi un programma YAML per modellare la tua infrastruttura su Google Cloud
  • Eseguire il provisioning e la gestione delle risorse Cloud con Pulumi
  • Usa pulumi convert per convertire il programma YAML in programma Python

2. Configurazione e requisiti

Configurazione dell'ambiente a tuo ritmo

  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 progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi aggiornarla in qualsiasi momento.
  • L'ID progetto è univoco per tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca; in genere non è importante quale sia. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere identificato come PROJECT_ID). Se l'ID generato non ti piace, puoi generarne un altro casuale. In alternativa, puoi provare il tuo e vedere se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà per tutta la durata del progetto.
  • Per informazione, c'è un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare risorse/API Cloud. L'esecuzione di questo codelab non dovrebbe costare molto, se non del tutto. Per arrestare le risorse in modo da non incorrere in fatturazione oltre questo tutorial, puoi eliminare le risorse che hai creato o eliminare l'intero progetto. I nuovi utenti di Google Cloud possono partecipare al 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 del progetto(il punto di contatto di Pulumi)

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

runtime: yaml
main: yaml-repo/
EOT

Definire le risorse YAML

Crea una directory per contenere le definizioni delle risorse cloud in formato yaml

mkdir yaml-repo

Crea il file yaml-repo/Pulumi.yaml con le seguenti definizioni delle 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. Dovresti vedere la chiave gcp:project con l'ID progetto come valore

pulumi config

A questo punto, la struttura della directory dovrebbe essere la seguente

├── 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 eseguire. Innanzitutto, viene mostrata un'anteprima che delinea le modifiche che verranno apportate quando 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 per eseguire 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 stampa gli output definiti

pulumi stack output

Esegui questo comando per verificare la modifica

gsutil ls $(pulumi stack output bucketName)

L'output sarà simile al seguente

(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

Controlla 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 indichi il programma Python. Tieni presente che il runtime e la voce principale sono stati modificati

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

runtime: python
main: py-repo/
EOT

Prova a eseguire nuovamente il deployment dello stack e seleziona yes

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à il seguente 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!

Congratulazioni, hai terminato il lab.