En este instructivo, aprenderás a solucionar errores del entorno de ejecución que se encuentran cuando usas 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 instructivo, se muestra cómo completar las siguientes tareas:
- Crea un repositorio estándar de Artifact Registry para almacenar tu imagen de contenedor.
- Crear un bucket de Cloud Storage para que sea la fuente del evento
- Compilar, subir y, luego, implementar una imagen de contenedor en Cloud Run.
- Crear activadores de Eventarc.
- Subir un archivo al bucket de Cloud Storage.
- Solucionar problemas y corregir errores de entorno de ejecución.
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.
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.
- 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.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
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.
-
-
Make sure 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:
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.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
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.
-
-
Make sure 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:
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 eres el creador del proyecto, se te otorga el rol de propietario básico (
roles/owner
). De forma predeterminada, este rol de Identity and Access Management (IAM) incluye los permisos necesarios para obtener acceso completo a la mayoría de los recursos de Google Cloud, pero puedes omitir este paso.Si no eres el creador del proyecto, se deben otorgar los permisos necesarios en el proyecto a la principal correspondiente. Por ejemplo, una principal puede ser una Cuenta de Google (para usuarios finales) o una cuenta de servicio (para aplicaciones y cargas de trabajo de procesamiento). Para obtener más información, consulta la página Roles y permisos para el destino del evento.
Ten en cuenta que, de forma predeterminada, los permisos de Cloud Build incluyen permisos para subir y descargar artefactos de Artifact Registry.
Permisos necesarios
Si quieres obtener los permisos que necesitas para completar este instructivo, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:
-
Editor de Cloud Build (
roles/cloudbuild.builds.editor
) -
Administrador de Cloud Run (
roles/run.admin
) -
Administrador de Eventarc (
roles/eventarc.admin
) -
Descriptor de acceso de vista de registros (
roles/logging.viewAccessor
) -
Administrador de IAM de proyecto (
roles/resourcemanager.projectIamAdmin
) -
Administrador de cuenta de servicio (
roles/iam.serviceAccountAdmin
) -
Usuario de cuenta de servicio (
roles/iam.serviceAccountUser
) -
Administrador de Service Usage (
roles/serviceusage.serviceUsageAdmin
) -
Administrador de almacenamiento (
roles/storage.admin
)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.
-
Editor de Cloud Build (
- En Cloud Storage, habilita el registro de auditoría para los tipos de acceso a los datos
ADMIN_READ
,DATA_WRITE
yDATA_READ
.- Lee la política de Identity and Access Management (IAM) asociada con tu organización, carpeta o proyecto de Google Cloud y almacénala en un archivo temporal:
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
- En un editor de texto, abre
/tmp/policy.yaml
y agrega 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 tu nueva política de IAM:
gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
Si el comando anterior informa de un conflicto con otro cambio, repite estos pasos y comienza por la lectura de la política de IAM. Para obtener más información, consulta Configura los registros de auditoría de acceso a los datos con la API.
- Lee la política de Identity and Access Management (IAM) asociada con tu organización, carpeta o proyecto de Google Cloud y almacénala en un archivo temporal:
- Otorga 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 de 2021 o antes de esa fecha, 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'
- Establece los valores predeterminados que se usan en este instructivo:
export REGION=us-central1 gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
Crea 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
Reemplaza REPOSITORY
por un nombre único para el repositorio.
Crea un bucket de Cloud Storage
Crea un bucket de Cloud Storage en cada una de las dos regiones como fuente de eventos para el servicio de Cloud Run:
Crea un bucket en
us-east1
:export BUCKET1="troubleshoot-bucket1-PROJECT_ID" gsutil mb -l us-east1 gs://${BUCKET1}
Crea un bucket en
us-west1
:export BUCKET2="troubleshoot-bucket2-PROJECT_ID" gsutil mb -l us-west1 gs://${BUCKET2}
Después de crear la fuente del evento, implementa el servicio del receptor de eventos en Cloud Run.
Implementa el receptor de eventos
Implementa un servicio de Cloud Run que reciba y registre eventos.
Clona el repositorio de GitHub para recuperar la muestra de código:
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 instructivo, que consta de los siguientes elementos:
Un controlador de eventos que recibe el evento entrante como un CloudEvent dentro de 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 Dockerfile que define el entorno operativo del servicio. El contenido del Dockerfile varía según el lenguaje
Go
Java
.NET
Node.js
Python
Compila tu imagen de contenedor con Cloud Build y sube la imagen 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
Implementa la imagen del contenedor en Cloud Run:
gcloud run deploy ${SERVICE_NAME} \ --image $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1 \ --allow-unauthenticated
Cuando la implementación se realiza correctamente, la línea de comandos muestra la URL del servicio.
Crear un activador
Después de implementar un servicio de Cloud Run, configura un activador para escuchar eventos de Cloud Storage a través de registros de auditoría.
Crea un activador de Eventarc para detectar los eventos de Cloud Storage que se enrutan mediante los 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
Esto crea un activador llamado
troubleshoot-trigger
.Para confirmar que se creó
troubleshoot-trigger
, ejecuta el siguiente comando:gcloud eventarc triggers list
El resultado debería ser similar al siguiente ejemplo:
NAME: troubleshoot-trigger TYPE: google.cloud.audit.log.v1.written DESTINATION: Cloud Run service: troubleshoot-service ACTIVE: By 20:03:37 LOCATION: us-central1
Genera y visualiza un evento
Confirma que implementaste correctamente el servicio y que puedes recibir eventos de Cloud Storage.
Crea y sube un archivo al bucket de almacenamiento
BUCKET1
:echo "Hello World" > random.txt gsutil cp random.txt gs://${BUCKET1}/random.txt
Supervisa los registros para verificar si el servicio recibió un evento. Para ver la entrada de registro, completa los siguientes pasos:
Filtra las entradas de registro y muestra 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 lo siguiente:
"textPayload": "Detected change in Cloud Storage bucket: ..."
Ten en cuenta que, en un principio, no se muestra ninguna entrada de registro. Esto indica que hay un problema en la configuración que debes investigar.
Investiga el problema
Revisa el proceso de investigar por qué el servicio no recibe eventos.
Hora de inicialización
Aunque tu activador se crea de inmediato, puede tardar hasta dos minutos en propagarse y filtrar los 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
estará activo 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 del servicio de Cloud Run. Si el servicio no recibe eventos, podría estar relacionado con el tamaño de los eventos.
Registros de auditoría
En este instructivo, 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 para Cloud Storage.
En la consola de Google Cloud, ve a la página Registros de auditoría.
- Selecciona la casilla de verificación Google Cloud Storage.
- Asegúrate de que los tipos de registro Lectura de administrador, Lectura de datos y Escritura de datos estén seleccionados.
Una vez que hayas habilitado los Registros de auditoría de Cloud, vuelve a subir el archivo al bucket de almacenamiento y verifica los registros. Si el servicio aún no recibe eventos, esto podría estar relacionado con la ubicación del activador.
Ubicación del activador
Puede haber varios recursos en diferentes ubicaciones y debes filtrar los eventos de fuentes que se encuentran en la misma región que el destino de Cloud Run. Para obtener más información, consulta las ubicaciones compatibles con Eventarc e Información sobre las ubicaciones de Eventarc.
En este instructivo, implementaste el servicio de Cloud Run en us-central1
. Debido a que configuraste eventarc/location
como us-central1
, también creaste un activador en la misma ubicación.
Sin embargo, creaste dos buckets de Cloud Storage en ubicaciones us-east1
y us-west1
. Para recibir eventos de esas ubicaciones, debes crear activadores de Eventarc en esas ubicaciones.
Crea un activador de Eventarc ubicado en us-east1
:
Confirma la ubicación del activador existente:
gcloud eventarc triggers describe troubleshoot-trigger
Establece la ubicación y la región en
us-east1
:gcloud config set eventarc/location us-east1 gcloud config set run/region us-east1
Implementa el receptor de eventos de nuevo mediante la compilación y la implementación de la imagen de contenedor en Cloud Run.
Crea un activador nuevo ubicado 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
Verifica que se haya creado el activador:
gcloud eventarc triggers list
La inicialización de un activador puede tomar hasta dos minutos antes de comenzar a enrutar eventos.
Para confirmar que el activador ahora se implementó de forma correcta, genera y visualiza un evento.
Otros problemas que puedes tener
Es posible que tengas otros problemas cuando uses Eventarc.
Tamaño del evento
Los eventos que envíe no deben exceder los límites de tamaño del evento.
Dejó de funcionar un activador que ya se publicó antes
Verifica que la fuente genere eventos. Verifica los Registros de auditoría de Cloud y asegúrate de que el servicio supervisado emita registros. Si se registran registros, pero los eventos no se entregan, comunícate con el equipo de asistencia.
Verifica que exista un tema de Pub/Sub con el mismo nombre de activador. Eventarc usa Pub/Sub como su capa de transporte y usará un tema de Pub/Sub existente o creará un tema y lo administrará automáticamente.
- Para enumerar los activadores, consulta
gcloud eventarc triggers list
. Para enumerar los temas de Pub/Sub, ejecuta el siguiente comando:
gcloud pubsub topics list
Verifica 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 enumerar los activadores, consulta
Verifica que el activador se haya configurado para el servicio.
En la consola de Google Cloud, ve a la página Servicios.
Haz clic en el nombre del servicio para abrir la página Detalles del servicio.
Hacer clic en la pestaña Activadores
Se debería mostrar el activador de Eventarc asociado con el servicio.
Verifica el estado del tema y la suscripción de Pub/Sub mediante los tipos de métricas de Pub/Sub.
Puedes supervisar los mensajes reenviados que no se pueden entregar mediante la métrica
subscription/dead_letter_message_count
. Esta métrica muestra la cantidad de mensajes que no se pueden entregar que Pub/Sub reenvía desde una suscripción.Si no se publican mensajes en el tema, revisa los registros de auditoría de Cloud y asegúrate de que el servicio supervisado emite registros. Si se registran registros, pero los eventos no se entregan, comunícate con el equipo de asistencia.
Puedes supervisar las suscripciones de envío con la métrica
subscription/push_request_count
y agrupando la métrica porresponse_code
ysubcription_id
.Si se informan errores de envío, verifica los registros del servicio de Cloud Run. Si el extremo receptor muestra un código de estado incorrecto, eso indica que el código de Cloud Run no funciona como se espera y debes comunicarte con el equipo de asistencia.
Para obtener más información, consulta Crea políticas de alertas de límite de métrica.
Realiza una limpieza
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:
- 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 recursos de instructivos
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.
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
Borra otros recursos de Google Cloud que creaste en este instructivo:
- Borrar el activador de Eventarc:
Reemplazagcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
por el nombre de tu activador.
- Borrar el activador de Eventarc: