Usa revisiones en las funciones de Cloud Run para la división del tráfico, los lanzamientos graduales y las reversiones

1. Introducción

Descripción general

Las funciones de Cloud Run te permiten especificar qué revisiones deben recibir tráfico y especificar los porcentajes de tráfico que recibe una revisión. Las revisiones te permiten revertir a una revisión anterior, lanzar una revisión de forma gradual y dividir el tráfico entre varias revisiones.

En estos codelabs, se muestra cómo usar las revisiones para administrar el tráfico a tus funciones de Cloud Run. Obtén más información sobre las revisiones en la documentación de Cloud Run.

Qué aprenderás

  • Cómo dividir el tráfico entre dos o más revisiones de una función de Cloud Run
  • Cómo lanzar una revisión nueva de forma gradual
  • Cómo revertir a una revisión anterior

2. Configuración y requisitos

Requisitos previos

  • Accediste a la consola de Cloud.
  • Ya implementaste una función de Cloud Run. Por ejemplo, puedes seguir los pasos para implementar una función de Cloud Run para comenzar.

Activar Cloud Shell

  1. En la consola de Cloud, haz clic en Activar Cloud Shelld1264ca30785e435.png.

cb81e7c8e34bc8d.png

Si es la primera vez que inicias Cloud Shell, verás una pantalla intermedia que describe en qué consiste. Si apareció una pantalla intermedia, haz clic en Continuar.

d95252b003979716.png

El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.

7833d5e1c5d18f54.png

Esta máquina virtual está cargada con todas las herramientas de desarrollo necesarias. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que mejora considerablemente el rendimiento de la red y la autenticación. Gran parte de tu trabajo en este codelab, si no todo, se puede hacer con un navegador.

Una vez que te conectes a Cloud Shell, deberías ver que se realizó la autenticación y que el proyecto se configuró con tu ID de proyecto.

  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que tienes la autenticación:
gcloud auth list

Resultado del comando

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Ejecuta el siguiente comando en Cloud Shell para confirmar que el comando de gcloud conoce tu proyecto:
gcloud config list project

Resultado del comando

[core]
project = <PROJECT_ID>

De lo contrario, puedes configurarlo con el siguiente comando:

gcloud config set project <PROJECT_ID>

Resultado del comando

Updated property [core/project].

3. División del tráfico

En este ejemplo, se muestra cómo crear una función que lee una variable de entorno de color y responde con el nombre de la revisión usando ese color de fondo.

Aunque este codelab usa node.js, puedes usar cualquier entorno de ejecución.

Configura las variables de entorno

Puedes establecer variables de entorno que se usarán en este codelab.

REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen

Crea la función

Primero, crea un directorio para el código fuente y ábrelo con el comando cd.

mkdir revisions-gcf-codelab && cd $_

Luego, crea un archivo package.json con el siguiente contenido:

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

A continuación, crea un archivo fuente index.js con el siguiente contenido:

const functions = require('@google-cloud/functions-framework');

const BG_COLOR = process.env.BG_COLOR;
const K_REVISION = process.env.K_REVISION;

functions.http('helloWorld', (req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.end('<html><body style="background-color:' + BG_COLOR + ';"' + '><div><p>' + 'Hello from ' + K_REVISION + ' using color ' + BG_COLOR + '</p></div></body>' + '</html>');
});

Para implementar una función de Cloud Run directamente en Cloud Run, ejecuta el siguiente comando:

gcloud beta run deploy traffic-splitting-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --set-env-vars BG_COLOR=$BG_COLOR

Si prefieres implementarla como una función de Cloud Functions de 2ª gen., usa el siguiente comando:

gcloud functions deploy traffic-splitting-gcf \
  --gen2 \
  --runtime=nodejs20 \
  --region=$REGION \
  --source=. \
  --entry-point=helloWorld \
  --trigger-http \
  --no-allow-unauthenticated \
  --set-env-vars BG_COLOR=$BG_COLOR

Para probar la función, puedes usar el comando curl en el extremo existente para ver el color verde marino oscuro en el código HTML o usar tu navegador para acceder directamente al extremo y ver el color de fondo.

SERVICE_URL=$(gcloud run services describe traffic-splitting-gcf --platform managed --region $REGION --format 'value(status.url)')

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Ahora implementa una segunda revisión con un fondo de color tostado.

Para implementar una función de Cloud Run directamente en Cloud Run, ejecuta el siguiente comando:

# update the env var
BG_COLOR=tan

gcloud beta run deploy traffic-splitting-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

Si prefieres implementarlo como Cloud Functions (2nd gen), usa el siguiente comando:

# update the env var
BG_COLOR=tan

gcloud functions deploy traffic-splitting-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR

Ahora, cuando ejecutes el comando curl en el extremo, verás el color de fondo marrón.

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Divide el tráfico en un porcentaje del 50 al 50

Para dividir el tráfico entre las revisiones de verde y marrón oscuro, debes encontrar los IDs de revisión de los servicios subyacentes de Cloud Run. Para ver los IDs de revisión, ejecuta este comando:

gcloud run revisions list --service traffic-splitting-gcf \
  --region $REGION --format 'value(REVISION)'

Deberías ver resultados similares a los que se muestran a continuación

traffic-splitting-gcf-00003-qoq
traffic-splitting-gcf-00002-zag

Para dividir el tráfico 50/50 entre las dos revisiones, ejecuta el siguiente comando:

gcloud run services update-traffic traffic-splitting-gcf \
  --region $REGION \
  --to-revisions <REVISION1>=50,<REVISION2>=50

Prueba la división del tráfico

Para probar la función, visita su URL pública (ya sea mediante curl o directamente en el navegador).

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" $SERVICE_URL

La mitad de las veces, deberías ver la revisión de color verde oscuro y, la otra mitad, la revisión de color marrón claro. También verás el nombre de la revisión en el resultado, p. ej.,

<html><body style="background-color:tan;"><div><p>Hello traffic-splitting-gcf-00006-qoq</p></div></body></html>

4. Lanzamientos graduales

En esta sección, aprenderás a lanzar gradualmente los cambios en una nueva revisión de Cloud Functions. Puedes obtener más información sobre los lanzamientos graduales en la documentación.

Usarás el mismo código que en la sección anterior, pero lo implementarás como una nueva Cloud Function.

Primero, establece el color de fondo en beige y, luego, implementa la función con el nombre gradual-rollouts-gcf.

Para implementar una función de Cloud Run directamente en Cloud Run, ejecuta el siguiente comando:

# update the env var
BG_COLOR=beige

gcloud beta run deploy gradual-rollouts-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

Si prefieres implementarla como una función de Cloud Functions de 2ª gen., usa el siguiente comando:

# update the env var
BG_COLOR=beige

# deploy the function
gcloud functions deploy gradual-rollouts-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR

Ahora supongamos que queremos lanzar gradualmente una nueva revisión con el color de fondo lavanda.

Primero, configuremos la revisión actual de color beige para recibir el 100% del tráfico. Esto garantizará que tus futuras implementaciones de Cloud Function no reciban tráfico. De forma predeterminada, Cloud Functions configura el 100% del tráfico a la revisión con la marca latest. Si especificas de forma manual que esta revisión beige actual debe recibir todo el tráfico, la revisión con la marca latest ya no recibirá el 100% del tráfico. Consulta la documentación.

# get the revision name

BEIGE_REVISION=$(gcloud run revisions list --service gradual-rollouts-gcf \
  --region $REGION --format 'value(REVISION)')

# now set 100% traffic to that revision

gcloud run services update-traffic gradual-rollouts-gcf --to-revisions=$BEIGE_REVISION=100 --region $REGION

Verás un resultado similar a Traffic: 100% gradual-rollouts-gcf2-00001-yox.

Ahora puedes implementar una revisión nueva que no recibirá tráfico. En lugar de hacer cambios en el código, puedes actualizar la variable de entorno BG_COLOR para esta revisión.

Para implementar una función de Cloud Run directamente en Cloud Run, ejecuta el siguiente comando:

# update color

BG_COLOR=lavender

# deploy the function that will not receive any traffic
gcloud beta run deploy gradual-rollouts-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

Si prefieres implementarlo como Cloud Functions (2nd gen), usa el siguiente comando:

# update color

BG_COLOR=lavender

# deploy the function that will not receive any traffic
gcloud functions deploy gradual-rollouts-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR \
  --tag $BG_COLOR

Ahora, actualiza la variable de entorno SERVICE_URL para usar la función gradual-rollouts-gcf.

SERVICE_URL=$(gcloud run services describe gradual-rollouts-gcf --platform managed --region $REGION --format 'value(status.url)')

Cuando ejecutes el comando curl

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

verás el color beige, aunque la lavanda fue la última revisión implementada.

<html><body style="background-color:beige;"><div><p>Hello from gradual-rollouts-gcf-24jan16-staging-2-00001-kop using color beige</p></div></body></html>

Prueba una revisión que entregue el 0% del tráfico

Supongamos que verificaste que tu revisión se implementó correctamente y que entrega el 0% del tráfico. Aunque pasó las verificaciones de estado, debes verificar que esta revisión use el color de fondo lavanda.

Para probar la revisión de lavanda, puedes aplicar una etiqueta a esa revisión. El etiquetado te permite probar directamente la revisión nueva en una URL específica, sin entregar tráfico.

Primero, obtén la URL de la imagen de esa revisión.

IMAGE_URL=$(gcloud run services describe gradual-rollouts-gcf --region $REGION --format 'value(IMAGE)')

Ahora etiqueta esa imagen con su color asociado.

gcloud run deploy gradual-rollouts-gcf --image $IMAGE_URL --no-traffic --tag $BG_COLOR --region $REGION --no-allow-unauthenticated

Verás un resultado similar al siguiente:

The revision can be reached directly at https://lavender---gradual-rollouts-gcf-k6msmyp47q-lz.a.run.app

Ahora puedes usar curl para esta revisión directamente

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET <DIRECT_REVISION_URL>

y verás el color lavanda en los resultados:

<html><body style="background-color:lavender;"><div><p>Hello from gradual-rollouts-gcf-24jan16-00003-xik using color lavender</p></div></body></html>

Aumento gradual del tráfico

Ahora, puedes comenzar a enviar tráfico a la revisión lavanda. En el siguiente ejemplo, se muestra cómo enviar el 1% del tráfico a la lavanda.

gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=1

Para enviar el 50% del tráfico a la lavanda, puedes usar el mismo comando, pero especifica 50% en su lugar.

gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=50

Deberías ver una lista del tráfico que recibe cada revisión.

Traffic:
  50% gradual-rollouts-gcf-00001-hos
  50% gradual-rollouts-gcf-00004-mum
        lavender: https://lavender---gradual-rollouts-gcf-k6msmyp47q-uc.a.run.app

Cuando esté todo listo para lanzar el color lavanda por completo, puedes establecerlo en un 100% para reemplazar el beige.

gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=100

Ahora, cuando visites o ejecutes curl en la URL del servicio de la función gradual-rollouts-gcf,

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

solo verás el color lavanda.

<html><body style="background-color:lavender;"><div><p>Hello gradual-rollouts-gcf-00004-mum</p></div></body></html>

5. Reversiones

Supongamos que llegaron los primeros comentarios de UX, que indican que los clientes prefieren el beige al lavanda, y debes revertir al beige.

Para revertir a la revisión anterior (beige), ejecuta este comando.

gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-revisions $BEIGE_REVISION=100

y ahora, cuando realices una solicitud curl o visites el extremo de la URL de la función,

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

verás que se devuelve el color beige.

<html><body style="background-color:beige;"><div><p>Hello gradual-rollouts-gcf-00001-hos</p></div></body></html>

Obtén más información sobre las reversiones en los documentos.

6. ¡Felicitaciones!

¡Felicitaciones por completar el codelab!

Recomendamos revisar la documentación sobre lanzamientos, reversiones y migración de tráfico.

Temas abordados

  • Cómo dividir el tráfico entre dos o más revisiones de una función de Cloud Run
  • Cómo lanzar una revisión nueva de forma gradual
  • Cómo realizar una reversión a una revisión anterior

7. Limpia

Para evitar cargos involuntarios (por ejemplo, si esta función de Cloud Run se invoca de forma involuntaria más veces que tu asignación mensual de invocación de Cloud Function en el nivel gratuito), puedes borrar la función de Cloud Run o borrar el proyecto que creaste en el paso 2.

Para borrar una función de Cloud Run implementada en Cloud Run, ve a Cloud Run en la consola de Cloud en https://console.cloud.google.com/functions/ y borra las funciones que creaste en este codelab.

Para borrar las funciones de Cloud Run implementadas como funciones de 2ª gen., ve a Cloud Functions en la consola de Cloud en https://console.cloud.google.com/functions/ y borra las funciones que creaste en este codelab.

Si decides borrar el proyecto completo, puedes ir a https://console.cloud.google.com/cloud-resource-manager, seleccionar el proyecto que creaste en el paso 2 y elegir Borrar. Si borras el proyecto, deberás cambiar los proyectos en tu SDK de Cloud. Para ver la lista de todos los proyectos disponibles, ejecuta gcloud projects list.