En este instructivo, se demuestra cómo usar Cloud Run for Anthos, ImageMagick y la API de Cloud Vision para detectar y difuminar imágenes ofensivas subidas a un bucket de Cloud Storage. Este instructivo se basa en el instructivo Usa Pub/Sub con Cloud Run for Anthos.
En este instructivo, se explica cómo modificar una app de muestra existente. También puedes descargar la muestra completa si lo deseas.
Objetivos
- Escribir, compilar e implementar un servicio de procesamiento de datos asíncrono en Cloud Run for Anthos
- Invocar el servicio mediante la carga de un archivo a Cloud Storage y la creación de un mensaje de Pub/Sub
- Usar la API de Cloud Vision para detectar contenido violento o destinado a adultos
- Usar ImageMagick para difuminar imágenes ofensivas
- Probar el servicio mediante la carga de una imagen de un zombi que come carne humana
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
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
-
Enable the Cloud Run for Anthos and Cloud Vision APIs.
- Instala e inicializa la CLI de gcloud.
- Instala el componente
kubectl
:gcloud components install kubectl
- Actualiza los componentes, como se indica a continuación:
gcloud components update
- Mediante Cloud Run for Anthos, crea un clúster nuevo según las instrucciones de Configura Cloud Run for Anthos.
- Configura un tema de Pub/Sub, una suscripción de envío segura y un servicio inicial de Cloud Run for Anthos para controlar los mensajes de acuerdo con el instructivo Usa Pub/Sub con Cloud Run for Anthos.
Configura los valores predeterminados de gcloud
Si deseas configurar gcloud con la configuración predeterminada para el servicio de Cloud Run for Anthos, haz lo siguiente:
Configura el proyecto predeterminado:
gcloud config set project PROJECT_ID
Reemplaza PROJECT_ID por el nombre del proyecto que creaste para este instructivo.
Configura gcloud para tu clúster:
gcloud config set run/platform gke gcloud config set run/cluster CLUSTER-NAME gcloud config set run/cluster_location REGION
Reemplaza lo siguiente:
- CLUSTER-NAME por el nombre que usaste para el clúster
- REGION por la ubicación de clúster compatible que elijas
Comprende la secuencia de operaciones
El flujo de datos en este instructivo sigue estos pasos:
- Un usuario sube una imagen a un bucket de Cloud Storage.
- Cloud Storage publica un mensaje sobre el archivo nuevo en Pub/Sub.
- Pub/Sub envía el mensaje al servicio de Cloud Run for Anthos.
- El servicio de Cloud Run for Anthos recupera el archivo de imagen al que se hace referencia en el mensaje de Pub/Sub.
- El servicio de Cloud Run for Anthos usa la API de Cloud Vision para analizar la imagen.
- Si se detecta contenido violento o para adultos, el servicio de Cloud Run for Anthos usa ImageMagick para difuminar la imagen.
- El servicio de Cloud Run for Anthos sube la imagen difuminada a otro bucket de Cloud Storage para usarla.
El uso posterior de la imagen difuminada se deja como un ejercicio para el lector.
Configura depósitos de Cloud Storage
Crea un bucket de Cloud Storage para subir imágenes, en el que INPUT_BUCKET_NAME es un nombre de bucket único a nivel global:
gsutil mb gs://INPUT_BUCKET_NAME
El servicio de Cloud Run for Anthos solo lee desde este bucket.
Crea un segundo bucket de Cloud Storage para recibir imágenes difuminadas, en el que BLURRED_BUCKET_NAME es un nombre de bucket único a nivel global:
gsutil mb gs://BLURRED_BUCKET_NAME
El servicio de Cloud Run for Anthos sube imágenes difuminadas a este bucket. Si usas un bucket diferente, evitarás que las imágenes procesadas vuelvan a activar el servicio.
Mediante los siguientes pasos, crearás y, luego, implementarás un servicio que procesa la notificación de las cargas de archivos a INPUT_BUCKET_NAME. Debes activar la entrega de notificaciones después de implementar y probar el servicio para evitar la invocación prematura del servicio nuevo.
Modifica el código de muestra del instructivo de Pub/Sub
Este instructivo se basa en el código ensamblado en el instructivo Usa Pub/Sub. Si aún no completaste ese instructivo, hazlo ahora. Omite los pasos de limpieza y, luego, regresa para agregar el comportamiento del procesamiento de imágenes.
Agrega el código de procesamiento de imágenes
El código de procesamiento de imágenes está separado de la administración de solicitudes para facilitar la lectura y la prueba. Para agregar código de procesamiento de imágenes, sigue estos pasos:
Ve al directorio en el que se encuentra el código de muestra del instructivo de Pub/Sub.
Agrega el código a fin de importar las dependencias de procesamiento de imágenes, incluidas las bibliotecas para integrar en los servicios de Google Cloud, ImageMagick y el sistema de archivos.
Node.js
Abre un archivoimage.js
nuevo en el editor y copia lo que se muestra a continuación:Python
Abre un archivoimage.py
nuevo en el editor y copia lo que se muestra a continuación:Go
Abre un archivoimagemagick/imagemagick.go
nuevo en el editor y copia lo que se muestra a continuación:Java
Abre un archivosrc/main/java/com/example/cloudrun/ImageMagick.java
nuevo en el editor y copia lo que se muestra a continuación:Agrega el código a fin de recibir un mensaje de Pub/Sub como objeto de evento y controla el procesamiento de imágenes.
El evento contiene datos sobre la imagen que se subió originalmente. Este código verifica los resultados de un análisis de Cloud Vision de contenido violento o para adultos y determina si la imagen debe difuminarse.
Node.js
Python
Go
Java
Recupera la imagen a la que se hace referencia desde el bucket de entrada de Cloud Storage creado antes, usa ImageMagick para transformar la imagen con un efecto de difuminado y sube el resultado al bucket de salida.
Node.js
Python
Go
Java
Integra el procesamiento de imágenes en el código de muestra de Pub/Sub
Para modificar el servicio existente a fin de incorporar el código de procesamiento de imágenes, sigue estos pasos:
Agrega dependencias nuevas para el servicio, incluidas las bibliotecas cliente de Cloud Vision y Cloud Storage:
Node.js
npm install --save gm @google-cloud/storage @google-cloud/vision
Python
Agrega las bibliotecas cliente necesarias para querequirements.txt
se vea similar esto:Go
La aplicación de muestra de Go usa módulos de Go; el siguiente comando que necesite las dependencias nuevas agregadas antes en la instrucción de importaciónimagemagick/imagemagick.go
, las descargará de forma automática.Java
Agrega la siguiente dependencia en<dependencyManagement>
en elpom.xml
: Agrega las siguientes dependencias en<dependencies>
en elpom.xml
:Puedes agregar el paquete del sistema de ImageMagick al contenedor mediante la modificación de
Dockerfile
en la instrucciónFROM
. Si usas un Dockerfile de “etapas múltiples”, colócalo en la etapa final.Debian y Ubuntu Alpine Obtén más información sobre cómo trabajar con paquetes del sistema en el servicio de Cloud Run for Anthos en el Instructivo sobre cómo usar paquetes del sistema.
Reemplaza el código de administración de mensajes de Pub/Sub existente con una llamada a función a nuestra lógica de difuminado nueva.
Node.js
El archivoapp.js
define la app de Express.js y prepara los mensajes de Pub/Sub recibidos para su uso. Realiza los siguientes cambios:- Agrega el código para importar el archivo
image.js
nuevo. - Quita el código “Hello World” existente de la ruta.
- Agrega el código para validar el mensaje de Pub/Sub.
Agrega el código para llamar a la función de procesamiento de imágenes nueva.
Cuando termines, el código se verá de la siguiente manera:
Python
El archivomain.py
define la app de Flask y prepara los mensajes de Pub/Sub recibidos para su uso. Realiza los siguientes cambios:- Agrega el código para importar el archivo
image.py
nuevo. - Quita el código “Hello World” existente de la ruta.
- Agrega el código para validar el mensaje de Pub/Sub.
Agrega el código para llamar a la función de procesamiento de imágenes nueva.
Cuando termines, el código se verá de la siguiente manera:
Go
El archivomain.go
define el servicio HTTP y prepara los mensajes de Pub/Sub recibidos para su uso. Realiza los siguientes cambios:- Agrega el código para importar el archivo
imagemagick.go
nuevo. - Quita el código “Hello World” existente del controlador.
- Agrega el código para validar el mensaje de Pub/Sub.
- Agrega el código para llamar a la función de procesamiento de imágenes nueva.
Java
El archivoPubSubController.java
define el controlador que administra las solicitudes HTTP y prepara los mensajes de Pub/Sub recibidos para su uso. Realiza los siguientes cambios:- Agrega las importaciones nuevas.
- Quita el código “Hello World” existente del controlador.
- Agrega el código para validar el mensaje de Pub/Sub.
- Agrega el código para llamar a la función de procesamiento de imágenes nueva.
- Agrega el código para importar el archivo
Descarga la muestra completa
Si deseas recuperar la muestra de código del procesamiento de imágenes completa para usar, sigue estos pasos:
Clona el repositorio de la app de muestra en tu máquina local:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
De manera opcional, puedes descargar la muestra como un archivo zip y extraerla.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
De manera opcional, puedes descargar la muestra como un archivo zip y extraerla.
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
De manera opcional, puedes descargar la muestra como un archivo ZIP y extraerla.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
De manera opcional, puedes descargar la muestra como un archivo ZIP y extraerla.
Cambia al directorio que contiene el código de muestra de Cloud Run for Anthos:
Node.js
cd nodejs-docs-samples/run/image-processing/
Python
cd python-docs-samples/run/image-processing/
Go
cd golang-samples/run/image-processing/
Java
cd java-docs-samples/run/image-processing/
Envía el código
El código de envío consta de tres pasos: compilar una imagen de contenedor con Cloud Build, subir la imagen de contenedor a Container Registry y, luego, implementar la imagen de contenedor en Cloud Run for Anthos.
Para enviar el código, haz lo siguiente:
Compila el contenedor y publica en Container Registry:
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/pubsub
En el ejemplo anterior, PROJECT_ID es el ID de tu proyecto de GCP y
pubsub
es el nombre que deseas darle al servicio.Si la operación se completa de manera correcta, verás un mensaje de ÉXITO con el ID, la hora de creación y el nombre de la imagen. La imagen se almacena en Container Registry y puede volver a usarse si así se desea.
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/pubsub
En el ejemplo anterior, PROJECT_ID es el ID de tu proyecto de GCP y
pubsub
es el nombre que deseas darle al servicio.Si la operación se completa de manera correcta, verás un mensaje de ÉXITO con el ID, la hora de creación y el nombre de la imagen. La imagen se almacena en Container Registry y puede volver a usarse si así se desea.
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/pubsub
En el ejemplo anterior, PROJECT_ID es el ID de tu proyecto de GCP y
pubsub
es el nombre que deseas darle al servicio.Si la operación se completa de manera correcta, verás un mensaje de ÉXITO con el ID, la hora de creación y el nombre de la imagen. La imagen se almacena en Container Registry y puede volver a usarse si así se desea.
Java
En esta muestra, se usa Jib para compilar imágenes de Docker mediante herramientas de Java comunes. Jib optimiza las compilaciones de contenedores sin la necesidad de tener un Dockerfile o tener Docker instalado. Obtén más información sobre la compilación de contenedores de Java con Jib.Mediante Dockerfile, configura y compila una imagen base con los paquetes de sistema instalados a fin de anular la imagen base predeterminada de Jib:
gcloud builds submit --tag gcr.io/PROJECT_ID/imagemagick
En el ejemplo anterior, PROJECT_ID es el ID de tu proyecto de GCP.
Compila el contenedor final con Jib y publica en Container Registry:
mvn compile jib:build \ -Dimage=gcr.io/PROJECT_ID/pubsub \ -Djib.from.image=gcr.io/PROJECT_ID/imagemagick
En el ejemplo anterior, PROJECT_ID es el ID de tu proyecto de GCP.
Ejecuta el siguiente comando para implementar tu servicio con el mismo nombre de servicio que usaste en el instructivo de Pub/Sub:
Node.js
gcloud run deploy pubsub-tutorial --image gcr.io/PROJECT_ID/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME
Python
gcloud run deploy pubsub-tutorial --image gcr.io/PROJECT_ID/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME
Go
gcloud run deploy pubsub-tutorial --image gcr.io/PROJECT_ID/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME
Java
gcloud run deploy pubsub-tutorial --image gcr.io/PROJECT_ID/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --memory 512M
Reemplaza PROJECT_ID por el ID del proyecto de GCP.
pubsub
es el nombre del contenedor ypubsub-tutorial
es el nombre del servicio. Ten en cuenta que la imagen de contenedor se implementa en el servicio y en el clúster que configuraste antes en Configura los valores predeterminados de gcloud.Reemplaza BLURRED_BUCKET_NAME por el depósito de Cloud Storage que creaste antes para recibir imágenes difuminadas a fin de configurar la variable de entorno.
Espera hasta que finalice la implementación; esto puede tomar alrededor de medio minuto. Si la operación se completa de forma correcta, la línea de comandos mostrará la URL de servicio.
Activa las notificaciones desde Cloud Storage
Configura Cloud Storage para publicar un mensaje en un tema de Pub/Sub cada vez que se suba o se cambie un archivo (conocido como objeto). Envía la notificación al tema creado antes de modo que cualquier carga de archivo nuevo invoque el servicio.
gsutil notification create -t myRunTopic -f json gs://INPUT_BUCKET_NAME
El comando de gsutil se instala como parte de Google Cloud CLI. myRunTopic
es el tema que creaste en el instructivo anterior.
Reemplaza INPUT_BUCKET_NAME por el nombre que usaste cuando creaste los buckets.
Para obtener más detalles sobre las notificaciones del depósito de almacenamiento, lee las notificaciones de cambios de objetos.
Haz una prueba
Sube una imagen ofensiva, como esta imagen de un zombi que come carne humana:
gsutil cp zombie.jpg gs://INPUT_BUCKET_NAME
En el ejemplo anterior, INPUT_BUCKET_NAME es el depósito de Cloud Storage que creaste antes para subir imágenes.
Navega a los registros de servicio:
Navega a la página de Cloud Run for Anthos en Cloud Console:
Haz clic en el servicio
pubsub-tutorial
.Selecciona la pestaña Registros. Los registros pueden tardar un poco en aparecer. Si no los ves de inmediato, vuelve a revisar en unos minutos.
Busca el mensaje
Blurred image: zombie.png
.Puedes ver las imágenes difuminadas en el depósito de Cloud Storage BLURRED_BUCKET_NAME que creaste antes: ubica el depósito en la página de Cloud Storage en Cloud Console.
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, sigue estos pasos:
- En la consola de Google Cloud, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.
Borra los recursos del instructivo
Borra el servicio de Cloud Run for Anthos 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 for Anthos desde la consola de Cloud:
Quita las opciones de configuración predeterminadas de gcloud que agregaste durante la configuración del instructivo.
gcloud config unset run/platform gcloud config unset run/cluster gcloud config unset run/cluster_location
Quita la configuración del proyecto:
gcloud config unset project
Borra otros recursos de Google Cloud que creaste en este instructivo:
- Borra el tema de Pub/Sub
myRunTopic
. - Borra la suscripción a Pub/Sub
myRunSubscription
. - Borra la imagen del contenedor llamada
gcr.io/
PROJECT_ID/pubsub
de Container Registry. - Borra la cuenta de servicio de invocador
cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
. - Borra los depósitos de Cloud Storage que se crearon para los marcadores de posición
INPUT_BUCKET_NAME
yBLURRED_BUCKET_NAME
. - Si creaste un clúster para este instructivo, bórralo
- Borra el tema de Pub/Sub
¿Qué sigue?
- Obtén más información sobre la persistencia de los datos con Cloud Run for Anthos a través de Cloud Storage
- Aprende a usar la API de Cloud Vision para detectar el contenido que no sea explícito.
- Explora arquitecturas de referencia, diagramas, instructivos y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.