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

1. Introducción

Descripción general

Las revisiones de Cloud Run te permiten especificar qué revisiones deben recibir tráfico y qué porcentaje de tráfico se debe enviar a cada 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 tu servicio de Cloud Run. Puedes obtener 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 un servicio de Cloud Run
  • Cómo lanzar una nueva revisión 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 un servicio de Cloud Run. Por ejemplo, puedes seguir los pasos para implementar un servicio de Cloud Run para comenzar.

Configura variables de entorno

Puedes establecer variables de entorno que se usarán a lo largo de este codelab.

PROJECT_ID=YOUR-PROJECT-ID
REGION=YOUR_REGION

BG_COLOR=darkseagreen
SERVICE_NAME=traffic-revisions-color
AR_REPO=traffic-revisions-color-repo

Crea un repositorio de Artifact Registry para el servicio

gcloud artifacts repositories create $AR_REPO \
    --repository-format=docker \
    --location=$REGION \
    --description="codelab for finetuning using CR jobs" \
    --project=$PROJECT_ID

3. División del tráfico

En este ejemplo, se muestra cómo crear un servicio de Cloud Run 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 Python, puedes usar cualquier entorno de ejecución.

Configura variables de entorno

Puedes establecer variables de entorno que se usarán a lo largo de este codelab.

REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen
SERVICE_NAME=traffic-revisions-color
AR_REPO=traffic-revisions-color-repo

Cómo crear el servicio

Primero, crea un directorio para el código fuente y, luego, usa el comando cd para acceder a él.

mkdir traffic-revisions-codelab && cd $_

Luego, crea un archivo main.py con el siguiente contenido:

import os
from flask import Flask, render_template_string

app = Flask(__name__)

TEMPLATE = """
<!doctype html>
<html lang="en">
<head>
    <title>Cloud Run Traffic Revisions</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 50vh;
            background-color: {{ bg_color }}; /* Set by environment variable */
            font-family: sans-serif;
        }
        .content {
            background-color: rgba(255, 255, 255, 0.8); /* Semi-transparent white background */
            padding: 2em;
            border-radius: 8px;
            text-align: center;
            box-shadow: 0 4px 8px rgba(0,0,0,0.1);
        }
    </style>
</head>
<body>
    <div class="content">
        <p>background color: <strong>{{ color_name }}</strong></p>
    </div>
</body>
</html>
"""

@app.route('/')
def main():
    """Serves the main page with a background color from the ENV."""
    # Get the color from the 'BG_COLOR' environment variable.
    # Default to 'white' if the variable is not set.
    color = os.environ.get('BG_COLOR', 'white').lower()

    return render_template_string(TEMPLATE, bg_color=color, color_name=color)

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8080))
    app.run(debug=True, host='0.0.0.0', port=port)

A continuación, crea un archivo requirements.txt con el siguiente contenido:

Flask>=2.0.0
gunicorn>=20.0.0

Por último, crea un Dockerfile.

FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8080

ENV PYTHONPATH /app

CMD ["gunicorn", "--bind", "0.0.0.0:8080", "main:app"]

Crea la imagen en Artifact Registry con Buildpacks a través de Cloud Build:

gcloud builds submit \
   --tag $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME

Implementa la primera revisión en Cloud Run con el color darkseagreen:

gcloud run deploy $SERVICE_NAME \
    --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
    --region $REGION \
    --allow-unauthenticated \
    --set-env-vars BG_COLOR=darkseagreen

Para probar el servicio, puedes abrir el extremo directamente en tu navegador web para ver el color de fondo verde mar oscuro.

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

# update the env var
BG_COLOR=tan

gcloud run deploy $SERVICE_NAME \
    --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
    --region $REGION \
    --set-env-vars BG_COLOR=tan

Ahora, cuando actualices el sitio web, verás el color de fondo tostado.

Divide el tráfico en partes iguales

Para dividir el tráfico entre las revisiones verde mar profundo y tostado, debes encontrar los IDs de revisión de los servicios subyacentes de Cloud Run. Puedes ver los IDs de revisión si ejecutas este comando:

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

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

traffic-revisions-color-00003-qoq
traffic-revisions-color-00002-zag

Puedes dividir el tráfico 50/50 entre las dos revisiones ejecutando el siguiente comando con tus revisiones:

gcloud run services update-traffic $SERVICE_NAME \
  --region $REGION \
  --to-revisions YOUR_REVISION_1=50,YOUR_REVISION_2=50

Prueba la división del tráfico

Para probar el servicio, actualiza la página en tu navegador.

La mitad del tiempo, deberías ver la revisión de color verde mar oscuro y, la otra mitad, la revisión de color tostado. 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-revisions-color-00003-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 Service. 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 un nuevo servicio de Cloud Run.

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

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-colors \
      --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
      --region $REGION \
      --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 beige para que reciba el 100% del tráfico. Esto garantizará que tus revisiones futuras no reciban tráfico. De forma predeterminada, Cloud Run establece el 100% del tráfico en la revisión con la marca latest. Si especificas manualmente que esta revisión actual beige 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-colors \
  --region $REGION --format 'value(REVISION)')

# now set 100% traffic to that revision

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

Verás un resultado similar a Traffic: 100% radual-rollouts-colors-00001-yox

Ahora puedes implementar una revisión nueva que no recibirá tráfico. En lugar de realizar 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-colors \
      --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
      --region $REGION \
      --allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

Ahora, cuando visites el sitio web en tu navegador, verás el color beige, aunque la revisión implementada más recientemente fue la lavanda.

Prueba una revisión que no publique 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, aún quieres 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 la revisión más reciente (que es lavanda).

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

Ahora etiqueta esa imagen con el color asociado.

gcloud run deploy gradual-rollouts-colors --image $IMAGE_URL_LAVENDER --no-traffic --tag $BG_COLOR --region $REGION

Verás un resultado similar al siguiente:

The revision can be reached directly at https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app

Ahora, cuando visites esa URL de revisión específica, verás el color lavanda.

Aumento gradual del tráfico

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

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

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

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

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

Traffic:
  50% gradual-rollouts-colors-00001-hos
  50% gradual-rollouts-colors-00004-mum
        lavender: https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app

Cuando esté todo listo para lanzar la versión completa de lavanda, puedes establecerla en un 100% para reemplazar el color beige.

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

Ahora, cuando visites el sitio web, solo verás el color lavanda.

5. Reversiones

Supongamos que recibiste comentarios iniciales sobre la UX que indican que los clientes prefieren el color beige al lavanda, y necesitas revertir el color a beige.

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

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

y ahora, cuando visites el sitio web, verás el color beige como color de fondo.

Puedes obtener más información sobre las reversiones en la documentación.

6. ¡Felicitaciones!

¡Felicitaciones por completar el codelab!

Te recomendamos que revises 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 un servicio de Cloud Run
  • Cómo lanzar una nueva revisión de forma gradual
  • Cómo revertir a una revisión anterior

7. Limpia

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

Para borrar un servicio de Cloud Run, ve a Cloud Run en Cloud Console en https://console.cloud.google.com/run/ y borra las funciones que creaste en este codelab.

Si decides borrar todo el proyecto, 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 de proyecto en el SDK de Cloud. Para ver la lista de todos los proyectos disponibles, ejecuta gcloud projects list.