En este tutorial se explica cómo solucionar los errores de tiempo de ejecución que se producen al usar Eventarc para enrutar eventos de Cloud Storage a un servicio de Cloud Run sin autenticar mediante registros de auditoría de Cloud.
Objetivos
En este tutorial se explica cómo completar las siguientes tareas:
- Crea un repositorio estándar de Artifact Registry para almacenar tu imagen de contenedor.
- Crea un segmento de Cloud Storage que será la fuente de eventos.
- Compila, sube y despliega una imagen de contenedor en Cloud Run.
- Crea activadores de Eventarc.
- Suba un archivo al depósito de Cloud Storage.
- Soluciona los errores de tiempo de ejecución.
Costes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Antes de empezar
Es posible que las restricciones de seguridad definidas por tu organización te impidan completar los siguientes pasos. Para obtener información sobre cómo solucionar problemas, consulta el artículo Desarrollar aplicaciones en un entorno limitado Google Cloud .
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com -
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com -
Si has creado el proyecto, se te asignará el rol básico Propietario (
roles/owner
). De forma predeterminada, este rol de gestión de identidades y accesos (IAM) incluye los permisos necesarios para acceder por completo a la mayoría de los recursos Google Cloud, por lo que puedes saltarte este paso.Si no eres el creador del proyecto, debes conceder los permisos necesarios al principal correspondiente. Por ejemplo, una entidad principal puede ser una cuenta de Google (para usuarios finales) o una cuenta de servicio (para aplicaciones y cargas de trabajo de computación). Para obtener más información, consulta la página Roles y permisos de tu destino de evento.
Ten en cuenta que, de forma predeterminada, los permisos de Cloud Build incluyen permisos para subir y descargar artefactos de Artifact Registry.
Permisos obligatorios
Para obtener los permisos que necesitas para completar este tutorial, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en tu proyecto:
-
Editor de Cloud Build (
roles/cloudbuild.builds.editor
) -
Administrador de Cloud Run (
roles/run.admin
) -
Administrador de Eventarc (
roles/eventarc.admin
) -
Usuario con permiso para ver registros (
roles/logging.viewAccessor
) -
Administrador de gestión de identidades y accesos del proyecto (
roles/resourcemanager.projectIamAdmin
) -
Administrador de cuentas de servicio (
roles/iam.serviceAccountAdmin
) -
Usuario de cuenta de servicio (
roles/iam.serviceAccountUser
) -
Administrador de Uso de Servicio (
roles/serviceusage.serviceUsageAdmin
) -
Administrador de almacenamiento (
roles/storage.admin
)
Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.
También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.
-
Editor de Cloud Build (
- En Cloud Storage, habilita el registro de auditoría para los tipos de acceso a datos
ADMIN_READ
,DATA_WRITE
yDATA_READ
.- Lee la política de gestión de identidades y accesos (IAM) asociada a tu Google Cloud proyecto, carpeta u organización y guárdala en un archivo temporal:
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
- En un editor de texto, abre
/tmp/policy.yaml
y añade o cambia solo la configuración del registro de auditoría en la secciónauditConfigs
: .auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_WRITE - logType: DATA_READ service: storage.googleapis.com bindings: - members: [...] etag: BwW_bHKTV5U= version: 1
- Escribe la nueva política de gestión de identidades y accesos:
gcloud projects set-iam-policy PROJECT_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. Para obtener más información, consulta el artículo sobre cómo configurar registros de auditoría de acceso a datos con la API.
- Lee la política de gestión de identidades y accesos (IAM) asociada a tu Google Cloud proyecto, carpeta u organización y guárdala en un archivo temporal:
- Asigna el rol
eventarc.eventReceiver
a la cuenta de servicio de Compute Engine:export PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')" gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \ --role='roles/eventarc.eventReceiver'
- Si habilitaste la cuenta de servicio de Pub/Sub el 8 de abril del 2021 o antes, otorga el rol
iam.serviceAccountTokenCreator
a la cuenta de servicio de Pub/Sub:gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"\ --role='roles/iam.serviceAccountTokenCreator'
- Define los valores predeterminados que se usarán en este tutorial:
export REGION=us-central1 gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
Crea un segmento en
us-east1
:export BUCKET1="troubleshoot-bucket1-PROJECT_ID" gcloud storage buckets create gs://${BUCKET1} --location=us-east1
Crea un segmento en
us-west1
:export BUCKET2="troubleshoot-bucket2-PROJECT_ID" gcloud storage buckets create gs://${BUCKET2} --location=us-west1
Para obtener el código de muestra, clona el repositorio de GitHub:
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git cd golang-samples/eventarc/audit_storage
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git cd java-docs-samples/eventarc/audit-storage
.NET
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git cd dotnet-docs-samples/eventarc/audit-storage
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git cd nodejs-docs-samples/eventarc/audit-storage
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git cd python-docs-samples/eventarc/audit-storage
Revisa el código de este tutorial, que consta de lo siguiente:
Un controlador de eventos que recibe el evento entrante como un CloudEvent en la solicitud HTTP
POST
:Go
Java
.NET
Node.js
Python
Un servidor que usa el controlador de eventos:
Go
Java
.NET
Node.js
Python
Un archivo Dockerfile que define el entorno operativo del servicio. El contenido del Dockerfile varía según el idioma:
Go
Java
.NET
Node.js
Python
Crea tu imagen de contenedor con Cloud Build y súbela a Artifact Registry:
export PROJECT_ID=$(gcloud config get-value project) export SERVICE_NAME=troubleshoot-service gcloud builds submit --tag $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1
Despliega la imagen de contenedor en Cloud Run:
gcloud run deploy ${SERVICE_NAME} \ --image $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1 \ --allow-unauthenticated
Si la implementación se realiza correctamente, la línea de comandos muestra la URL del servicio.
Crea un activador de Eventarc para detectar eventos de Cloud Storage que se enrutan mediante Registros de auditoría de Cloud:
gcloud eventarc triggers create troubleshoot-trigger \ --destination-run-service=troubleshoot-service \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
De esta forma, se crea un activador llamado
troubleshoot-trigger
.Para confirmar que se ha creado
troubleshoot-trigger
, ejecuta el siguiente comando:gcloud eventarc triggers list
La salida debería ser similar a la siguiente:
NAME: troubleshoot-trigger TYPE: google.cloud.audit.log.v1.written DESTINATION: Cloud Run service: troubleshoot-service ACTIVE: By 20:03:37 LOCATION: us-central1
Crea y sube un archivo al
BUCKET1
segmento de almacenamiento:echo "Hello World" > random.txt gcloud storage cp random.txt gs://${BUCKET1}/random.txt
Monitoriza los registros para comprobar si el servicio ha recibido un evento. Para ver la entrada del registro, sigue estos pasos:
Filtra las entradas de registro y devuelve el resultado en formato JSON:
gcloud logging read "resource.labels.service_name=troubleshoot-service \ AND textPayload:random.txt" \ --format=json
Busca una entrada de registro similar a la siguiente:
"textPayload": "Detected change in Cloud Storage bucket: ..."
En la Google Cloud consola, ve a la página Registros de auditoría.
- Seleccione la casilla Google Cloud Storage.
- Asegúrate de que estén seleccionados los tipos de registro Actividad de administración, Lectura de datos y Escritura de datos.
Confirma la ubicación del activador:
gcloud eventarc triggers describe troubleshoot-trigger
Define la ubicación y la región en
us-east1
:gcloud config set eventarc/location us-east1 gcloud config set run/region us-east1
Vuelve a desplegar el receptor de eventos creando y desplegando la imagen de contenedor en Cloud Run.
Crea un activador en
us-east1
:gcloud eventarc triggers create troubleshoot-trigger-new \ --destination-run-service=troubleshoot-service \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
Comprueba que se haya creado el activador:
gcloud eventarc triggers list
Un activador puede tardar hasta dos minutos en inicializarse antes de empezar a enrutar eventos.
Para confirmar que el activador se ha implementado correctamente, genera y consulta un evento.
Verifica que la fuente esté generando eventos. Consulta los registros de auditoría de Cloud y comprueba que el servicio monitorizado emite registros. Si se registran los registros, pero no se envían los eventos, ponte en contacto con el equipo de Asistencia.
Verifica que exista un tema de Pub/Sub con el mismo nombre de activador. Eventarc usa Pub/Sub como capa de transporte y utilizará un tema de Pub/Sub que ya exista o creará uno automáticamente y lo gestionará por ti.
- Para ver una lista de los activadores, consulta
gcloud eventarc triggers list
. Para enumerar los temas de Pub/Sub, ejecuta el siguiente comando:
gcloud pubsub topics list
Comprueba que el nombre del tema de Pub/Sub incluya el nombre del activador creado. Por ejemplo:
name: projects/PROJECT_ID/topics/eventarc-us-east1-troubleshoot-trigger-new-123
Si falta el tema de Pub/Sub, vuelve a crear el activador para un proveedor, un tipo de evento y un destino de Cloud Run específicos.
- Para ver una lista de los activadores, consulta
Comprueba que el activador se haya configurado para el servicio.
En la Google Cloud consola, ve a la página Servicios.
Haz clic en el nombre del servicio para abrir su página Detalles del servicio.
Haz clic en la pestaña Activadores.
Debería aparecer el activador de Eventarc asociado al servicio.
Verifica el estado del tema y la suscripción de Pub/Sub mediante los tipos de métricas de Pub/Sub.
Puedes monitorizar los mensajes no entregados reenviados con la métrica
subscription/dead_letter_message_count
. Esta métrica muestra el número de mensajes que no se pueden entregar y que Pub/Sub reenvía desde una suscripción.Si no se publican mensajes en el tema, consulta Cloud Audit Logs y asegúrate de que el servicio monitorizado emite registros. Si se registran los registros, pero no se envían los eventos, ponte en contacto con el equipo de Asistencia.
Puede monitorizar las suscripciones push con la métrica
subscription/push_request_count
y agrupando la métrica porresponse_code
ysubcription_id
.Si se notifican errores de envío, consulta los registros del servicio Cloud Run. Si el endpoint receptor devuelve un código de estado distinto de OK, significa que el código de Cloud Run no funciona como se esperaba y debes ponerte en contacto con el equipo de Asistencia.
Para obtener más información, consulta Crear políticas de alertas de umbral de métricas.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Elimina el servicio de Cloud Run que has desplegado en este tutorial:
gcloud run services delete SERVICE_NAME
Donde
SERVICE_NAME
es el nombre del servicio que has elegido.También puedes eliminar servicios de Cloud Run desde la Google Cloud consola.
Elimina las configuraciones predeterminadas de la CLI de gcloud que hayas añadido durante la configuración del tutorial.
Por ejemplo:
gcloud config unset run/region
o
gcloud config unset project
Elimina otros recursos de Google Cloud que hayas creado en este tutorial:
- Elimina el activador de Eventarc:
Sustituyegcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
por el nombre de tu activador.
- Elimina el activador de Eventarc:
Crear un repositorio estándar de Artifact Registry
Crea un repositorio estándar de Artifact Registry para almacenar tu imagen de contenedor:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
Sustituye REPOSITORY
por un nombre único para el repositorio.
Crea un segmento de Cloud Storage
Crea un segmento de Cloud Storage en cada una de las dos regiones como origen de eventos del servicio de Cloud Run:
Una vez que se haya creado el origen del evento, despliega el servicio de receptor de eventos en Cloud Run.
Implementar el receptor de eventos
Despliega un servicio de Cloud Run que recibe y registra eventos.
Crear activador
Después de implementar un servicio de Cloud Run, configura un activador para que detecte eventos de Cloud Storage a través de los registros de auditoría.
Generar y ver un evento
Confirma que has desplegado el servicio correctamente y que puedes recibir eventos de Cloud Storage.
Ten en cuenta que, al principio, no se devuelve ninguna entrada de registro. Esto indica que hay un problema en la configuración que debes investigar.
Investigar el problema
Sigue el proceso para investigar por qué el servicio no recibe eventos.
Tiempo de inicialización
Aunque el activador se crea inmediatamente, puede tardar hasta dos minutos en propagarse y filtrar eventos. Ejecuta el siguiente comando para confirmar que un activador está activo:
gcloud eventarc triggers list
El resultado indica el estado del activador. En el siguiente ejemplo, troubleshoot-trigger
se activará a las 14:16:56:
NAME TYPE DESTINATION_RUN_SERVICE ACTIVE
troubleshoot-trigger google.cloud.audit.log.v1.written troubleshoot-service By 14:16:56
Una vez que el activador esté activo, vuelve a subir un archivo al bucket de almacenamiento. Los eventos se escriben en los registros de servicio de Cloud Run. Si el servicio no recibe eventos, puede deberse al tamaño de los eventos.
Registros de auditoría
En este tutorial, los eventos de Cloud Storage se enrutan mediante registros de auditoría de Cloud y se envían a Cloud Run. Confirma que los registros de auditoría estén habilitados en Cloud Storage.
Una vez que hayas habilitado los registros de auditoría de Cloud, vuelve a subir el archivo al segmento de almacenamiento y consulta los registros. Si el servicio sigue sin recibir eventos, puede que el problema esté relacionado con la ubicación del activador.
Ubicación de activación
Puede haber varios recursos en diferentes ubicaciones y debe filtrar los eventos de las fuentes que se encuentren en la misma región que el destino de Cloud Run. Para obtener más información, consulta las ubicaciones compatibles con Eventarc y el artículo ¿Qué son las ubicaciones de Eventarc?
En este tutorial, has desplegado el servicio de Cloud Run en us-central1
. Como has definido eventarc/location
en us-central1
, también has creado un activador en la misma ubicación.
Sin embargo, has creado dos segmentos de Cloud Storage en las ubicaciones us-east1
y us-west1
. Para recibir eventos de esas ubicaciones, debe crear activadores de Eventarc en ellas.
Crea un activador de Eventarc ubicado en us-east1
:
Otros problemas que pueden surgir
Puede que tengas otros problemas al usar Eventarc.
Tamaño del evento
Los eventos que envíe no deben superar los límites de tamaño de evento.
Un activador que antes enviaba eventos ha dejado de funcionar
Limpieza
Si has creado un proyecto para este tutorial, elimínalo. Si has usado un proyecto y quieres conservarlo sin los cambios añadidos en este tutorial, elimina los recursos creados para el tutorial.
Eliminar el proyecto
La forma más fácil de evitar que te cobren es eliminar el proyecto que has creado para el tutorial.
Para ello, sigue las instrucciones que aparecen a continuación: