1. Descripción general
En este lab, se explica cómo 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
- Escribir un programa YAML para modelar tu infraestructura en Google Cloud
- Aprovisionar y administrar recursos de Cloud con Pulumi
- Usar pulumi convert para convertir un programa YAML en un programa de Python
2. Configuración y requisitos
Cómo configurar el entorno a tu propio ritmo
- 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.



- 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 importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (suele identificarse como
PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usará el mismo durante todo el proyecto. - Recuerda que 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.
- 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 generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar el proyecto completo. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.
3. Configuración de la infraestructura
Instala y configura Pulumi
En Cloud Shell, ejecuta el siguiente comando para instalar Pulumi:
curl -fsSL https://get.pulumi.com | sh
Agrega Pulumi a la ruta de acceso y visualiza 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 configurar el ID del proyecto y autorizar el acceso. Debes seguir las instrucciones que proporcionan 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
Define 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 recursos YAML
Crea un directorio para contener las definiciones de recursos en la nube en formato YAML:
mkdir yaml-repo
Crea el archivo yaml-repo/Pulumi.yaml con las siguientes definiciones de recursos:
- Bucket
- Vinculación de IAM
- Un objeto de texto con la cadena "Hello World!"
- Y algunas salidas
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 y deberías ver la clave gcp:project con el ID de tu proyecto como valor:
pulumi config
En este punto, la estructura de directorios 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 deben realizar. Primero, 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 ser similar al siguiente:
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
Cuando ejecutes el siguiente comando, se imprimirán las salidas que se definieron:
pulumi stack output
Ejecuta el siguiente comando para verificar el cambio:
gsutil ls $(pulumi stack output bucketName)
El resultado se verá así:
(Resultado)
gs://my-bucket-11a9046/index-object-77a5d80
4. Convierte YAML a Python
Convertiremos el ejemplo anterior en un programa de Python de Pulumi.
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 se cambiaron el tiempo de ejecución y la entrada principal.
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 el resultado debería ser similar al siguiente:
(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 los recursos
Borra los recursos que se crearon:
pulumi destroy
La 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, completaste el lab.