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

1. Antes de comenzar

6a5cf23c8e20491f.png

Cloud Run es una plataforma de procesamiento administrada que te permite ejecutar contenedores sin estado que se pueden invocar a través de solicitudes HTTP. Cloud Run funciona sin servidores, ya que elimina la necesidad de administrar la infraestructura para que puedas enfocarte en lo más importante: 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

2. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. Accede a la consola de Cloud y crea un proyecto nuevo o reutiliza uno existente. (Si todavía no tienes una cuenta de Gmail o de G Suite, debes crear una).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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.

  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar los recursos de Google Cloud recursos.

Ejecutar este codelab no debería costar mucho, tal vez nada. Asegúrate de seguir las instrucciones de la sección “Realiza una limpieza” en la que se aconseja cómo cerrar recursos para no incurrir en facturación más allá de este instructivo. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Cloud Shell

Si bien Google Cloud se puede operar de manera remota desde tu laptop, debes 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).

  1. Para activar Cloud Shell desde la consola de Cloud, solo haz clic en Activar Cloud ShellfEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (el aprovisionamiento y la conexión al entorno debería llevar solo unos minutos).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

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

Una vez conectado a Cloud Shell, debería ver que ya se autenticó y que el proyecto ya se configuró 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>

Si, por algún motivo, el proyecto no está configurado, solo emite el siguiente comando:

gcloud config set project <PROJECT_ID>

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

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell también configura algunas variables de entorno de forma predeterminada, lo que puede resultar útil cuando ejecutas comandos futuros.

echo $GOOGLE_CLOUD_PROJECT

Resultado del comando

<PROJECT_ID>
  1. Establece la zona predeterminada y la configuración del proyecto.
gcloud config set compute/zone us-central1-f

Puedes elegir una variedad de zonas diferentes. Para obtener más información, consulta Regiones y zonas.

Habilita la API de Cloud Run

En Cloud Shell, habilita la API de Cloud Run.

gcloud services enable run.googleapis.com

Esto debería producir un mensaje exitoso similar a este:

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

3. Escribe la app de ejemplo

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 para crear un directorio nuevo llamado helloworld-nodejs y usa Cloud Shell para cambiar de directorio.

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 más importante es que el archivo anterior contiene una secuencia de comandos de inicio y una dependencia del framework de apps web Express.

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

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);
});

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

4. Organice su aplicación en contenedores y súbala a Container Registry

Para alojar la app de ejemplo en contenedores, crea un archivo nuevo llamado Dockerfile en el mismo directorio que los archivos fuente y copia allí el siguiente contenido:

# 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" ]

Usa Cloud Build para compilar la imagen de contenedor. Para ello, ejecuta 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 obtenerlo ejecutando gcloud config get-value project.

Una vez enviado al registro, verás un mensaje SUCCESS con el nombre de la imagen (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld). La imagen se almacena en Container Registry y se puede volver a utilizar si así se desea.

Puedes obtener una lista de todas las imágenes de contenedores asociadas a tu proyecto actual con este comando:

gcloud container images list

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

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

En Cloud Shell, haz clic en Vista previa en la Web 170b7a95be8c6296.png y selecciona Vista previa en el puerto 8080.

3618ca3a4a135570.png

Se abrirá una ventana del navegador que dirá Hello World!

a0307f34cacf9e6a.png

También puedes usar curl localhost:8080.

5. Implementa en Cloud Run

La implementación de tu app alojada en contenedores en Cloud Run se realiza con el siguiente comando (asegúrate de ajustarlo al nombre de imagen correcto para la app que compilaste o usar la imagen precompilada 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 de --allow-unauthenticated te permite acceder a la app 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 esté listo, 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

Ahora puedes abrir la URL de servicio en un navegador web para visitar el contenedor implementado:

63260b4d3aee42b8.png

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

6. Limpia

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

Puedes borrar el proyecto de Google Cloud para evitar que se apliquen cargos, lo que detendrá la facturación de todos los recursos usados para ese proyecto, o simplemente borrar la imagen de helloworld con el siguiente 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

7. Felicitaciones

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

Si quieres obtener más información para compilar un contenedor HTTP sin estado adecuado para Cloud Run a partir de código fuente y enviarlo a Container Registry, consulta los siguientes recursos:

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