Cómo implementar Bookshelf de Node.js con Deployment Manager

Este instructivo muestra cómo implementar el ejemplo de Bookshelf de Node.js con Google Cloud Deployment Manager.

Deployment Manager permite crear recursos de Google Cloud Platform (GCP) de manera declarativa y repetible, por lo que es fácil crear todos los recursos necesarios para una implementación en un solo paso. Con Deployment Manager, puedes actualizar tus implementaciones y realizar un seguimiento de tus modificaciones en el tiempo. Puedes crear plantillas con Jinja o Python y modificar sus parámetros, de manera que las implementaciones similares puedan compartir una plantilla.

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

Este instructivo usa componentes facturables de Cloud Platform, incluidos los siguientes:

  • Compute Engine
  • Cloud Storage
  • Cloud Datastore
  • Cloud Logging
  • Cloud Pub/Sub

Usa la calculadora de precios para generar una estimación de los costos según el uso previsto. Los usuarios nuevos de GCP pueden ser aptos para una prueba gratuita.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En GCP Console, en la página de selección de proyecto, selecciona o crea un proyecto de GCP.

    Ir a la página de selección de proyecto

  3. Asegúrate de tener habilitada la facturación para tu proyecto de Google Cloud Platform. Obtén información sobre cómo confirmar que tienes habilitada la facturación para tu proyecto.

  4. Habilita lasCloud Datastore, Cloud Storage y Cloud Pub/SubAPIAPI.

    Habilita lasAPI

  5. Instala e inicializa el SDK de Cloud.
  6. Instala Node.js y npm mediante el instalador oficial.

Crear un depósito de Cloud Storage

Las instrucciones siguientes muestran cómo crear un depósito de Cloud Storage. Los depósitos son los contenedores básicos que conservan tus datos en Cloud Storage.

  1. Ingresa el siguiente comando en una ventana de terminal:

    gsutil mb gs://[YOUR-BUCKET-NAME]

    Donde:

    • [YOUR-BUCKET-NAME] representa el nombre de tu depósito de Cloud Storage.
  2. Para ver las imágenes que se subieron en la aplicación Bookshelf, configura la Lista de control de acceso (LCA) predeterminada del depósito como public-read.

    gsutil defacl set public-read gs://[YOUR-BUCKET-NAME]

Clonar la aplicación de muestra

La aplicación de muestra está disponible en GitHub en GoogleCloudPlatform/nodejs-getting-started.

  1. Clona el repositorio:

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

    cd nodejs-getting-started/7-gce
    

Cómo configurar la app

En el directorio 7-gce, crea un archivo llamado config.json con los siguientes contenidos.

{
    "GCLOUD_PROJECT": "[YOUR_PROJECT_ID]",
    "CLOUD_BUCKET": "[YOUR_BUCKET_NAME]",
    "DATA_BACKEND": "datastore",
    "OAUTH2_CLIENT_ID": "none",
    "OAUTH2_CLIENT_SECRET": "none",
    "OAUTH2_CALLBACK": "http://localhost:8080/auth/google/callback"
}

Reemplaza [YOUR_PROJECT_ID] por el ID de tu proyecto de Google Cloud y [YOUR_BUCKET_NAME] por el nombre de tu depósito de Cloud Storage.

Cómo ejecutar la app en tu computadora local

Sigue estos pasos para ejecutar la app de manera local.

  1. Ejecuta npm install para instalar dependencias.

  2. Ejecuta npm start para iniciar la aplicación.

  3. Para ver la aplicación que se ejecuta de manera local, ve a http://localhost:8080.

  4. Para detener el servidor web local, presiona Control + C.

Cómo implementar la app de muestra

Cómo enviar tu código a un repositorio

Existen varias maneras de usar tu código en una instancia de Compute Engine en ejecución. Una manera es usar Cloud Source Repositories. Cada proyecto incluye un repositorio de Git que se puede poner a disposición de las instancias de Compute Engine. Luego, tus instancias pueden obtener la versión más reciente del código de tu aplicación durante el inicio. Esto es muy útil, ya que para actualizar la aplicación no será necesario que configures imágenes o instancias nuevas; solo debes reiniciar una instancia existente o crear una nueva.

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

Primero, crea un repositorio aquí en tu GCP Console. O crea un repositorio con gcloud:

gcloud source repos create [YOUR_REPO]

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

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

en el que [YOUR_PROJECT_ID] es el ID del proyecto.

Cómo crear la implementación

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

Ve al directorio deployment_manager:

cd nodejs-getting-started/7-gce/gce/deployment-manager

Crea la implementación:

gcloud deployment-manager deployments create my-deployment --config config.yaml

Ve una lista de todas las implementaciones:

gcloud deployment-manager deployments list

Obtén una descripción de la implementación y los recursos que creó:

gcloud deployment-manager deployments describe my-deployment

Cómo 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. Para verificar el progreso, ingresa el siguiente comando:

gcloud compute backend-services get-health bookshelf-my-deployment-frontend --global

Cuando al menos una de tus instancias informe el estado HEALTHY, ingresa el siguiente comando para obtener la dirección IP de reenvío para el 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. En tu navegador, ingresa la dirección IP de la lista.

Ahora tu app se ejecuta con balanceo de cargas y ajuste de escala automático en Google Cloud Platform.

Comprensión del código

Cómo configurar la implementación

Puede ver la configuración de 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-8
    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 usa varias propiedades como parámetros. Para obtener más información sobre cómo crear archivos de configuración de Deployment Manager, consulta Cómo crear una configuración.

Cómo configurar el esquema de la plantilla de implementación

A continuación, observa el archivo de esquema, bookshelf.jinja.schema, que define y documenta los parámetros que la implementación debe proporcionar en su archivo de configuración. Para obtener más información sobre los esquemas de configuración, consulta Cómo usar 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

Cómo configurar la plantilla de implementación

La plantilla define varios recursos para crear un grupo de instancias administradas con balanceo de cargas y ajuste de escala automático. Consulta los comentarios de la plantilla para obtener una descripción completa de los recursos creados y revisa el instructivo de Bookshelf en Compute Engine para obtener una explicación más detallada de los recursos creados.

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

La plantilla se escribió con el lenguaje de plantillas Jinja. Cuando escribes plantillas de Deployment Manager, puedes usar Jinja o Python. Jinja tiene la ventaja de ser más declarativo, lo que suele ser más fácil de leer y comprender. En el caso de algunas implementaciones complejas, la expresividad completa de Python podría hacerlo más simple. En este caso, Jinja es suficiente para crear los recursos necesarios.

En una plantilla, ciertas variables de entorno se configuran automáticamente y es posible acceder a ellas mediante el diccionario env. En este caso, el nombre de la implementación 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 Cómo agregar plantillas en la documentación de Deployment Manager:

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

Ten en cuenta que la plantilla usa la misma secuencia de comandos de inicio que se usa en el instructivo de Compute Engine. El valor se importa a través de config.yaml y luego se inserta aquí. Es importante que el espacio en blanco de la secuencia de comandos se conserve de manera apropiada en la plantilla. La directiva sobre la sangría de Jinja se usa para lograr esto:

            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 este ejemplo, el servicio de backend usa la referencia del grupo de instancia 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'] }}

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

Cómo borrar 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, haz lo siguiente:

  1. En GCP Console, dirígete a la página Administrar recursos.

    Ir a la página Administración de recursos

  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar .
  3. En el cuadro de diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Cómo borrar tu implementación

Ingresa este comando para borrar tu implementación. Con esto se borra el balanceador de cargas y todas las instancias de Compute Engine asociadas a tu implementación:

gcloud deployment-manager deployments delete my-deployment

¿Qué sigue?