Usa Pulumi en Google Cloud con YAML

1. Descripción general

En este lab, aprenderás a usar Pulumi, una herramienta de infraestructura como código para aprovisionar y administrar recursos de Google Cloud.

Qué aprenderás

En este lab, aprenderás a realizar las siguientes tareas:

  • Instalar y configurar Pulumi
  • Escribe un programa de YAML para modelar tu infraestructura en Google Cloud
  • Aprovisionar y administrar recursos en la nube con Pulumi
  • Usa pulumi convert para convertir el programa YAML en un programa de Python.

2. Configuración y requisitos

Cómo configurar el entorno a tu propio ritmo

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla en cualquier momento.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. por lo general, no te importa qué es. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (por lo general, se identifica como PROJECT_ID). Si no te gusta el ID generado, puedes generar otro aleatorio. También puedes probar el tuyo propio y ver si está disponible. No se puede cambiar después de este paso y se mantendrá mientras dure el proyecto.
  • Para tu información, hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Para cerrar recursos y evitar que se te facture más allá de este instructivo, puedes borrar los recursos que creaste o borrar todo el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.

3. Configuración de la infraestructura

Instalar y configurar Pulumi

En Cloud Shell, ejecuta el siguiente comando para instalar Pulumi

curl -fsSL https://get.pulumi.com | sh

Agregue Pulumi a la ruta y vea el mensaje de ayuda de Pulumi.

export PATH=${PATH}:~/.pulumi/bin
# view the help message to verify pulumi runs
pulumi -h

Ejecuta los siguientes comandos para establecer el ID del proyecto y autorizar el acceso. Debes seguir las instrucciones indicadas en los comandos.

export PROJECT_ID=$(gcloud config get-value project)
gcloud auth application-default login

En Cloud Shell, crea un bucket de GCS y úsalo como backend

gsutil mb gs://pulumi-${PROJECT_ID}
pulumi login gs://pulumi-${PROJECT_ID}

Crea un proyecto nuevo

En Cloud Shell, crea el directorio raíz del proyecto.

mkdir pulumi-lab && cd pulumi-lab

Definir el archivo del proyecto(el punto de entrada a Pulumi)

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

runtime: yaml
main: yaml-repo/
EOT

Define los recursos YAML

Crea un directorio para guardar las definiciones de recursos de Cloud en formato YAML

mkdir yaml-repo

Crea el archivo yaml-repo/Pulumi.yaml con las siguientes definiciones de recursos.

  1. Bucket
  2. Vinculación de IAM
  3. Un objeto de texto con la string "Hello World!"
  4. Y algunos resultados
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}

Implementa los recursos

Inicializa y configura la pila

export PULUMI_CONFIG_PASSPHRASE=pulumi-lab
pulumi stack init dev
pulumi config set gcp:project $PROJECT_ID

Verifica la configuración de la pila. Deberías ver la clave gcp:project con el ID del proyecto como valor.

pulumi config

En este punto, la estructura del directorio debería verse de la siguiente manera:

├── Pulumi.dev.yaml
├── Pulumi.yaml
└── yaml-repo
    └── Pulumi.yaml

Implementa la pila

pulumi up

Este comando evalúa tu programa y determina las actualizaciones de recursos que se realizarán. En primer lugar, se muestra una vista previa que describe los cambios que se realizarán cuando ejecutes el comando

(Resultado)

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

Selecciona yes y se aprovisionarán los recursos. El resultado debería verse de la siguiente manera:

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

Si ejecutas el siguiente comando, se imprimirán los resultados que se definieron

pulumi stack output

Ejecuta el siguiente comando para verificar el cambio.

gsutil ls $(pulumi stack output bucketName)

El resultado se verá de la siguiente manera:

(Resultado)

gs://my-bucket-11a9046/index-object-77a5d80

4. Convierte YAML en Python

Convertimos el ejemplo anterior en un programa de Pulumi para Python.

pulumi convert --language python --out ./py-repo

Inspecciona el código que se generó en py-repo

cat py-repo/__main__.py

(Resultado)

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

Activa el entorno virtual de Python

source py-repo/bin/activate

Actualiza el archivo del proyecto Pulumi.yaml para que apunte al programa de Python. Observa que el entorno de ejecución y la entrada principal cambiaron.

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

runtime: python
main: py-repo/
EOT

Intenta volver a implementar la pila y selecciona yes.

pulumi up

No debería haber ningún cambio y tu resultado debería ser similar a este

(Resultado)

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. Borra recursos

Borra los recursos que se crearon.

pulumi destroy

Tu confirmación se verá de la siguiente manera:

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. ¡Felicitaciones!

¡Felicitaciones! Terminaste el lab.