Encaminamiento de eventos entre proyectos de Google Cloud

En este tutorial se muestra cómo usar Eventarc para leer eventos de una fuente de un proyecto Google Cloud y dirigirlos a un destino de otro proyecto Google Cloud . Para ello, puedes usar Pub/Sub como capa de transporte entre proyectos.

Encaminar eventos de Pub/Sub entre proyectos

Como Pub/Sub es un servicio distribuido a nivel mundial, puedes crear un tema en un proyecto, publicar en ese tema desde otro proyecto y, a continuación, activar Eventarc, que enruta el mensaje a un servicio de Cloud Run:

Eventos entre proyectos: Cloud Pub/Sub y Eventarc

  1. Define el Google Cloud ID de proyecto de tu segundo proyecto:

    gcloud config set project PROJECT_TWO_ID

    Sustituye PROJECT_TWO_ID por el ID de tu segundo proyectoGoogle Cloud .

  2. En el segundo proyecto, haz lo siguiente:

    1. Habilita las APIs Cloud Run y Eventarc:

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

      REGION=REGION

      Sustituye REGION por la ubicación de Eventarc que quieras. Por ejemplo, us-central1.

    3. Crea un tema de Pub/Sub:

      TOPIC=my-topic
      gcloud pubsub topics create $TOPIC
    4. Despliega un servicio de Cloud Run sin autenticar con una imagen prediseñada: us-docker.pkg.dev/cloudrun/container/hello

      gcloud run deploy hello \
          --image=us-docker.pkg.dev/cloudrun/container/hello \
          --allow-unauthenticated \
          --region=$REGION

      Cuando veas la URL del servicio, el despliegue se habrá completado.

    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

      De esta forma, se crea un activador llamado cross-project-trigger.

  3. Define el Google Cloud ID de proyecto de tu primer proyecto:

    gcloud config set project PROJECT_ONE_ID

    Sustituye PROJECT_ONE_ID por el ID de tu primerGoogle Cloud proyecto.

  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. Define el Google Cloud ID de proyecto de tu segundo proyecto:

    gcloud config set project PROJECT_TWO_ID
  6. En el segundo proyecto, compruebe que se ha registrado el evento generado:

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

    Se devuelve una entrada de registro similar a la siguiente:

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

Encaminar eventos de Cloud Storage entre proyectos

Usa las notificaciones de Pub/Sub en Cloud Storage para publicar eventos de un proyecto a otro y, a continuación, enruta los eventos a un servicio de Cloud Run mediante un activador de Eventarc:

Eventos entre proyectos: Cloud Storage y Eventarc

  1. Define el Google Cloud ID de proyecto de tu primer proyecto:

    gcloud config set project PROJECT_ONE_ID
  2. Crea un segmento de Cloud Storage:

    PROJECT1=$(gcloud config get-value project)
    BUCKET=$PROJECT1-cross-project
    gcloud storage buckets create gs://$BUCKET --location=${REGION}
  3. Crea una notificación de Pub/Sub para el segmento en el tema de tu segundo proyecto:

    gcloud storage buckets notifications create gs://$BUCKET --topic=projects/PROJECT_TWO_ID/topics/$TOPIC --payload-format=json
  4. Sube un archivo al segmento:

    echo "Hello World" > random.txt
    gcloud storage cp random.txt gs://$BUCKET/random.txt
  5. Define el Google Cloud ID de proyecto de tu segundo proyecto:

    gcloud config set project PROJECT_TWO_ID
  6. En el segundo proyecto, compruebe que se ha registrado el evento generado:

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

    Se devuelve 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",
    [...]
    }

Enrutar 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 coincida con los criterios de filtro del activador. Para obtener más información, consulta Determinar filtros de eventos para 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 coincida con los criterios de filtro del activador te permite capturar y enrutar un evento a un servicio de Cloud Run en el segundo proyecto:

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

  1. Define el Google Cloud ID de proyecto de tu primer proyecto:

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

    Ten en cuenta que, a nivel de proyecto, necesitas el roles/owner rol Gestión de Identidades y Accesos (IAM) para configurar los registros de auditoría de acceso a datos de tus recursos. Google Cloud

    1. Lee la política de gestión de identidades y accesos de tu proyecto y guárdala en un archivo:

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

      auditConfigs:
      - auditLogConfigs:
        - logType: ADMIN_READ
        - logType: DATA_READ
        - logType: DATA_WRITE
        service: compute.googleapis.com
      
    3. Escribe la nueva política de gestión de identidades y accesos:

      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, empezando 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"'

    Debería aparecer 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. Define el Google Cloud ID de proyecto de tu segundo proyecto:

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

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

    Sustituye SERVICE_ACCOUNT por la dirección de correo de la cuenta de servicio que has obtenido en el paso anterior.

  6. Define el Google Cloud ID de proyecto de 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 Google Cloud consola para crear la instancia de VM, puedes aceptar los valores predeterminados en este tutorial.

  8. Define el Google Cloud ID de proyecto de tu segundo proyecto:

    gcloud config set project PROJECT_TWO_ID
  9. En el segundo proyecto, compruebe que se ha registrado el evento generado:

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

    Se devuelve 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",
      }
    [...]
    }