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