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.