En este instructivo, se muestra cómo usar Eventarc para leer eventos de una fuente en un proyecto Google Cloud y enrutarlos a un destino de destino en otro proyecto Google Cloud . Esto es posible mediante el uso de Pub/Sub como una capa de transporte entre proyectos.
Enruta eventos de Pub/Sub entre 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:
Establece el ID del proyecto Google Cloud en tu segundo proyecto:
gcloud config set project PROJECT_TWO_ID
Reemplaza
PROJECT_TWO_ID
por el ID de tu segundo proyecto deGoogle Cloud .En tu segundo proyecto, haz lo siguiente:
Habilita las API de Cloud Run y de Eventarc:
gcloud services enable run.googleapis.com eventarc.googleapis.com
Establece la ubicación predeterminada:
REGION=REGION
Reemplaza
REGION
por la ubicación de Eventarc compatible que prefieras. Por ejemplo,us-central1
.Crea un tema de Pub/Sub:
TOPIC=my-topic gcloud pubsub topics create $TOPIC
Implementa un servicio de Cloud Run no autenticado con una imagen compilada con anterioridad,
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, se completará la implementación.
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
.
Configura el ID del proyecto Google Cloud en tu primer proyecto:
gcloud config set project PROJECT_ONE_ID
Reemplaza
PROJECT_ONE_ID
por el ID de tu primer proyecto.Google CloudEn tu primer proyecto, publica un mensaje en el tema del segundo proyecto:
gcloud pubsub topics publish projects/PROJECT_TWO_ID/topics/$TOPIC --message="hello"
Establece el ID del proyecto Google Cloud en tu segundo proyecto:
gcloud config set project PROJECT_TWO_ID
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:
Configura el ID del proyecto Google Cloud en tu primer proyecto:
gcloud config set project PROJECT_ONE_ID
Crea un bucket de Cloud Storage:
PROJECT1=$(gcloud config get-value project) BUCKET=$PROJECT1-cross-project gcloud storage buckets create gs://$BUCKET --location=${REGION}
Crea una notificación de Pub/Sub para el bucket al tema en tu segundo proyecto:
gcloud storage buckets notifications create gs://$BUCKET --topic=projects/PROJECT_TWO_ID/topics/$TOPIC --payload-format=json
Sube un archivo al bucket:
echo "Hello World" > random.txt gcloud storage cp random.txt gs://$BUCKET/random.txt
Establece el ID del proyecto Google Cloud en tu segundo proyecto:
gcloud config set project PROJECT_TWO_ID
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:
Configura el ID del proyecto Google Cloud en tu primer proyecto:
gcloud config set project PROJECT_ONE_ID
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 del proyecto, necesitas el rol de
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 .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
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
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.
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.
Establece el ID del proyecto Google Cloud en tu segundo proyecto:
gcloud config set project PROJECT_TWO_ID
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.Configura el ID del proyecto Google Cloud en tu primer proyecto:
gcloud config set project PROJECT_ONE_ID
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.
Establece el ID del proyecto Google Cloud en tu segundo proyecto:
gcloud config set project PROJECT_TWO_ID
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", } [...] }