Implementa y ejecuta un contenedor con Cloud Run en Node.js

Cloud Run es una plataforma de procesamiento administrada que le permite ejecutar contenedores sin estado que se pueden invocar a través de solicitudes HTTP. Cloud Run es una plataforma sin servidores que quita la necesidad de administrar la infraestructura para que puedas enfocarte en lo que más importa: compilar apps excelentes. Se basa en Knative, lo que te permite ejecutar tus contenedores con Cloud Run (completamente administrado) o Cloud Run for Anthos. El objetivo de este codelab es que compiles una imagen de contenedor y la implementes en Cloud Run.

Requisitos previos

N/A

Configuración del entorno a su propio ritmo

Si aún no tienes una Cuenta de Google (Gmail o Google Apps), debes crear una. Accede a Google Cloud Platform Console (console.cloud.google.com) y crea un proyecto nuevo:

Captura de pantalla de 2016-02-10 12:45:26.png

Recuerde el ID de proyecto, un nombre único en todos los proyectos de Google Cloud (el nombre anterior ya se encuentra en uso y no lo podrá usar). Se mencionará más adelante en este codelab como PROJECT_ID.

A continuación, debes habilitar la facturación en Cloud Console para usar los recursos de Google Cloud.

Ejecutar este codelab debería costar solo unos pocos dólares, pero su costo podría aumentar si decides usar más recursos o si los dejas en ejecución (consulta la sección “Limpiar” al final de este documento).

Los usuarios nuevos de Google Cloud Platform son aptos para obtener una prueba gratuita de USD 300.

Cloud Shell

Si bien Google Cloud se puede operar de forma remota desde su laptop, usará Cloud Shell, un entorno de línea de comandos que se ejecuta en Google Cloud.

Esta máquina virtual basada en Debian está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Esto significa que todo lo que necesitarás para este Codelab es un navegador (sí, funciona en una Chromebook).

Para activar Google Cloud Shell, en Developer Console, simplemente haz clic en el botón que se encuentra en la esquina superior derecha (el aprovisionamiento y la conexión al entorno debería llevar solo unos minutos):

activateCloudShell.png

Haz clic en el botón “Iniciar Cloud Shell”:

Captura de pantalla del 14 de junio de 2017 a las 10.13.43 p.m. .png

Una vez conectado a Cloud Shell, deberías ver que ya estás autenticado y que el proyecto ya está configurado con tu PROJECT_ID:

gcloud auth list

Resultado del comando

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Resultado del comando

[core]
project = <PROJECT_ID>

Cloud Shell también establece algunas variables de entorno de forma predeterminada, que pueden ser útiles cuando ejecute comandos futuros.

echo $GOOGLE_CLOUD_PROJECT

Resultado del comando

<PROJECT_ID>

Si, por algún motivo, el proyecto no se configuró, simplemente ejecuta el siguiente comando :

gcloud config set project <PROJECT_ID>

Si no conoce su PROJECT_ID, Verifica qué ID usaste en los pasos de la configuración o búscalo en el panel de la consola:

ID del proyecto.png

IMPORTANTE: Por último, establece la zona y la configuración de proyecto predeterminadas:

gcloud config set compute/zone us-central1-f

Puedes elegir una variedad de zonas diferentes. Obtenga más información en la documentación de regiones y zonas.

Habilita la API de Cloud Run

En Cloud Shell, habilite la API de Cloud Run.

gcloud services enable run.googleapis.com

Se debería mostrar un mensaje similar al siguiente:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

Compilarás una app de Node.js simple y basada en Express que responda a las solicitudes HTTP.

Para compilar tu app, usa Cloud Shell a fin de crear un directorio nuevo llamado helloworld-nodejs y cambiar el directorio a él.

mkdir helloworld-nodejs
cd helloworld-nodejs

Crea un archivo package.json con el siguiente contenido:

{
  "name": "cloudrun-helloworld",
  "version": "1.0.0",
  "description": "Simple hello world sample in Node",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

Lo que es más importante, el archivo anterior contiene un comando de secuencia de comandos de inicio y una dependencia del framework de la aplicación web Express.

A continuación, en el mismo directorio, crea un archivo index.js y copia el siguiente contenido en él:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

Ese código crea un servidor web básico que escucha en el puerto definido por la variable de entorno PORT. Tu app está lista para alojarla, probarla y subirla a Container Registry.

Para crear contenedores para la app de ejemplo, crea un archivo nuevo llamado Dockerfile en el mismo directorio que los archivos de origen y copia el siguiente contenido en él:

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]

Ahora, compile su imagen de contenedor con Cloud Build. Para ello, ejecute el siguiente comando desde el directorio que contiene el Dockerfile:

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

$GOOGLE_CLOUD_PROJECT es una variable de entorno que contiene el ID de tu proyecto de Google Cloud cuando se ejecuta en Cloud Shell. También puedes ejecutar gcloud config get-value project para obtenerlo.

Una vez enviado al registro, verás un mensaje SUCCESS que contiene el nombre de la imagen (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld). La imagen se almacena en Container Registry y se puede reutilizar si lo deseas.

Puedes enumerar todas las imágenes de contenedor asociadas a tu proyecto actual con el siguiente comando:

gcloud container images list

Si quieres ejecutar y probar la app de forma local desde Cloud Shell, puedes iniciarla con el siguiente comando docker estándar:

docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

En Cloud Shell, haga clic en Vista previa en la Web y seleccione Vista previa en el puerto 8080.

Se abrirá una ventana del navegador con el mensaje Hello World!

También puedes usar curl localhost:8080.

Para implementar tu app alojada en contenedores en Cloud Run, usa el siguiente comando (asegúrate de ajustarla al nombre de imagen correcto de la app que compilaste o usa la imagen ya compilada de gcr.io/cloudrun/hello):

gcloud run deploy helloworld \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

La opción de implementación --allow-unauthenticated te permite llegar a la aplicación sin autenticación. La opción de implementación --platform managed \ significa que solicitas el entorno completamente administrado (no la infraestructura de Kubernetes a través de Anthos).

Espere un momento a que finalice la implementación. Cuando finalice, la línea de comandos mostrará la URL de servicio.

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

Para visitar el contenedor implementado, ahora puede abrir la URL del servicio en un navegador web:

Cloud Run aumenta la escala de la imagen de contenedor de forma automática y horizontal para controlar las solicitudes que se reciben y, luego, reduce la escala cuando la demanda disminuye. Solo debes pagar por la CPU, la memoria y las herramientas de redes que se utilicen durante la administración de la solicitud.

Si bien Cloud Run no se cobra cuando el servicio no está en uso, es posible que se te cobre por el almacenamiento de la imagen de contenedor compilada.

Puedes borrar tu proyecto de Google Cloud para evitar que se generen cargos, lo que detendrá la facturación de todos los recursos que se usaron para ese proyecto, o simplemente borra tu imagen helloworld con este comando:

gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

Para borrar el servicio de Cloud Run, use el siguiente comando:

gcloud run services delete helloworld \
  --platform managed \
  --region us-central1

¡Felicitaciones! Implementaste una app empaquetada en una imagen de contenedor en Cloud Run.

Más información

Un buen paso siguiente sería consultar la Guía de inicio rápido: Implementa en Cloud Run for Anthos en Google Cloud.

Para obtener más información sobre cómo compilar un contenedor HTTP sin estado adecuado para Cloud Run a partir del código fuente y enviarlo a Container Registry, consulte los siguientes recursos:

Para obtener más información sobre Knative, el proyecto de código abierto subyacente, consulta Knative.