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 YAML para modelar tu infraestructura en Google Cloud
- Aprovisiona y administra recursos de Cloud con Pulumi
- Usa pulumi convert para convertir un programa YAML en un programa 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 mantendrá 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 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
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 definiciones de recursos de 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 string "Hello World!"
- 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 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 sí 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
Convirtamos 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 entorno 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 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.