Implementa la app de Bookshelf para Python con Cloud Deployment Manager

En este instructivo, se muestra cómo implementar la app de muestra de Bookshelf de Python con Cloud Deployment Manager.

Deployment Manager te permite crear los recursos necesarios Google Cloud para una implementación en un solo paso, a través de un proceso declarativo y repetible. Con Deployment Manager, puedes actualizar tus implementaciones, realizar un seguimiento de tus modificaciones a lo largo del tiempo, crear plantillas con Jinja o Python y modificar tus plantillas para que las implementaciones similares la compartan.

Objetivos

  • Clonar y configurar la app de muestra de Bookshelf
  • Crear configuraciones y plantillas de Deployment Manager
  • Crear implementaciones de Deployment Manager
  • Implementar la app de muestra de Bookshelf con Deployment Manager

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios de Google Cloud nuevos cumplan con los requisitos para acceder a una prueba gratuita.

Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.

Antes de comenzar

  1. Accede a tu Google Cloud cuenta de. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Datastore API, Cloud Storage API, Pub/Sub API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Instala Google Cloud CLI.

  6. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

  7. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Datastore API, Cloud Storage API, Pub/Sub API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Instala Google Cloud CLI.

  12. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

  13. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  14. Instala Python, pip y virtualenv en tu sistema. Para obtener instrucciones, consulta Configura un entorno de desarrollo de Python para Google Cloud.

Crea un bucket de Cloud Storage

En las instrucciones siguientes, se detalla cómo crear un bucket de Cloud Storage. Los depósitos son los contenedores básicos que conservan tus datos en Cloud Storage.

  1. En la ventana de la terminal, crea un bucket de Cloud Storage, en el que YOUR_BUCKET_NAME represente el nombre del bucket:

    gcloud storage buckets create gs://YOUR_BUCKET_NAME
  2. Para ver las imágenes que se subieron en la aplicación Bookshelf, configura la política de Identity and Access Management (IAM) del bucket para otorgar la función legacyObjectReader a allUsers:

    gcloud storage buckets add-iam-policy-binding gs://YOUR_BUCKET_NAME
    --member=allUsers --role=roles/storage.legacyObjectReader

Clona la app de muestra

La app de muestra está disponible en GitHub en GoogleCloudPlatform/getting-started-python.

  1. Clona el repositorio:

    git clone https://github.com/GoogleCloudPlatform/getting-started-python.git -b steps
    
  2. Ve al directorio de muestra:

    cd getting-started-python/7-gce
    

Configura la app

  1. Abre config.py para edición.

    • Configura el valor de PROJECT_ID como el ID de tu proyecto.

    • Establece la variable CLOUD_STORAGE_BUCKET como el nombre de tu bucket de Cloud Storage.

  2. Guarda y cierra config.py.

Ejecuta la app en tu computadora local

  1. Crea un entorno aislado de Python y, luego, instala las dependencias:

    Linux/macOS

    virtualenv -p python3 env
    source env/bin/activate
    pip install -r requirements.txt
    

    Windows

    virtualenv -p python3 env
    env\scripts\activate
    pip install -r requirements.txt
    

  2. Ejecute la aplicación:

    python main.py
    
  3. En el navegador web, ingresa la siguiente dirección:

    http://localhost:8080

Para detener el servidor web local, presiona Control+C. Si deseas salir del entorno virtual, ingresa . Si deseas salir del entorno virtual, ingresa deactivate.

Implementa la app de muestra

Enviar tu código a un repositorio

Puedes ingresar tu código en una instancia de Compute Engine en ejecución de varias maneras. Una manera es usar Cloud Source Repositories. Cada proyecto incluye un repositorio de Git que está disponible para las instancias de Compute Engine. Luego, tus instancias obtienen la versión más reciente del código de tu aplicación durante el inicio. Usar un repositorio de Git es conveniente porque actualizar tu aplicación no requiere configurar imágenes o instancias nuevas; solo debes reiniciar una instancia existente o crear una.

  1. Usa git config --global para configurar tu identidad, si es la primera vez que utilizas Git.

  2. En la Google Cloud consola, crea un repositorio:

    Crear repositorio

  3. Luego, envía el código de tu aplicación al repositorio de tu proyecto, en el que [YOUR_PROJECT_ID] es tu ID del proyecto y [YOUR_REPO] es el nombre de tu repositorio:

    git commit -am "Updating configuration"
    git config credential.helper gcloud.sh
    git remote add cloud https://source.developers.google.com/p/[YOUR_PROJECT_ID]/r/[YOUR_REPO]
    git push cloud master
    

Crea la implementación:

Después de confirmar la configuración y subir tu código a Cloud Source Repository, puedes usar Deployment Manager para crear la implementación:

  1. Ve al directorio deployment_manager:

    cd getting-started-python/7-gce/gce/deployment_manager
    
  2. Crea la implementación:

    gcloud deployment-manager deployments create my-deployment --config config.yaml
    
  3. Ve una lista de todas las implementaciones:

    gcloud deployment-manager deployments list
    
  4. Obtén una descripción de la implementación y los recursos que creó:

    gcloud deployment-manager deployments describe my-deployment
    

Ver tu aplicación

Después de crear la regla de reenvío, tu configuración puede tardar varios minutos en propagarse y el tráfico puede tardar el mismo tiempo en dirigirse a tus instancias.

  1. Para verificar el progreso, haz lo siguiente:

    gcloud compute backend-services get-health bookshelf-my-deployment-frontend --global
    
  2. Cuando al menos una de tus instancias muestre el estado HEALTHY, obtén la dirección IP de reenvío del balanceador de cargas:

    gcloud compute forwarding-rules list --global
    

    La dirección IP de tus reglas de reenvío está en la columna IP_ADDRESS.

  3. En tu navegador, ingresa la dirección IP de la lista.

    Tu app ya se ejecuta en Google Cloud.

Comprende el código

Configura la implementación

Puedes ver cómo se configura la implementación en config.yaml:

imports:
- name: bookshelf.jinja
  path: ./bookshelf.jinja

resources:
- name: bookshelf
  type: bookshelf.jinja
  properties:
    zone: us-central1-f
    machine-type: n1-standard-1
    machine-image: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-9
    min-instances: 1
    max-instances: 10
    target-utilization: 0.6
    scopes:
    - https://www.googleapis.com/auth/cloud-platform

El archivo de configuración importa el archivo de plantilla como un recurso y lo usa para definir un recurso llamado bookshelf. La plantilla toma varias propiedades como parámetros. Para obtener más información sobre la creación de archivos de configuración de Deployment Manager, consulta Crea una configuración.

Configura el esquema de la plantilla de implementación

Observa el archivo de esquema bookshelf.jinja.schema, que define y documenta los parámetros que se espera que la implementación proporcione en su archivo de configuración. Para obtener más información sobre los esquemas de configuración, consulta Usa esquemas.


info:
  title: Bookshelf GCE Deploy
  author: Google Inc.
  description: Creates a GCE Deployment

imports:
- name: startup-script
  path: ../startup-script.sh

required:
- zone
- machine-type
- min-instances
- max-instances
- scopes

properties:
  zone:
    description: Zone to create the resources in.
    type: string
  machine-type:
    description: Type of machine to use
    type: string
  machine-image:
    description: The OS image to use on the machines
    type: string
  min-instances:
    description: The minimum number of VMs the autoscaler will create
    type: integer
  max-instances:
    description: The maximum number of VMs the autoscaler will create
    type: integer
  target-utilization:
    description: The target CPU usage for the autoscaler to base its scaling on
    type: number
  scopes:
    description: A list of scopes to create the VM with
    type: array
    minItems: 1
    items:
      type: string

Configura la plantilla de implementación

La plantilla define varios recursos necesarios para crear un grupo de instancias administrado, balanceado por cargas y con ajuste de escala automático. Para obtener una descripción completa de los recursos creados, consulta los comentarios en la plantilla y revisa el instructivo de Bookshelf en Compute Engine.

Ten en cuenta que Deployment Manager permite definir recursos de manera declarativa, pero la mayor parte de la configuración de un recurso es definida por su API. Por ejemplo, la mayoría de las opciones de configuración del recurso Plantilla de instancias se encuentran en la definición del recurso Plantilla de instancias en la documentación de referencia para la API de Compute Engine.

La plantilla se escribe con el Jinja lenguaje de plantillas. Cuando escribes plantillas de Deployment Manager, puedes usar Jinja o Python. Jinja tiene la ventaja de ser más declarativo, lo que puede ser más legible y fácil de entender que Python. Para algunas implementaciones complejas, la expresividad completa de Python puede simplificar las cosas. En este caso, Jinja es suficiente para crear los recursos necesarios.

En una plantilla, se establecen automáticamente ciertas variables de entorno, y puedes acceder a ellas con el diccionario env. En este caso, se hace referencia al nombre de la implementación como un nombre que se volverá a usar cuando se asignen nombres a los recursos que se crean. Para obtener más información sobre las variables de entorno disponibles, consulta Usa variables de entorno en la documentación de Deployment Manager:

{% set NAME = "bookshelf-" + env["deployment"] %}
{% set SERVICE = "bookshelf-" + env["deployment"] + "-frontend" %}

La plantilla usa la misma secuencia de comandos de inicio que se usa en el instructivo de Compute Engine. El contenido de la secuencia de comandos se inserta en la plantilla, y la directiva de sangría de Jinja aplica la sangría al contenido de forma correcta:

            value: |
{{imports['startup-script']|indent(14, true)}}

En una plantilla de Jinja de Deployment Manager, es posible hacer referencia a un recurso creado en otra sección de la plantilla. En el siguiente ejemplo, el servicio de backend usa la referencia del grupo de instancias administrado para obtener el grupo de instancias al que debería apuntar:

- group: $(ref.{{ NAME }}-frontend-group.instanceGroup)
  zone: {{ properties['zone'] }}

Las propiedades especificadas en config.yaml se pueden usar en la plantilla:

minNumReplicas: {{ properties['min-instances'] }}
maxNumReplicas: {{ properties['max-instances'] }}
loadBalancingUtilization:
  utilizationTarget: {{ properties['target-utilization'] }}

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que tú quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra tu implementación

Para borrar tu implementación, ingresa el siguiente comando. Este comando borra el balanceador de cargas y cualquier instancia de Compute Engine asociada con tu implementación:

gcloud deployment-manager deployments delete my-deployment

¿Qué sigue?