En este tutorial se muestra cómo crear un servicio Cloud Run personalizado
que transforma un parámetro de entrada de descripción de un gráfico en un diagrama en formato de imagen PNG
. Usa Graphviz y se instala como paquete del sistema en el entorno de contenedor del servicio.
Graphviz se usa a través de utilidades de línea de comandos para atender solicitudes.
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.
Obtener el código de ejemplo
Para obtener el código de muestra que vas a usar, 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/system-package/
Python
cd python-docs-samples/run/system-package/
Go
cd golang-samples/run/system_package/
Java
cd java-docs-samples/run/system-package/
Visualizar la arquitectura
La arquitectura básica es la siguiente:

El usuario envía una solicitud HTTP al servicio de Cloud Run, que ejecuta una utilidad de Graphviz para transformar la solicitud en una imagen. Esa imagen se envía al usuario como respuesta HTTP.
Información sobre el código
Definir la configuración del entorno con Dockerfile
Tu Dockerfile
es específico del idioma y del entorno operativo base, como Ubuntu, que usará tu servicio.
En la guía de inicio rápido de compilación e implementación se muestran varios Dockerfiles
que se pueden usar como punto de partida para crear un Dockerfile
para otros servicios.
Este servicio requiere uno o varios paquetes del sistema adicionales que no están disponibles de forma predeterminada.
Abre el
Dockerfile
en un editor.Busca un extracto de
Dockerfile
RUN
. Esta instrucción permite ejecutar comandos de shell arbitrarios para modificar el entorno. Si elDockerfile
tiene varias fases, identificadas por varias instruccionesFROM
, se encontrará en la última fase.Los paquetes específicos necesarios y el mecanismo para instalarlos varían en función del sistema operativo declarado en el contenedor.
Para obtener instrucciones sobre tu sistema operativo o imagen base, haz clic en la pestaña correspondiente.
Debian/Ubuntu Alpine Alpine requiere un segundo paquete para admitir fuentes.Para determinar el sistema operativo de tu imagen de contenedor, consulta el nombre en la instrucción
FROM
o en un archivo README asociado a tu imagen base. Por ejemplo, si amplías desdenode
, puedes encontrar documentación y el elemento principalDockerfile
en Docker Hub.Para probar la personalización, compila la imagen con
docker build
localmente o con Cloud Build.
Gestionar solicitudes entrantes
El servicio de ejemplo usa parámetros de la solicitud HTTP entrante para invocar una llamada al sistema que ejecuta el comando de utilidad dot
adecuado.
En el controlador HTTP que se muestra a continuación, se extrae un parámetro de entrada de descripción de gráfico de la variable de cadena de consulta dot
.
Las descripciones de los gráficos pueden incluir caracteres que deben codificarse como URL para usarse en una cadena de consulta.
Node.js
Python
Go
Java
Deberás diferenciar entre los errores de servidor internos y las entradas de usuario no válidas. Este servicio de ejemplo devuelve un error de servidor interno para todos los errores de línea de comandos de punto, a menos que el mensaje de error contenga la cadena syntax
, que indica un problema de entrada del usuario.
Generar un diagrama
La lógica principal de la generación de diagramas usa la herramienta de línea de comandos dot para procesar el parámetro de entrada de descripción del gráfico y convertirlo en un diagrama en formato de imagen PNG.
Node.js
Python
Go
Java
Diseñar un servicio seguro
Las vulnerabilidades de la herramienta dot
son vulnerabilidades potenciales del servicio web. Para mitigar este problema, puedes usar versiones actualizadas del paquete graphviz
recompilando la imagen del contenedor de forma periódica.
Si amplías la muestra actual para que acepte datos introducidos por el usuario como parámetros de línea de comandos, debes protegerte contra los ataques de inyección de comandos. Estas son algunas de las formas de evitar los ataques de inyección:
- Asignar entradas a un diccionario de parámetros admitidos
- Validar que las entradas coincidan con un intervalo de valores seguros conocidos, quizás mediante expresiones regulares
- Escapar las entradas para asegurarse de que no se evalúe la sintaxis de shell
Puedes reducir aún más las posibles vulnerabilidades implementando el servicio con una cuenta de servicio a la que no se le hayan concedido permisos para usar los servicios de Google Cloud, en lugar de usar la cuenta predeterminada, que tiene permisos de uso común. Por este motivo, en los pasos de este tutorial se crea y se usa una cuenta de servicio.
Envío del código
Para enviar tu código, compílalo con Cloud Build, súbelo a Artifact Registry y despliégalo en Cloud Run:
Crea un Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
Sustituye:
- REPOSITORY: un nombre único para el repositorio. Los nombres de los repositorios deben ser únicos en cada ubicación de repositorio de un proyecto.
- REGION: la Google Cloud región que se va a usar en el repositorio de Artifact Registry.
Ejecuta el siguiente comando para compilar el contenedor y publicarlo en Artifact Registry.
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
Donde PROJECT_ID es el ID de tu proyecto Google Cloud y
graphviz
es el nombre que quieres dar a tu servicio.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 quieres.
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
Donde PROJECT_ID es el ID de tu proyecto Google Cloud y
graphviz
es el nombre que quieres dar a tu servicio.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 reutilizar si se quiere.
Go
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
Donde PROJECT_ID es el ID de tu proyecto Google Cloud y
graphviz
es el nombre que quieres dar a tu servicio.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 reutilizar si se quiere.
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/graphviz-base
Donde PROJECT_ID es el ID de tu proyecto Google Cloud .
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/graphviz \ -Djib.from.image=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz-base
Donde PROJECT_ID es el ID de tu proyecto Google Cloud .
Implementa con lo siguiente:
gcloud
- Crear una nueva cuenta de servicio. Tu código, incluidos los paquetes del sistema que utilice, solo puede usar losGoogle Cloud servicios a los que se haya concedido acceso a esta cuenta de servicio.
Donde SA_NAME es el nombre que le das a esta cuenta de servicio. Si hay un error o una vulnerabilidad en tu código, este no podrá acceder a ninguno de los recursos de tus otros proyectos. Google Cloudgcloud iam service-accounts create SA_NAME
- Implementa el código y especifica la cuenta de servicio.
Donde PROJECT_ID es el ID de tu proyecto, SA_NAME es el nombre de la cuenta de servicio que has creado,gcloud run deploy graphviz-web --service-account SA_NAME@PROJECT_ID.iam.gserviceaccount.com --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
graphviz
es el nombre del contenedor de arriba ygraphviz-web
es el nombre del servicio. Google Cloud RespondeY
a la petición "allow unauthenticated" (permitir sin autenticar). Consulta Gestionar el acceso para obtener más información sobre la autenticación basada en IAM. - Espera a que finalice la implementación. Este proceso puede tardar aproximadamente medio minuto. Si la acción se realiza correctamente, la línea de comandos mostrará la URL del servicio.
Terraform
Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.
El siguiente código de Terraform crea un servicio de Cloud Run.
Sustituye IMAGE_URL por una referencia a la imagen de contenedor. Por ejemplo,
us-docker.pkg.dev/cloudrun/container/hello:latest
. Si usas Artifact Registry, el repositorio REPO_NAME ya debe estar creado. La URL sigue el formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
.El siguiente código de Terraform hace que tu servicio de Cloud Run sea público.
- Crear una nueva cuenta de servicio. Tu código, incluidos los paquetes del sistema que utilice, solo puede usar losGoogle Cloud servicios a los que se haya concedido acceso a esta cuenta de servicio.
Si quieres implementar una actualización de código en el servicio, repite los pasos anteriores. Cada despliegue en un servicio crea una nueva revisión y empieza a servir tráfico automáticamente cuando está listo.
Pruébalo
Prueba tu servicio enviando solicitudes HTTP POST
con descripciones de sintaxis DOT en la carga útil de la solicitud.
Envía una solicitud HTTP a tu servicio.
Copia la URL en la barra de direcciones del navegador y actualiza
[SERVICE_DOMAIN]
:https://SERVICE_DOMAIN/diagram.png?dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }
Puedes insertar el diagrama en una página web:
<img src="https://SERVICE_DOMAIN/diagram.png?dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" />
Abre el archivo
diagram.png
resultante en cualquier aplicación que admita archivosPNG
, como Chrome.Debería tener este aspecto:
Fuente: Descripción de DoT
Puedes consultar una pequeña colección de descripciones de diagramas prediseñadas.
- Copia el contenido del archivo
.dot
seleccionado. Envía una solicitud HTTP a tu servicio.
Copia la URL en la barra de direcciones del navegador.
https://SERVICE_DOMAIN/diagram.png?dot=SELECTED DOTFILE CONTENTS