Enruta eventos en los proyectos de Google Cloud


En este instructivo, se muestra cómo usar Eventarc para leer eventos de una fuente en un proyecto de Google Cloud y enrutarlos a un destino de destino en otro proyecto de Google Cloud. Esto es posible mediante el uso de Pub/Sub como una capa de transporte entre proyectos.

Objetivos

En este instructivo, podrás:

  1. Crear un tema en un proyecto y, luego, publica en ese tema desde otro. Esto enruta los eventos a un servicio de Cloud Run no autenticado mediante un activador de Eventarc

  2. Usar las notificaciones de Pub/Sub para que Cloud Storage publique eventos de Cloud Storage de un proyecto a otro. Enruta los eventos a un servicio no autenticado de Cloud Run mediante un activador de Eventarc

  3. Usar receptores de Cloud Logging para publicar los registros de auditoría de Cloud de un proyecto a otro. Enruta los eventos a un servicio no autenticado de Cloud Run mediante un activador de Eventarc

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.

Antes de comenzar

Es posible que las restricciones de seguridad que define tu organización no te permitan completar los siguientes pasos. Para obtener información sobre la solución de problemas, consulta Desarrolla aplicaciones en un entorno de Google Cloud restringido.

Ten en cuenta que necesitarás dos proyectos para este instructivo. Los siguientes pasos se aplican a ambos proyectos.

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Instala Google Cloud CLI.
  5. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  6. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  7. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  8. Instala Google Cloud CLI.
  9. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  10. Actualiza los componentes de gcloud:
    gcloud components update
  11. Accede con tu cuenta:
    gcloud auth login

Enruta eventos de Pub/Sub en proyectos

Debido a que Pub/Sub es un servicio distribuido a nivel global, puedes crear un tema en un proyecto, publicar en ese tema desde otro proyecto y, luego, activar Eventarc, que enruta el mensaje a un servicio de Cloud Run:

Eventos entre proyectos: Cloud Pub/Sub y Eventarc

  1. Establece el ID del proyecto de Google Cloud en tu segundo proyecto:

    gcloud config set project PROJECT_TWO_ID
    

    Reemplaza PROJECT_TWO_ID por el ID de tu segundo proyecto de Google Cloud.

  2. En tu segundo proyecto, haz lo siguiente:

    1. Habilita las API de Cloud Run y de Eventarc:

      gcloud services enable run.googleapis.com eventarc.googleapis.com
      
    2. Establece la ubicación predeterminada:

      REGION=REGION
      

      Reemplaza REGION por la ubicación de Eventarc compatible que prefieras. Por ejemplo, us-central1.

    3. Crea un tema de Pub/Sub:

      TOPIC=my-topic
      gcloud pubsub topics create $TOPIC
      
    4. Implementa un servicio de Cloud Run no autenticado:

      gcloud run deploy hello \
          --image=gcr.io/cloudrun/hello \
          --allow-unauthenticated \
          --region=$REGION
      

      Cuando veas la URL del servicio, se completará la implementación.

    5. Conecta el tema al servicio con un activador de Eventarc:

      gcloud eventarc triggers create cross-project-trigger \
          --destination-run-service=hello \
          --destination-run-region=${REGION} \
          --location=${REGION} \
          --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
          --transport-topic=projects/PROJECT_TWO_ID/topics/$TOPIC
      

      Esto crea un activador llamado cross-project-trigger.

  3. Configura el ID del proyecto de Google Cloud como tu primer proyecto:

    gcloud config set project PROJECT_ONE_ID
    

    Reemplaza PROJECT_ONE_ID por el ID de tu primer proyecto de Google Cloud.

  4. En tu primer proyecto, publica un mensaje en el tema del segundo proyecto:

    gcloud pubsub topics publish projects/PROJECT_TWO_ID/topics/$TOPIC --message="hello"
    
  5. Establece el ID del proyecto de Google Cloud en tu segundo proyecto:

    gcloud config set project PROJECT_TWO_ID
    
  6. En el segundo proyecto, confirma que se registró el evento generado:

    gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:hello" --format=json
    

    Se mostrará una entrada de registro similar a la siguiente:

    "message": "Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: hello"
    

Enruta eventos de Cloud Storage entre proyectos

Usa las notificaciones de Pub/Sub para Cloud Storage a fin de publicar eventos de un proyecto a otro y, luego, enrutar los eventos a un servicio de Cloud Run mediante un activador de Eventarc:

Eventos entre proyectos: Cloud Storage y Eventarc

  1. Configura el ID del proyecto de Google Cloud como tu primer proyecto:

    gcloud config set project PROJECT_ONE_ID
    
  2. Cree un bucket de Cloud Storage:

    PROJECT1=$(gcloud config get-value project)
    BUCKET=$PROJECT1-cross-project
    gsutil mb -l $REGION gs://$BUCKET
    
  3. Crea una notificación de Pub/Sub para el bucket al tema en tu segundo proyecto:

    gsutil notification create -t projects/PROJECT_TWO_ID/topics/$TOPIC -f json gs://$BUCKET
    
  4. Sube un archivo al bucket:

    echo "Hello World" > random.txt
    gsutil cp random.txt gs://$BUCKET/random.txt
    
  5. Establece el ID del proyecto de Google Cloud en tu segundo proyecto:

    gcloud config set project PROJECT_TWO_ID
    
  6. En el segundo proyecto, confirma que se registró el evento generado:

    gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:random.txt" --format=json
    

    Se mostrará una entrada de registro similar a la siguiente:

    Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: {
      "kind": "storage#object",
      "id": "project1-cross-project/random.txt/1635327604259719",
      "selfLink": "https://www.googleapis.com/storage/v1/b/project1-cross-project/o/random.txt",
      "name": "random.txt",
      "bucket": "project1-cross-project",
      "generation": "1635327604259719",
    [...]
    }
    

Enruta eventos de registros de auditoría de Cloud entre proyectos

Las solicitudes a tu servicio se pueden activar cuando se crea una entrada de registro de auditoría que coincide con los criterios de filtro del activador. Si deseas obtener más información, consulta Determina los filtros de eventos para los Registros de auditoría de Cloud. En este caso, cuando se crea una instancia de VM de Compute Engine en tu primer proyecto, una entrada de registro de auditoría que coincide con los criterios de filtro del activador te permite captar y enrutar un evento a un servicio de Cloud Run en el segundo proyecto:

Eventos entre proyectos: Eventarc y Registros de auditoría de Cloud

  1. Configura el ID del proyecto de Google Cloud como tu primer proyecto:

    gcloud config set project PROJECT_ONE_ID
    
  2. En tu primer proyecto, habilita los tipos de registro Lectura de administrador, Lectura de datos y Escritura de datos para Compute Engine:

    Ten en cuenta que a nivel de proyecto, necesitas el rol roles/owner de Identity and Access Management (IAM) para configurar los registros de auditoría de acceso a los datos de tus recursos de Google Cloud.

    1. Lee la política de IAM de tu proyecto y almacénala en un archivo:

      gcloud projects get-iam-policy PROJECT_ONE_ID > /tmp/policy.yaml
      
    2. Edita /tmp/policy.yaml y agrega o cambia solo la configuración de los registros de auditoría de acceso a los datos.

      auditConfigs:
      - auditLogConfigs:
        - logType: ADMIN_READ
        - logType: DATA_READ
        - logType: DATA_WRITE
        service: compute.googleapis.com
      
    3. Escribe tu nueva política de IAM:

      gcloud projects set-iam-policy PROJECT_ONE_ID /tmp/policy.yaml
      

      Si el comando anterior informa de un conflicto con otro cambio, repite estos pasos y comienza por leer la política de IAM del proyecto.

  3. En tu primer proyecto, crea un receptor de Cloud Logging para enrutar los registros de auditoría de Cloud al tema de tu segundo proyecto:

    gcloud logging sinks create cross-project-sink \
        pubsub.googleapis.com/projects/PROJECT_TWO_ID/topics/my-topic \
        --log-filter='protoPayload.methodName="beta.compute.instances.insert"'
    

    Se debería mostrar un recordatorio similar al siguiente:

    Please remember to grant `serviceAccount:p1011272509317-375795@gcp-sa-logging.iam.gserviceaccount.com` the Pub/Sub Publisher role on the topic.
    
  4. Establece el ID del proyecto de Google Cloud en tu segundo proyecto:

    gcloud config set project PROJECT_TWO_ID
    
  5. En el segundo proyecto, otorga el rol a la cuenta de servicio:

    gcloud pubsub topics add-iam-policy-binding my-topic \
        --member=SERVICE_ACCOUNT \
        --role=roles/pubsub.publisher
    

    Reemplaza SERVICE_ACCOUNT por la dirección de correo electrónico de la cuenta de servicio que se mostró en el paso anterior.

  6. Configura el ID del proyecto de Google Cloud como tu primer proyecto:

    gcloud config set project PROJECT_ONE_ID
    
  7. En tu primer proyecto, crea una instancia de VM de Compute Engine.

    Si usas la consola de Google Cloud para crear la instancia de VM, puedes aceptar los valores predeterminados a los fines de este instructivo.

  8. Establece el ID del proyecto de Google Cloud en tu segundo proyecto:

    gcloud config set project PROJECT_TWO_ID
    
  9. En el segundo proyecto, confirma que se registró el evento generado:

    gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:beta.compute.instances.insert" --format=json
    

    Se mostrará una entrada de registro similar a la siguiente:

    Received event of type google.cloud.pubsub.topic.v1.messagePublished. Eventdata: {
      "logName": "projects/workflows-atamel/logs/cloudaudit.googleapis.com%2Factivity",
      "operation": {
        "id": "operation-1635330842489-5cf5321f4f454-ecc363cd-3883c08d",
        "last": true,
        "producer": "compute.googleapis.com"
      },
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "methodName": "beta.compute.instances.insert",
      }
    [...]
    }
    

Limpia

Si creaste un proyecto nuevo para este instructivo, bórralo. Si usaste un proyecto existente y deseas conservarlo sin los cambios que se agregaron en este instructivo, borra los recursos creados para el instructivo.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Elimina recursos de instructivos

  1. Usa este comando para borrar el servicio de Cloud Run que implementaste en este instructivo:

    gcloud run services delete SERVICE_NAME

    En el ejemplo anterior, SERVICE_NAME es el nombre del servicio que elegiste.

    También puedes borrar los servicios de Cloud Run desde la consola de Google Cloud.

  2. Quita todas las opciones de configuración predeterminadas de gcloud CLI que agregaste durante la configuración del instructivo.

    Por ejemplo:

    gcloud config unset run/region

    o

    gcloud config unset project

  3. Borra otros recursos de Google Cloud que creaste en este instructivo:

    • Borrar el activador de Eventarc:

      gcloud eventarc triggers delete TRIGGER_NAME
      
      Reemplaza TRIGGER_NAME por el nombre de tu activador.

    • Borra el tema de Pub/Sub:

      gcloud pubsub topics delete TOPIC TOPIC_ID
      
      Reemplaza TOPIC_ID por el ID de tu tema.

    • Borra el receptor de Cloud Logging:

      gcloud logging sinks delete SINK_NAME
      
      Reemplaza SINK_NAME por el nombre de tu receptor.

¿Qué sigue?