Neste tutorial, mostramos como criar um serviço do Cloud Run
personalizado que transforma um parâmetro de entrada de descrição de gráfico em um diagrama no formato de
imagem PNG
. Ele usa o Graphviz e é instalado como um pacote de sistema no ambiente de contêiner do serviço.
O Graphviz é usado com utilitários de linha de comando para exibir solicitações.
Objetivos
- Gravar e criar um contêiner personalizado com um Dockerfile
- Gravar, criar e implantar um serviço do Cloud Run
- Usar o utilitário Graphviz dot para gerar diagramas
- Testar o serviço publicando um diagrama de sintaxe DOT da coleção ou criado por você
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Antes de começar
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
- Ative a API Cloud Run Admin
- Instale e inicialize a gcloud CLI.
- Atualize os componentes:
gcloud components update
Papéis obrigatórios
Para conseguir as permissões necessárias para concluir o tutorial, peça ao administrador para conceder a você os seguintes papéis do IAM no seu projeto:
-
Editor do Cloud Build (
roles/cloudbuild.builds.editor
) -
Administrador do Cloud Run (
roles/run.admin
) -
Criar contas de serviço (
roles/iam.serviceAccountCreator
) -
Usuário da conta de serviço (
roles/iam.serviceAccountUser
) -
Consumidor do Service Usage (
roles/serviceusage.serviceUsageConsumer
) -
Administrador de armazenamento (
roles/storage.admin
)
Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.
Também é possível conseguir as permissões necessárias com papéis personalizados ou outros papéis predefinidos.
Como configurar padrões do gcloud
Para configurar a gcloud com os padrões do serviço do Cloud Run, realize as etapas a seguir:
Defina seu projeto padrão:
gcloud config set project PROJECT_ID
Substitua PROJECT_ID pelo nome do projeto que você criou para este tutorial.
Configure a gcloud para a região escolhida:
gcloud config set run/region REGION
Substitua REGION pela região compatível do Cloud Run.
Locais do Cloud Run
O Cloud Run é regional, o que significa que a infraestrutura que executa seus serviços do Cloud Run está localizada em uma região específica e é gerenciada pelo Google para estar disponível de maneira redundante em todas as zonas da região.
Atender aos seus requisitos de latência, disponibilidade ou durabilidade são os principais fatores para selecionar a região em que seus serviços do Cloud Run são executados.
Geralmente, é possível selecionar a região mais próxima de seus usuários, mas considere a localização dos outros produtos do Google Cloud usados pelo serviço do Cloud Run.
O uso de produtos do Google Cloud em vários locais pode afetar a latência e o custo do serviço.
O Cloud Run está disponível nas regiões a seguir:
Sujeitas aos preços do nível 1
asia-east1
(Taiwan)asia-northeast1
(Tóquio)asia-northeast2
(Osaka)europe-north1
(Finlândia) Baixo CO2europe-southwest1
(Madrid)europe-west1
(Bélgica) Baixo CO₂europe-west4
(Países Baixos)europe-west8
(Milão)europe-west9
(Paris) Baixo CO2me-west1
(Tel Aviv)us-central1
(Iowa) Baixo CO2us-east1
(Carolina do Sul)us-east4
(Norte da Virgínia)us-east5
(Columbus)us-south1
(Dallas)us-west1
(Oregon) Baixo CO2
Sujeitas aos preços do nível 2
africa-south1
(Johannesburgo)asia-east2
(Hong Kong)asia-northeast3
(Seul, Coreia do Sul)asia-southeast1
(Singapura)asia-southeast2
(Jacarta)asia-south1
(Mumbai, Índia)asia-south2
(Déli, Índia)australia-southeast1
(Sydney)australia-southeast2
(Melbourne)europe-central2
(Varsóvia, Polônia)europe-west10
(Berlim)europe-west12
(Turim)europe-west2
(Londres, Reino Unido) Baixo CO2europe-west3
(Frankfurt, Alemanha) Baixo CO2europe-west6
(Zurique, Suíça) Baixo CO2me-central1
(Doha)me-central2
(Damã)northamerica-northeast1
(Montreal) Baixo CO2northamerica-northeast2
(Toronto) Baixo CO2southamerica-east1
(São Paulo, Brasil) Baixo CO2southamerica-west1
(Santiago, Chile) Baixo CO2us-west2
(Los Angeles)us-west3
(Salt Lake City)us-west4
(Las Vegas)
Se você já criou um serviço do Cloud Run, é possível visualizar a região no painel do Cloud Run no console do Google Cloud.
Como recuperar o exemplo de código
Para recuperar o exemplo de código para uso, siga estas etapas:
Clone o repositório do aplicativo de amostra na máquina local:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Outra alternativa é fazer o download da amostra como um arquivo ZIP e extraí-lo.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Outra alternativa é fazer o download da amostra como um arquivo ZIP e extraí-lo.
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
Outra alternativa é fazer o download da amostra como um arquivo ZIP e extraí-lo.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
Outra alternativa é fazer o download da amostra como um arquivo ZIP e extraí-lo.
Mude para o diretório que contém o código de amostra do 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/
Como visualizar a arquitetura
A arquitetura básica é assim:
O usuário faz uma solicitação HTTP para o serviço Cloud Run, que executa um utilitário Graphviz para transformar a solicitação em uma imagem. Essa imagem é entregue ao usuário como a resposta HTTP.
Como entender o código
Como definir a configuração do ambiente com o Dockerfile
O Dockerfile
é específico para a linguagem e o ambiente operacional base, como o Ubuntu, que o serviço usará.
O Guia de início rápido de compilação e implantação mostra vários Dockerfiles
que podem ser usados como ponto de partida para criar um Dockerfile
para outros serviços.
Para este serviço, um ou mais pacotes de sistema não disponíveis por padrão são requisitados.
Abra o
Dockerfile
em um editor.Procure uma instrução
Dockerfile
RUN
. Essa instrução permite executar comandos do shell arbitrários para modificar o ambiente. Se oDockerfile
tiver vários estágios, identificados ao encontrar várias instruçõesFROM
, ele será encontrado no último estágio.Os pacotes específicos necessários e o mecanismo para instalá-los variam de acordo com o sistema operacional declarado dentro do contêiner.
Para ver instruções sobre o sistema operacional ou sobre a imagem base, clique na guia adequada.
Debian/Ubuntu Alpine O Alpine requer um segundo pacote para oferecer compatibilidade com fontes.Para determinar o sistema operacional da imagem do contêiner, verifique o nome na instrução
FROM
ou um README associado à imagem base. Por exemplo, se você estender denode
, poderá encontrar a documentação e oDockerfile
pai no Docker Hub (em inglês).Teste sua personalização criando a imagem. Use o
docker build
localmente ou o Cloud Build.
Como processar as solicitações recebidas
O serviço de amostra usa parâmetros da solicitação HTTP recebida para invocar uma chamada do sistema que executa o comando do utilitário dot
adequado.
No manipulador HTTP abaixo, um parâmetro de entrada de descrição de gráfico é extraído da variável querystring dot
.
As descrições de gráficos podem incluir caracteres que precisam ser codificados em URL (em inglês) para uso em uma querystring.
Node.js
Python
Go
Java
Será preciso diferenciar entre erros internos do servidor e entradas inválidas
do usuário. Este exemplo de serviço retorna um erro interno do servidor para todos os erros de linha de comando de ponto, a menos que a mensagem de erro contenha a string syntax
, que indica um problema de entrada do usuário.
Como gerar um diagrama
A lógica central da geração de diagramas usa a ferramenta de linha de comando do dot para processar o parâmetro de entrada da descrição do gráfico em um diagrama no formato de imagem PNG.
Node.js
Python
Go
Java
Como criar um serviço seguro
Quaisquer vulnerabilidades na ferramenta dot
são possíveis pontos de fragilidade do serviço da Web. É possível atenuar isso usando versões atualizadas do pacote graphviz
com a recriação regular da imagem do contêiner.
Se você estende a amostra atual para aceitar a entrada do usuário como parâmetros de linha de comando, proteja-se contra ataques de injeção de comandos (em inglês). Algumas das formas de evitar ataques por injeção incluem:
- o mapeamento de entradas para um dicionário de parâmetros compatíveis;
- a validação de entradas para ver se correspondem a um intervalo de valores seguros conhecidos, talvez usando expressões regulares;
- o escape de entradas para garantir que a sintaxe do shell não seja avaliada.
É possível reduzir ainda mais as possíveis vulnerabilidades ao implantar o serviço com uma conta de serviço que não tenha recebido permissões para usar os serviços do Google Cloud em vez de usar a conta padrão, que tem permissões usadas com frequência. Por esse motivo, as etapas neste tutorial criam e usam uma nova conta de serviço.
Como enviar o código
Para enviar o código, crie-o com o Cloud Build, faça o upload dele para o Artifact Registry e implante-o no Cloud Run:
Crie um Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
Substitua:
- REPOSITORY por um nome exclusivo para o repositório. Para cada local de repositório em um projeto, os nomes dos repositórios precisam ser exclusivos.
- REGION pela região do Google Cloud a ser usada para o repositório do Artifact Registry.
Execute o comando a seguir para criar o contêiner e o publique no Artifact Registry.
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
Em que PROJECT_ID é o ID do projeto do Google Cloud e
graphviz
é o nome que você quer dar ao seu serviço.Após a conclusão, você receberá uma mensagem de SUCESSO com o ID, a hora da criação e o nome da imagem. A imagem é armazenada no Artifact Registry e pode ser reutilizada.
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
Em que PROJECT_ID é o ID do projeto do Google Cloud e
graphviz
é o nome que você quer dar ao seu serviço.Após a conclusão, você receberá uma mensagem de SUCESSO com o ID, a hora da criação e o nome da imagem. A imagem é armazenada no Artifact Registry e pode ser reutilizada.
Go
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
Em que PROJECT_ID é o ID do projeto do Google Cloud e
graphviz
é o nome que você quer dar ao seu serviço.Após a conclusão, você receberá uma mensagem de SUCESSO com o ID, a hora da criação e o nome da imagem. A imagem é armazenada no Artifact Registry e pode ser reutilizada.
Java
Esta amostra usa o Jib (em inglês) para criar imagens do Docker usando ferramentas comuns do Java. O Jib otimiza builds de contêiner sem a necessidade de um Dockerfile ou de ter o Docker (em inglês) instalado. Saiba mais sobre como criar contêineres Java com o Jib.Usando o Dockerfile, configure e crie uma imagem base com os pacotes do sistema instalados para substituir a imagem base padrão do Jib:
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz-base
em que PROJECT_ID é o ID do projeto no Google Cloud.
Use o auxiliar de credencial da gcloud para autorizar o Docker a fazer o envio por push ao Artifact Registry.
gcloud auth configure-docker
Crie seu contêiner final com o Jib e publique no 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
em que PROJECT_ID é o ID do projeto no Google Cloud.
Implante usando o seguinte:
gcloud
- Crie uma nova conta de serviço. O código, incluindo os pacotes de sistema
que ele usa, pode usar apenas os
serviços do Google Cloud que foram concedidos a essa conta de serviço.
gcloud iam service-accounts create SA_NAME
Em que SA_NAME é o nome atribuído a esta conta de serviço. Se houver um erro ou uma vulnerabilidade no seu código, ele não conseguirá acessar nenhum dos outros recursos do projeto do Google Cloud. - Implante o código, especificando a conta de serviço.
gcloud run deploy graphviz-web --service-account SA_NAME@PROJECT_ID.iam.gserviceaccount.com --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
Em que PROJECT_ID é o ID do projeto do Google Cloud, SA_NAME é o nome da conta de serviço que você criou,graphviz
é o nome do contêiner acima egraphviz-web
é o nome do serviço. RespondaY
ao prompt "allow unauthenticated". Consulte Como gerenciar o acesso para mais detalhes sobre a autenticação baseada em IAM. - Aguarde a conclusão da implantação. Isso pode levar cerca de meio minuto. Em caso de sucesso, a linha de comando exibe o URL de serviço.
Terraform
Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.
O código do Terraform a seguir cria um serviço do Cloud Run.
Substitua IMAGE_URL por uma referência à imagem de contêiner, por exemplo,
us-docker.pkg.dev/cloudrun/container/hello:latest
. Se você usa o Artifact Registry, o repositório REPO_NAME já precisará ter sido criado. O URL tem o formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
.O código a seguir do Terraform torna o serviço do Cloud Run público.
- Crie uma nova conta de serviço. O código, incluindo os pacotes de sistema
que ele usa, pode usar apenas os
serviços do Google Cloud que foram concedidos a essa conta de serviço.
Se você quer implantar uma atualização de código no serviço, repita as etapas anteriores. Cada implantação em um serviço cria uma nova revisão e inicia automaticamente o tráfego de serviço quando estiver pronto.
Teste
Teste seu serviço enviando solicitações HTTP POST
com descrições de sintaxe DOT na carga útil da solicitação.
Envie uma solicitação HTTP para o serviço.
Copie o URL na barra de endereço do navegador e atualize
[SERVICE_DOMAIN]
:https://SERVICE_DOMAIN/diagram.png?dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }
É possível incorporar o diagrama em uma página da Web:
<img src="https://SERVICE_DOMAIN/diagram.png?dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" />
Abra o arquivo
diagram.png
resultante em qualquer aplicativo compatível com arquivosPNG
, como o Chrome.A aparência será semelhante a esta:
É possível explorar uma pequena coleção de descrições de diagrama prontas (em inglês).
- Copie o conteúdo do arquivo
.dot
selecionado. Envie uma solicitação HTTP para o serviço.
Copie o URL na barra de endereço do navegador.
https://SERVICE_DOMAIN/diagram.png?dot=SELECTED DOTFILE CONTENTS
Limpar
Se você criou um novo projeto para este tutorial, exclua o projeto. Se você usou um projeto atual e quer mantê-lo sem as alterações incluídas neste tutorial, exclua os recursos criados para o tutorial.
Como excluir o projeto
O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.
Para excluir o projeto:
- 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.
Como excluir recursos do tutorial
Exclua o serviço do Cloud Run que você implantou neste tutorial:
gcloud run services delete SERVICE-NAME
SERVICE-NAME é o nome escolhido do serviço.
Também é possível excluir os serviços do Cloud Run no Console do Google Cloud.
Remova a configuração da região padrão da gcloud que você adicionou durante a configuração do tutorial:
gcloud config unset run/region
Remova a configuração do projeto:
gcloud config unset project
Exclua outros recursos do Google Cloud criados neste tutorial:
Exclua a imagem do contêiner com o nome
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
do Artifact Registry.Exclua a conta de serviço SA_NAME.
gcloud iam service-accounts delete SA_NAME@PROJECT_ID.iam.gserviceaccount.com
A seguir
- Teste com seu aplicativo graphviz:
- Adicione suporte para outros utilitários graphviz que aplicam algoritmos diferentes para a geração de diagramas.
- Salve diagramas no Cloud Storage. Você quer salvar a imagem ou a sintaxe do DOT?
- Implemente a proteção contra abuso de conteúdo com a API Cloud Natural Language.
- Veja outro exemplo de pacote do sistema no tutorial Processamento de imagens com o Cloud Run.
- Confira arquiteturas de referência, diagramas e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.