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 autogestito

  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 in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca; di solito non ti importa cosa sia. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere è identificato come PROJECT_ID). Se l'ID generato non ti soddisfa, puoi generarne un altro casuale. In alternativa, puoi provarne una personalizzata per verificare 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. Eseguire questo codelab non dovrebbe costare molto. 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 sono idonei al programma prova senza costi di 300$.

3. Configurazione dell'infrastruttura

Installare e configurare 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 ingresso a Pulumi)

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

runtime: yaml
main: yaml-repo/
EOT

Definisci le risorse YAML

Crea una directory per contenere le definizioni di 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. Dovresti vedere la chiave gcp:project con l'ID progetto come valore

pulumi config

A questo punto, la struttura della directory dovrebbe essere simile alla 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 yes per eseguire il provisioning delle risorse. L'output dovrebbe essere simile al seguente

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 comando seguente stamperà gli output definiti

pulumi stack output

Esegui questo comando per verificare la modifica

gsutil ls $(pulumi stack output bucketName)

L'output sarà simile a questo

(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

Esamina 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 punti al programma Python. 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 essere apportate 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 tua conferma sarà simile a questa:

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.