En este tutorial se muestra cómo usar Cloud Run, la API Cloud Vision y ImageMagick para detectar y desenfocar imágenes ofensivas subidas a un segmento de Cloud Storage. Este tutorial se basa en el tutorial Usar Pub/Sub con Cloud Run.
En este tutorial se explica cómo modificar una aplicación de ejemplo. También puedes descargar la aplicación de ejemplo completa si quieres.
Configurar los valores predeterminados de gcloud
Para configurar gcloud con los valores predeterminados de tu servicio de Cloud Run, sigue estos pasos:
Configura tu proyecto predeterminado:
gcloud config set project PROJECT_ID
Sustituye PROJECT_ID por el nombre del proyecto que has creado para este tutorial.
Configura gcloud para la región que hayas elegido:
gcloud config set run/region REGION
Sustituye REGION por la región de Cloud Run compatible que quieras.
Ubicaciones de Cloud Run
Cloud Run es regional, lo que significa que la infraestructura que ejecuta tus servicios de Cloud Run se encuentra en una región específica y Google la gestiona para que esté disponible de forma redundante en todas las zonas de esa región.
Cumplir tus requisitos de latencia, disponibilidad o durabilidad son factores primordiales para seleccionar la región en la que se ejecutan tus servicios de Cloud Run.
Por lo general, puedes seleccionar la región más cercana a tus usuarios, pero debes tener en cuenta la ubicación de los otros Google Cloudproductos que utiliza tu servicio de Cloud Run.
Usar Google Cloud productos juntos en varias ubicaciones puede afectar a la latencia y al coste de tu servicio.
Cloud Run está disponible en las siguientes regiones:
Con sujeción a los precios del nivel 1
asia-east1
(Taiwán)asia-northeast1
(Tokio)asia-northeast2
(Osaka)asia-south1
(Bombay, la India)europe-north1
(Finlandia)CO2 bajo
europe-north2
(Estocolmo)CO2 bajo
europe-southwest1
(Madrid)CO2 bajo
europe-west1
(Bélgica)CO2 bajo
europe-west4
(Países Bajos)CO2 bajo
europe-west8
(Milán)europe-west9
(París)CO2 bajo
me-west1
(Tel Aviv)northamerica-south1
(México)us-central1
(Iowa)CO2 bajo
us-east1
(Carolina del Sur)us-east4
(Norte de Virginia)us-east5
(Columbus)us-south1
(Dallas)CO2 bajo
us-west1
(Oregón)CO2 bajo
Con sujeción a los precios del nivel 2
africa-south1
(Johannesburgo)asia-east2
(Hong Kong)asia-northeast3
(Seúl, Corea del Sur)asia-southeast1
(Singapur)asia-southeast2
(Yakarta)asia-south2
(Delhi, la India)australia-southeast1
(Sídney)australia-southeast2
(Melbourne)europe-central2
Varsovia (Polonia)europe-west10
(Berlín)europe-west12
(Turín)europe-west2
(Londres, Reino Unido)CO2 bajo
europe-west3
(Fráncfort, Alemania)europe-west6
(Zúrich, Suiza)Bajas emisiones de CO2
me-central1
(Doha)me-central2
(Dammam)northamerica-northeast1
(Montreal)CO2 bajo
northamerica-northeast2
(Toronto)CO2 bajo
southamerica-east1
(São Paulo, Brasil)CO2 bajo
southamerica-west1
(Santiago, Chile)CO2 bajo
us-west2
(Los Ángeles)us-west3
(Salt Lake City)us-west4
(Las Vegas)
Si ya has creado un servicio de Cloud Run, puedes ver la región en el panel de control de Cloud Run de la Google Cloud consola.
Información sobre la secuencia de operaciones
El flujo de datos de este tutorial sigue estos pasos:
- Un usuario sube una imagen a un segmento de Cloud Storage.
- Cloud Storage publica un mensaje sobre el nuevo archivo en Pub/Sub.
- Pub/Sub envía el mensaje al servicio de Cloud Run.
- El servicio de Cloud Run recupera el archivo de imagen al que se hace referencia en el mensaje de Pub/Sub.
- El servicio de Cloud Run usa la API Cloud Vision para analizar la imagen.
- Si se detecta contenido violento o para adultos, el servicio Cloud Run usa ImageMagick para difuminar la imagen.
- El servicio de Cloud Run sube la imagen desenfocada a otro segmento de Cloud Storage para usarla.
El uso posterior de la imagen desenfocada se deja como ejercicio para el lector.
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 con un nombre único para el repositorio.
- REGION con la Google Cloud región que se va a usar en el repositorio de Artifact Registry.
Configurar segmentos de Cloud Storage
gcloud
Crea un segmento de Cloud Storage para subir imágenes, donde INPUT_BUCKET_NAME es un nombre de segmento único a nivel global:
gcloud storage buckets create gs://INPUT_BUCKET_NAME
El servicio de Cloud Run solo lee de este segmento.
Crea un segundo segmento de Cloud Storage para recibir las imágenes desenfocadas. Sustituye BLURRED_BUCKET_NAME por un nombre de segmento único a nivel global:
gcloud storage buckets create gs://BLURRED_BUCKET_NAME
El servicio de Cloud Run sube las imágenes desenfocadas a este segmento. Si usas un contenedor independiente, evitarás que las imágenes procesadas vuelvan a activar el servicio.
De forma predeterminada, las revisiones de Cloud Run se ejecutan como la cuenta de servicio predeterminada de Compute Engine.
Si, por el contrario, usas una cuenta de servicio gestionada por el usuario, asegúrate de haber asignado los roles de gestión de identidades y accesos necesarios para que tenga el permiso
storage.objects.get
para leer de INPUT_BUCKET_NAME y el permisostorage.objects.create
para subir contenido a BLURRED_BUCKET_NAME.
Terraform
Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.
Crea dos segmentos de Cloud Storage: uno para subir las imágenes originales y otro para que el servicio de Cloud Run suba las imágenes desenfocadas.
Para crear ambos segmentos de Cloud Storage con nombres únicos a nivel global, añade lo siguiente al archivo main.tf
:
De forma predeterminada, las revisiones de Cloud Run se ejecutan como la cuenta de servicio predeterminada de Compute Engine.
Si, por el contrario, usas una cuenta de servicio gestionada por el usuario, asegúrate de haber asignado los roles de gestión de identidades y accesos necesarios para que tenga el permiso storage.objects.get
para leer de google_storage_bucket.imageproc_input
y el permiso storage.objects.create
para subir a google_storage_bucket.imageproc_output
.
En los pasos siguientes, creará e implementará un servicio que procese las notificaciones de subidas de archivos a INPUT_BUCKET_NAME. Activa el envío de notificaciones después de implementar y probar el servicio para evitar que se invoque prematuramente.
Modificar el código de ejemplo del tutorial de Pub/Sub
Este tutorial se basa en el código ensamblado en el tutorial sobre el uso de Pub/Sub. Si aún no has completado ese tutorial, hazlo ahora, saltándote los pasos de limpieza y vuelve aquí para añadir el comportamiento de procesamiento de imágenes.
Añadir código de procesamiento de imágenes
El código de procesamiento de imágenes está separado del código de gestión de solicitudes para que sea más fácil de leer y probar. Para añadir código de procesamiento de imágenes, sigue estos pasos:
Cambia al directorio del código de ejemplo del tutorial de Pub/Sub.
Añade código para importar las dependencias de procesamiento de imágenes, incluidas las bibliotecas para integrarlas con los servicios de Google Cloud , ImageMagick y el sistema de archivos.
Node.js
Abre un archivoimage.js
en tu editor y copia lo siguiente:Python
Abre un archivoimage.py
en tu editor y copia lo siguiente:Go
Abre un nuevo archivoimagemagick/imagemagick.go
en tu editor y copia lo siguiente:Java
Abre un archivosrc/main/java/com/example/cloudrun/ImageMagick.java
en tu editor y copia lo siguiente:Añade código para recibir un mensaje de Pub/Sub como objeto de evento y controlar el procesamiento de imágenes.
El evento contiene datos sobre la imagen que se subió originalmente. Este código determina si la imagen debe desenfocarse comprobando los resultados de un análisis de Cloud Vision para detectar contenido violento o para adultos.
Node.js
Python
Go
Java
Obtén la imagen a la que se hace referencia del segmento de entrada de Cloud Storage que has creado anteriormente, usa ImageMagick para transformar la imagen con un efecto de desenfoque y sube el resultado al segmento de salida.
Node.js
Python
Go
Java
Integrar el procesamiento de imágenes en el código de ejemplo de Pub/Sub
Para modificar el servicio actual e incorporar el código de procesamiento de imágenes, sigue estos pasos:
Añade nuevas dependencias a tu servicio, incluidas las bibliotecas de cliente de Cloud Vision y Cloud Storage:
Node.js
npm install gm @google-cloud/storage @google-cloud/vision
Python
Añade las bibliotecas de cliente necesarias para que turequirements.txt
tenga un aspecto similar al siguiente:Go
La aplicación de ejemplo de Go usa módulos de Go. Las nuevas dependencias añadidas arriba en la instrucciónimagemagick/imagemagick.go
import se descargarán automáticamente con el siguiente comando que las necesite.Java
Añade la siguiente dependencia en<dependencyManagement>
enpom.xml
: Añade las siguientes dependencias en<dependencies>
en el archivopom.xml
:Añade el paquete del sistema ImageMagick a tu contenedor modificando el
Dockerfile
situado debajo de la instrucciónFROM
. Si usas un Dockerfile de varias fases, coloca esto en la fase final.Debian/Ubuntu Alpine Consulta más información sobre cómo trabajar con paquetes del sistema en tu servicio de Cloud Run en el tutorial sobre cómo usar paquetes del sistema.
Sustituye el código de gestión de mensajes de Pub/Sub por una llamada de función a nuestra nueva lógica de desenfoque.
Node.js
El archivoapp.js
define la aplicación Express.js y prepara los mensajes de Pub/Sub recibidos para su uso. Haz los siguientes cambios:- Añadir código para importar el nuevo archivo
image.js
- Elimina el código "Hello World" de la ruta
- Añadir código para validar aún más el mensaje de Pub/Sub
Añadir código para llamar a la nueva función de procesamiento de imágenes
Cuando haya terminado, el código tendrá este aspecto:
Python
El archivomain.py
define la aplicación Flask y prepara los mensajes de Pub/Sub recibidos para su uso. Haz los siguientes cambios:- Añadir código para importar el nuevo archivo
image.py
- Elimina el código "Hello World" de la ruta
- Añadir código para validar aún más el mensaje de Pub/Sub
Añadir código para llamar a la nueva función de procesamiento de imágenes
Cuando haya terminado, el código tendrá este aspecto:
Go
El archivomain.go
define el servicio HTTP y prepara los mensajes de Pub/Sub recibidos para su uso. Haz los siguientes cambios:- Añadir código para importar el nuevo archivo
imagemagick.go
- Elimina el código "Hello World" del controlador.
- Añadir código para validar aún más el mensaje de Pub/Sub
- Añadir código para llamar a la nueva función de procesamiento de imágenes
Java
El archivoPubSubController.java
define el controlador que gestiona las solicitudes HTTP y prepara los mensajes de Pub/Sub recibidos para su uso. Haz los siguientes cambios:- Añade las nuevas importaciones
- Elimina el código "Hello World" del controlador
- Añadir código para validar aún más el mensaje de Pub/Sub
- Añadir código para llamar a la nueva función de procesamiento de imágenes
- Añadir código para importar el nuevo archivo
Descargar la muestra completa
Para obtener el código de muestra completo de procesamiento de imágenes, sigue estos pasos:
Clona el repositorio de aplicaciones de muestra en la máquina local:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
También puedes descargar el ejemplo como un archivo ZIP y extraerlo.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
También puedes descargar el ejemplo como un archivo ZIP y extraerlo.
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
También puedes descargar el ejemplo como un archivo ZIP y extraerlo.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
También puedes descargar el ejemplo como un archivo ZIP y extraerlo.
Cambia al directorio que contiene el código de ejemplo de Cloud Run:
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/
Lanzar el código
El envío de código consta de tres pasos: crear una imagen de contenedor con Cloud Build, subir la imagen de contenedor a Artifact Registry y desplegar la imagen de contenedor en Cloud Run.
Para enviar tu código, sigue estos pasos:
Crea el contenedor y publícalo en Artifact Registry:
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub
Donde
pubsub
es el nombre de tu servicio.Sustituye:
- PROJECT_ID con el ID de tu proyecto Google Cloud
- REPOSITORY con el nombre del repositorio de Artifact Registry.
- REGION con la Google Cloud región que se va a usar en el repositorio de Artifact Registry.
Si la operación se realiza correctamente, verás un mensaje de ÉXITO que contiene el ID, la hora de creación y el nombre de la imagen. La imagen se almacena en Artifact Registry y se puede volver a usar si es necesario.
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub
Donde
pubsub
es el nombre de tu servicio.Sustituye:
- PROJECT_ID con el ID de tu proyecto Google Cloud
- REPOSITORY con el nombre del repositorio de Artifact Registry.
- REGION con la Google Cloud región que se va a usar en el repositorio de Artifact Registry.
Si la operación se realiza correctamente, verás un mensaje de ÉXITO que contiene el ID, la hora de creación y el nombre de la imagen. La imagen se almacena en Artifact Registry y se puede volver a usar si es necesario.
Go
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub
Donde
pubsub
es el nombre de tu servicio.Sustituye:
- PROJECT_ID con el ID de tu proyecto Google Cloud
- REPOSITORY con el nombre del repositorio de Artifact Registry.
- REGION con la Google Cloud región que se va a usar en el repositorio de Artifact Registry.
Si la operación se realiza correctamente, verás un mensaje de ÉXITO que contiene el ID, la hora de creación y el nombre de la imagen. La imagen se almacena en Artifact Registry y se puede volver a usar si es necesario.
Java
En este ejemplo se usa Jib para crear imágenes de Docker con herramientas comunes de Java. Jib optimiza las compilaciones de contenedores sin necesidad de usar un Dockerfile ni de tener Docker instalado. Más información sobre cómo crear contenedores Java con JibCon el Dockerfile, configura y compila una imagen base con los paquetes del sistema instalados para anular la imagen base predeterminada de Jib:
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/imagemagick
Sustituye:
- PROJECT_ID con el ID de tu proyecto Google Cloud
- REPOSITORY con el nombre del repositorio de Artifact Registry.
- REGION con la Google Cloud región que se va a usar en el repositorio de Artifact Registry.
Usa el asistente de credenciales de gcloud para autorizar a Docker a enviar contenido a tu Artifact Registry.
gcloud auth configure-docker
Crea el contenedor final con Jib y publícalo en Artifact Registry:
mvn compile jib:build \ -Dimage=REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub \ -Djib.from.image=REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/imagemagick
Sustituye:
- PROJECT_ID con el ID de tu proyecto Google Cloud
- REPOSITORY con el nombre del repositorio de Artifact Registry.
- REGION con la Google Cloud región que se va a usar en el repositorio de Artifact Registry.
Ejecuta el siguiente comando para implementar tu servicio. Usa el mismo nombre de servicio que usaste en el tutorial sobre cómo usar Pub/Sub:
Node.js
gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --no-allow-unauthenticated
Python
gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --no-allow-unauthenticated
Go
gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --no-allow-unauthenticated
Java
gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --memory 512M --no-allow-unauthenticated
Donde
pubsub
es el nombre del contenedor ypubsub-tutorial
es el nombre del servicio. Ten en cuenta que la imagen de contenedor se despliega en el servicio y la región (Cloud Run) que configuraste anteriormente en Configurar valores predeterminados de gcloud. Sustituye:- PROJECT_ID con el ID de tu proyecto Google Cloud
- REPOSITORY con el nombre del repositorio de Artifact Registry.
- REGION con la Google Cloud región que se va a usar en el repositorio de Artifact Registry.
- BLURRED_BUCKET_NAME con el segmento de Cloud Storage que has creado anteriormente para recibir imágenes borrosas y definir la variable de entorno.
La marca
--no-allow-unauthenticated
restringe el acceso no autenticado al servicio. Si mantienes el servicio privado, puedes usar la integración automática de Pub/Sub de Cloud Run para autenticar las solicitudes. Consulta Integración con Pub/Sub para obtener más información sobre cómo se configura. Consulta Gestionar el acceso para obtener más información sobre la autenticación basada en IAM.Espera a que se complete el despliegue, que puede tardar aproximadamente medio minuto. Si la acción se realiza correctamente, la línea de comandos mostrará la URL del servicio.
Activar las notificaciones de Cloud Storage
Configura Cloud Storage para que publique un mensaje en un tema de Pub/Sub cada vez que se suba o se modifique un archivo (conocido como objeto). Envía la notificación al tema creado anteriormente para que cualquier archivo nuevo que se suba invoque el servicio.
gcloud
gcloud storage service-agent --project=PROJECT_ID gcloud storage buckets notifications create gs://INPUT_BUCKET_NAME --topic=myRunTopic --payload-format=json
myRunTopic
es el tema que creaste en el tutorial anterior.
Sustituye INPUT_BUCKET_NAME por el nombre que usaste al crear los contenedores.
Para obtener más información sobre las notificaciones de segmentos de almacenamiento, consulta las notificaciones de cambios en objetos.
Terraform
Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.
Para habilitar las notificaciones, la cuenta de servicio de Cloud Storage, que es única para el proyecto, debe existir y tener el permiso de gestión de identidades y accesos pubsub.publisher
en el tema de Pub/Sub. Para conceder este permiso y crear una notificación de Cloud Storage, añade lo siguiente al archivo main.tf
:
Pruébalo
Sube una imagen ofensiva, como esta de un zombi carnívoro:
curl -o zombie.jpg https://cdn.pixabay.com/photo/2015/09/21/14/24/zombie-949916_960_720.jpg gcloud storage cp zombie.jpg gs://INPUT_BUCKET_NAME
donde INPUT_BUCKET_NAME es el segmento de Cloud Storage que has creado anteriormente para subir imágenes.
Ve a los registros del servicio:
- Ve a la página Cloud Run de la Google Cloud consola.
- Haz clic en el servicio
pubsub-tutorial
. - Selecciona la pestaña Registros. Puede que los registros tarden unos instantes en aparecer. Si no los ves inmediatamente, vuelve a comprobarlo al cabo de unos instantes.
Busca el mensaje
Blurred image: zombie.png
.Puedes ver las imágenes desenfocadas en el BLURRED_BUCKET_NAME segmento de Cloud Storage que has creado anteriormente. Para ello, busca el segmento en la página Cloud Storage de la Google Cloud consola.