Migra aplicaciones de Node.js desde Heroku hacia Cloud Run


En este instructivo, se describe cómo migrar apps web de Node.js que se ejecutan en Heroku a Cloud Run en Google Cloud. Este instructivo está dirigido a los arquitectos y propietarios de productos que quieran migrar sus apps de Heroku a servicios administrados en Google Cloud.

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. Se compila en Knative de código abierto, que permite la portabilidad entre plataformas y admite flujos de trabajo de contenedores y estándares para la entrega continua. La plataforma de Cloud Run está integrada en el paquete de productos de Google Cloud y facilita el diseño y desarrollo de apps portátiles, escalables y resilientes.

En este instructivo, aprenderás a migrar una app a Google Cloud que está escrita en Node.js y usa Heroku Postgres como un servicio de apoyo en Heroku. La app web está en contenedores y alojada en Cloud Run, y usa Cloud SQL para PostgreSQL como su capa de persistencia.

En el instructivo, usarás una app simple llamada Tasks que te permite ver y crear tareas. Estas tareas se almacenan en Heroku Postgres en la implementación actual de la app en Heroku.

En este instructivo, se supone que estás familiarizado con la funcionalidad básica de Heroku y que tienes una cuenta de Heroku (o acceso a una). También se supone que estás familiarizado con Cloud Run, Cloud SQL, Docker y Node.js.

Objetivos

  • Compilar una imagen de Docker para implementar la app en Cloud Run
  • Crear una instancia de Cloud SQL para PostgreSQL que funcione como backend después de la migración a Google Cloud
  • Revisar el código de Node.js a fin de comprender cómo Cloud Run se conecta a Cloud SQL y ver los cambios de código necesarios (si los hay) para migrar a Cloud Run desde Heroku
  • Migrar datos de Heroku Postgres a Cloud SQL para PostgreSQL
  • Implementar la app en Cloud Run
  • Probar la app implementada

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 nuevos de Google Cloud califiquen para obtener una prueba gratuita.

También es posible que se te cobre por los recursos que uses en Heroku.

Antes de comenzar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud SQL, Cloud Build, Cloud Run, Container Registry, Service Networking, Serverless VPC Access APIs.

    Enable the APIs

  5. Make sure that you have the following role or roles on the project: Cloud Run > Cloud Run Admin, Cloud Storage > Storage Admin, Cloud SQL > Cloud SQL Admin, Compute Engine > Compute Network Admin, Resource Manager > Project IAM Admin, Cloud Build > Cloud Build Editor, Serverless VPC Access > Serverless VPC Access Admin, Logging > Logs Viewer, Service Accounts > Service Account Admin, Service Accounts > Service Account User, and Service Usage > Service Usage Consumer

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role colunn to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Ir a IAM
    2. Selecciona el proyecto.
    3. Haz clic en Grant access.
    4. En el campo Principales nuevas, ingresa tu identificador de usuario. Esta suele ser la dirección de correo electrónico de una Cuenta de Google.

    5. En la lista Seleccionar un rol, elige un rol.
    6. Para otorgar funciones adicionales, haz clic en Agregar otro rol y agrega cada rol adicional.
    7. Haz clic en Guardar.
    8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

      Go to project selector

    9. Make sure that billing is enabled for your Google Cloud project.

    10. Enable the Cloud SQL, Cloud Build, Cloud Run, Container Registry, Service Networking, Serverless VPC Access APIs.

      Enable the APIs

    11. Make sure that you have the following role or roles on the project: Cloud Run > Cloud Run Admin, Cloud Storage > Storage Admin, Cloud SQL > Cloud SQL Admin, Compute Engine > Compute Network Admin, Resource Manager > Project IAM Admin, Cloud Build > Cloud Build Editor, Serverless VPC Access > Serverless VPC Access Admin, Logging > Logs Viewer, Service Accounts > Service Account Admin, Service Accounts > Service Account User, and Service Usage > Service Usage Consumer

      Check for the roles

      1. In the Google Cloud console, go to the IAM page.

        Go to IAM
      2. Select the project.
      3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

      4. For all rows that specify or include you, check the Role colunn to see whether the list of roles includes the required roles.

      Grant the roles

      1. In the Google Cloud console, go to the IAM page.

        Ir a IAM
      2. Selecciona el proyecto.
      3. Haz clic en Grant access.
      4. En el campo Principales nuevas, ingresa tu identificador de usuario. Esta suele ser la dirección de correo electrónico de una Cuenta de Google.

      5. En la lista Seleccionar un rol, elige un rol.
      6. Para otorgar funciones adicionales, haz clic en Agregar otro rol y agrega cada rol adicional.
      7. Haz clic en Guardar.

Configura tu entorno

  1. Abre Cloud Shell

    Abrir Cloud Shell

  2. En Cloud Shell, configura las variables de entorno y los valores predeterminados de Google Cloud CLI que se usa en este instructivo.

    gcloud config set project PROJECT_ID
    gcloud config set run/region us-central1
    

    Reemplaza PROJECT_ID con el ID del proyecto.

Arquitectura

En las siguientes figuras, se describe la arquitectura de la app web en Heroku (tal como está) y su diseño arquitectónico en Google Cloud (que compilarás).

Arquitectura tal como está en Heroku.
Figura 1. Arquitectura tal como está en Heroku.

La app de Tasks que se implementa en la actualidad en Heroku consta de uno o más dynos web. Los dynos web pueden recibir y responder al tráfico HTTP, a diferencia de los dynos de trabajador, que son más adecuados para trabajos en segundo plano y tareas temporizadas. La app entrega una página de índice que muestra las tareas almacenadas en una base de datos de Postgres con la biblioteca de plantillas Mustache para Node.js.

Puedes acceder a la app mediante una URL HTTPS. Una ruta /tasks en esa URL te permite crear tareas nuevas.

Arquitectura tal como está en Heroku.
Figura 2. Arquitectura que compilas en Google Cloud

En Google Cloud, Cloud Run se usa como la plataforma sin servidores para implementar la app de Tasks. Cloud Run está diseñado con el fin de ejecutar contenedores sin estado basados en solicitudes. Es adecuado para cuando necesitas que tu servicio administrado admita apps en contenedores que realizan un ajuste de escala automático y escalan a cero cuando no entregan tráfico.

Asigna componentes que se usan en Heroku a Google Cloud

En la siguiente tabla, se asignan componentes de la plataforma de Heroku a Google Cloud. Esta asignación te ayuda a traducir la arquitectura descrita en este instructivo de Heroku a Google Cloud.

Componente Plataforma de Heroku Google Cloud
Contenedores Dynos: Heroku usa el modelo de contenedor para compilar y escalar apps de Heroku. Estos contenedores de Linux se denominan dynos y pueden escalar a un número que especifiques para admitir las demandas de recursos de tu app de Heroku. Puedes seleccionar entre un rango de tipos de dynos en función de los requisitos de CPU y memoria de la app. Contenedores de Cloud Run: Google Cloud admite la ejecución de cargas de trabajo en contenedores sin estado que se pueden ejecutar en un entorno completamente administrado o en clústeres de Google Kubernetes Engine (GKE).
App web App de Heroku: Los dynos son las piezas fundamentales de las apps de Heroku. Por lo general, las apps constan de uno o más tipos de dynos, que suelen ser una combinación de dynos web y de trabajador. Servicio de Cloud Run: Una app web se puede modelar como un servicio de Cloud Run. Cada servicio obtiene su propio extremo HTTPS y puede aumentar o reducir la escala de forma automática de 0 a N según el tráfico al extremo del servicio.
Base de datos Heroku Postgres es la base de datos como servicio (DaaS) de Heroku basada en PostgreSQL. Cloud SQL es un servicio de base de datos administrado para bases de datos relacionales en Google Cloud.

Implementa la app web de Tasks de muestra en Heroku

En las siguientes secciones, se muestra cómo configurar la interfaz de línea de comandos (CLI) para Heroku, clonar el repositorio de código fuente de GitHub e implementar la app en Heroku.

Configura la interfaz de línea de comandos para Heroku

En este instructivo, se ejecuta la CLI de Heroku en Cloud Shell y se debe autenticar con una clave de API de Heroku. Cuando se ejecuta en Cloud Shell, la CLI de Heroku no puede autenticarse mediante una contraseña o una autenticación basada en la Web.

Como alternativa, si ejecutas la muestra en una terminal local, puedes usar cualquier método de autenticación de la CLI de Heroku. Cuando ejecutes el instructivo en una terminal local, también debes instalar Google Cloud CLI, git y Docker.

  1. Accede a la consola web de Heroku y, luego, desde la página de configuración de la cuenta, copia el valor de la clave de API.

  2. En Cloud Shell, instala la CLI de Heroku

  3. En Cloud Shell, instala la CLI de Heroku. Cuando se te solicite la contraseña, ingresa el valor de la clave de API que copiaste de la consola de Heroku, no la contraseña que usas para acceder a la consola.

    heroku login --interactive
    

Clona el repositorio de código fuente

  1. En Cloud Shell, clona el repositorio de GitHub de la app de Tasks de muestra:

    git clone https://github.com/GoogleCloudPlatform/migrate-webapp-heroku-to-cloudrun-node.git
    
  2. Cambia los directorios al directorio que se creó cuando se clonó el repositorio:

    cd migrate-webapp-heroku-to-cloudrun-node
    

    El directorio contiene los siguientes archivos:

    • Una secuencia de comandos de Node.js llamada index.js con el código para las rutas que entrega la app web
    • Archivos package.json y package-lock.json que describen las dependencias de la app web. Debes instalar estas dependencias para que la app se ejecute
    • Un archivo Procfile que especifica el comando que ejecuta la app en el inicio. Debes crear un archivo Procfile para implementar la app en Heroku
    • Un directorio views, con el contenido HTML que entrega la app web en la ruta “/”
    • Un archivo .gitignore

Implementa una app en Heroku

  1. En Cloud Shell, crea una app de Heroku:

    heroku create
    

    Toma nota del nombre creado para la app. Necesitarás este valor en el paso siguiente.

  2. Crea una variable de entorno para el nombre de la app de Heroku:

    export APP_NAME=APP_NAME
    

    Reemplaza APP_NAME con el nombre de la app que muestra el comando heroku create.

  3. Agrega el complemento de Heroku Postgres para aprovisionar una base de datos de PostgreSQL:

    heroku addons:create heroku-postgresql:mini
    
  4. Asegúrate de que el complemento se haya agregado de forma correcta:

    heroku addons
    

    Si el complemento de Postgres se agregó de forma correcta, verás un mensaje similar al siguiente:

    Add-on               Plan     Price       State
    -----------------    -----    --------    -----
    heroku-postgresql    mini     5$/month    created
    
  5. Implementa la app en Heroku:

    git push heroku master
    
  6. Ejecuta el siguiente comando para confirmar el valor de DATABASE_URL.

    heroku config
    

    Toma nota del valor recuperado de DATABASE_URL. Necesitarás este valor en el paso siguiente.

  7. Ejecutar un contenedor de Docker.

    docker run -it --rm postgres psql "DATABASE_URL"
    

    Reemplaza DATABASE_URL por la URL de Heroku Postgres que anotaste en el paso anterior.

  8. En el contenedor de Docker, crea la tabla TASKS con el siguiente comando:

    CREATE TABLE TASKS
    (DESCRIPTION TEXT NOT NULL);
    
  9. Sal del contenedor:

    exit
    
  10. En CloudShell, ejecuta el siguiente comando para obtener la URL web de la app de Heroku:

    heroku info
    
  11. Abre la URL web en una ventana del navegador. La app se ve de la siguiente captura de pantalla (aunque tu versión no tendrá las tareas enumeradas):

    App de tareas pendientes en el navegador web.

  12. Crea tareas de muestra en tu app desde el navegador. Asegúrate de que las tareas se recuperen de la base de datos y se puedan ver en la IU.

Prepara el código de la app web para la migración a Cloud Run

En esta sección, se detallan los pasos que debes completar para preparar tu app web a fin de implementarla en Cloud Run.

Compila y publica tu contenedor de Docker en Container Registry

Necesitas una imagen de Docker para compilar el contenedor de la app a fin de que pueda ejecutarse en Cloud Run. Puedes compilar el contenedor de forma manual o mediante Buildpacks.

Compila el contenedor de forma manual

  1. En Cloud Shell, crea un Dockerfile en el directorio que se creó cuando se clonó el repositorio para este instructivo:

    cat <<"EOF" > Dockerfile
    # Use the official Node image.
    # https://hub.docker.com/_/node
    FROM node:10-alpine
    
    # Create and change to the app directory.
    WORKDIR /app
    
    # Copying this separately prevents re-running npm install on every code change.
    COPY package*.json ./
    RUN npm install
    
    # Copy local code to the container image.
    COPY . /app
    
    # Configure and document the service HTTP port.
    ENV PORT 8080
    EXPOSE $PORT
    
    # Run the web service on container startup.
    CMD ["npm", "start"]
    EOF
    
  2. Compila el contenedor con Cloud Build y publica la imagen en Container Registry:

    gcloud builds submit --tag gcr.io/PROJECT_ID/APP_NAME:1 \
      --gcs-log-dir=gs://PROJECT_ID_cloudbuild
    
  3. Crea una variable de entorno para guardar el nombre de la imagen de Docker que creaste:

    export IMAGE_NAME="gcr.io/PROJECT_ID/APP_NAME:1"
    

Compila el contenedor con Buildpacks

  1. En Cloud Shell, instala la CLI pack:

  2. Configura la CLI pack para usar el compilador de Heroku de forma predeterminada:

    pack config default-builder heroku/buildpacks:22
    
  3. Crea una variable de entorno para guardar el nombre de la imagen de Docker:

    export IMAGE_NAME=gcr.io/PROJECT_ID/APP_NAME:1
    
  4. Compila la imagen con el comando pack y envía o publica la imagen en Container Registry:

    pack build --publish $IMAGE_NAME
    

Crea una instancia de Cloud SQL para PostgreSQL

Debes crear una instancia de Cloud SQL para PostgreSQL a fin de que funcione como backend de la app web. En este instructivo, PostgreSQL es más adecuada como la app de muestra implementada en Heroku, que usa una base de datos de Postgres como su backend. Para los fines de esta app, la migración a Cloud SQL para PostgreSQL desde un servicio administrado de Postgres no requiere cambios de esquema.

  1. Prepara la red para Cloud SQL con una dirección IP privada.

    gcloud compute addresses create google-managed-services-default \
      --global \
      --purpose=VPC_PEERING \
      --prefix-length=16 \
      --description="peering range for CloudSQL Private Service Access" \
      --network=default
    
    gcloud services vpc-peerings connect \
      --service=servicenetworking.googleapis.com \
      --ranges=google-managed-services-default \
      --network=default \
      --project=PROJECT_ID
    
  2. Crea una variable de entorno llamada CLOUDSQL_DB_NAME para guardar el nombre de la instancia de base de datos que crearás en el siguiente paso:

    export CLOUDSQL_DB_NAME=tasks-db
    
  3. Crea la base de datos:

    gcloud sql instances create $CLOUDSQL_DB_NAME \
    --cpu=1 \
    --memory=4352Mib \
    --database-version=POSTGRES_15 \
    --region=us-central1 \
    --network default \
    --no-assign-ip
    

    La instancia puede tomar unos minutos en inicializarse.

  4. Establece una contraseña para el usuario de Postgres:

    gcloud sql users set-password postgres \
        --instance=$CLOUDSQL_DB_NAME  \
        --password=POSTGRES_PASSWORD
    

    Reemplaza POSTGRES_PASSWORD por la contraseña que deseas usar para la base de datos de Postgres.

Importa datos a Cloud SQL desde Heroku Postgres

Existen varios patrones de migración que puedes usar para migrar datos a Cloud SQL. En general, el mejor enfoque que requiere poco o ningún tiempo de inactividad es configurar Cloud SQL como una réplica de la base de datos que se migrará y hacer que Cloud SQL sea la instancia principal luego de la migración. Heroku Postgres no admite réplicas externas (seguidores), por lo que en este instructivo, usarás herramientas de código abierto para migrar el esquema de la app.

Para la app de Tasks en este instructivo, usarás la utilidad pg_dump a fin de exportar datos de Heroku Postgres a un bucket de Cloud Storage y, luego, importarlos en Cloud SQL. Esta utilidad puede transferir datos entre versiones homogéneas o cuando la versión de la base de datos de destino es más reciente que la base de datos de origen.

  1. En Cloud Shell, obtén las credenciales de la base de datos de Heroku Postgres que está conectada a la app de muestra. Necesitarás estas credenciales en el próximo paso.

    heroku pg:credentials:url
    

    Con este comando, se muestra la string de información de conexión y la URL de conexión de tu aplicación. La string de información de conexión tiene el siguiente formato:

    "dbname=DATABASE_NAME host=FQDN port=5432 user=USER_NAME password=PASSWORD_STRING sslmode=require"
    

    Necesitas los valores que se muestran en la cadena de conexión en el siguiente paso.

    Para ver un ejemplo de un valor de FQDN (nombre de dominio completamente calificado) en una string de información de conexión, consulta la documentación de Heroku.

  2. Configura las variables de entorno para conservar los valores de Heroku que usarás en los pasos posteriores:

    export HEROKU_PG_DBNAME=DATABASE_NAME
    export HEROKU_PG_HOST=FQDN
    export HEROKU_PG_USER=USER_NAME
    export HEROKU_PG_PASSWORD=PASSWORD_STRING
    

    Reemplaza lo siguiente:

    • DATABASE_NAME: Es el nombre de la base de datos que se muestra en la cadena de información.
    • FQDN: Es el FQDN que se muestra en la cadena de información.
    • USER_NAME: Es el nombre de usuario que se muestra en la cadena de información.
    • PASSWORD_STRING: Es la cadena de contraseña que se muestra en la cadena de información.
  3. Crea una copia de seguridad en formato SQL de tu base de datos de Heroku Postgres:

    docker run \
      -it --rm \
      -e PGPASSWORD=$HEROKU_PG_PASSWORD \
      -v $(pwd):/tmp \
      --entrypoint "pg_dump" \
      postgres \
      -Fp \
      --no-acl \
      --no-owner \
      -h $HEROKU_PG_HOST \
      -U $HEROKU_PG_USER \
      $HEROKU_PG_DBNAME > herokudump.sql
    
  4. Crea una variable de entorno para guardar el nombre de tu bucket de Cloud Storage:

    export PG_BACKUP_BUCKET=gs://PROJECT_ID-pg-backup-bucket
    
  5. Cree un bucket de Cloud Storage:

    gcloud storage buckets create $PG_BACKUP_BUCKET \
      --location=us-central1 \
      --public-access-prevention \
      --uniform-bucket-level-access
    
  6. Sube el archivo SQL a este bucket:

    gcloud storage cp herokudump.sql $PG_BACKUP_BUCKET/herokudump.sql
    
  7. Autoriza tu instancia de Cloud SQL con los roles necesarios para importar el archivo SQL desde el bucket de Cloud Storage:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:$(gcloud sql instances describe $CLOUDSQL_DB_NAME --format='get("serviceAccountEmailAddress")') \
      --role=roles/storage.objectAdmin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:$(gcloud sql instances describe $CLOUDSQL_DB_NAME --format='get("serviceAccountEmailAddress")') \
      --role=roles/cloudsql.editor
    
  8. Importa el archivo SQL a la instancia de Cloud SQL:

    gcloud sql import sql $CLOUDSQL_DB_NAME $PG_BACKUP_BUCKET/herokudump.sql \
      --database=postgres \
      --user=postgres
    

    Cuando se te solicite do you want to continue (y/n), ingresa "y".

Cómo Cloud Run accede a la base de datos de Cloud SQL

Así como la app web implementada en Heroku necesita conectarse a la instancia administrada de Heroku Postgres, Cloud Run requiere acceso a Cloud SQL para poder leer y escribir datos.

Cloud Run se comunica con Cloud SQL mediante el proxy de Cloud SQL que se activa y configura de forma automática cuando implementas el contenedor en Cloud Run. La base de datos no necesita tener direcciones IP externas aprobadas porque toda la comunicación que recibe proviene del proxy con TCP seguro.

Tu código debe invocar operaciones de la base de datos (como recuperar sus datos o escribir en ella) mediante la invocación del proxy en un socket UNIX.

Debido a que esta app web está escrita en Node.js, usarás la biblioteca pg-connection-string para analizar una URL de base de datos y crear un objeto config. La ventaja de este enfoque es que la conexión a la base de datos del backend en Heroku y Cloud Run se realiza sin problemas.

En el siguiente paso, debes pasar la URL de la base de datos como una variable de entorno cuando implementas la app web.

Implementa la app de muestra en Cloud Run

  1. En Cloud Shell, configura el acceso a VPC sin servidores para permitir el tráfico privado de Cloud Run a Cloud SQL:

    gcloud compute networks subnets create serverless-connector-subnet \
    --network=default \
    --range=10.0.0.0/28 \
    --region=us-central1
    
    gcloud compute networks vpc-access connectors create serverless-connector \
    --region=us-central1 \
    --subnet=serverless-connector-subnet
    
  2. En Cloud Shell, crea una variable de entorno que contenga el nombre de la conexión de la instancia de Cloud SQL que creaste:

    export DB_CONN_NAME=$(gcloud sql instances describe $CLOUDSQL_DB_NAME --format='value(connectionName)')
    
  3. Crea una variable de entorno llamada DATABASE_URL para conservar la cadena de conexión para conectarte al proxy de Cloud SQL a través de un puerto UNIX.

    export DATABASE_URL="socket:/cloudsql/${DB_CONN_NAME}?db=postgres&user=postgres&password=POSTGRES_PASSWORD"
    
  4. Crea una cuenta de servicio para Cloud Run con un rol de IAM para conectarte a la base de datos:

    gcloud iam service-accounts create sa-run-db-client
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:sa-run-db-client@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/cloudsql.client
    
  5. Implementa la app web en Cloud Run:

    gcloud run deploy tasksapp-PROJECT_ID \
        --image=$IMAGE_NAME \
        --service-account=sa-run-db-client@PROJECT_ID.iam.gserviceaccount.com \
        --set-env-vars=DATABASE_URL=$DATABASE_URL \
        --add-cloudsql-instances $DB_CONN_NAME \
        --vpc-connector serverless-connector \
        --allow-unauthenticated
    
    

    Mediante el comando anterior, también se vincula tu contenedor de Cloud Run a la instancia de base de datos de Cloud SQL que creaste. Con el comando, se establece una variable de entorno para que Cloud Run apunte a la string DATABASE_URL que creaste en el paso anterior.

Cómo probar la aplicación

  1. En Cloud Shell, obtén la URL en la que Cloud Run entrega el tráfico:

    gcloud run services list
    

    También puedes revisar el servicio de Cloud Run en la consola de Google Cloud.

  2. Navega a la URL del servicio de Cloud Run para asegurarte de que tu app web acepte solicitudes HTTP.

Cloud Run crea o inicia un contenedor nuevo cuando se envía una solicitud HTTP al extremo de entrega y si un contenedor aún no está en ejecución. Esto significa que la solicitud que hace que un contenedor nuevo se inicie puede tomar un poco más de tiempo en entregarse. Debido a ese tiempo adicional, ten en cuenta la cantidad de solicitudes simultáneas que tu app puede admitir y cualquier requisito de memoria específico que pueda tener.

Para esta app, usarás la configuración de simultaneidad predeterminada, que permite que un servicio de Cloud Run entregue 80 solicitudes en simultáneo desde un solo contenedor.

Limpia

Para evitar que se generen costos en tu cuenta de Google Cloud por los recursos que se usaron en este instructivo, sigue estos pasos. También se recomienda borrar los recursos que se crearon en Heroku para este instructivo.

Borra el proyecto de Google Cloud

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Borra la app de Heroku

Para borrar la app de muestra que implementaste en Heroku y el complemento de PostgreSQL asociado, ejecuta el siguiente comando:

heroku apps:destroy -a APP_NAME

¿Qué sigue?