Este tutorial explica como criar um aplicativo seguro de dois serviços em execução no Cloud Run. Esse aplicativo é um editor Markdown que inclui um serviço "front-end" público que qualquer um pode usar para escrever texto de markdown e um serviço de "back-end" particular que renderiza o texto de Markdown para HTML.
O serviço de back-end é privado, usando o recurso de Autenticação de serviço a serviço com base em IAM integrado ao Cloud Run, que limita quem pode chamar o serviço. Os dois serviços são criados com o princípio de menor privilégio, sem acesso ao restante do Google Cloud, exceto quando necessário.
Limitações ou objetivos não abarcados por este tutorial
Neste tutorial, não mostramos a autenticação do usuário final, que usa o Identity Platform ou o Firebase Authentication para gerar tokens de ID do usuário e verificar manualmente as identidades dos usuários. Para saber mais sobre a autenticação de usuários finais, consulte o tutorial do Cloud Run sobre autenticação do usuário final.
Neste tutorial, não mostramos como combinar métodos de autenticação baseados em IAM e o token de ID, porque a combinação não é compatível.
Objetivos
- Criar uma conta de serviço dedicada com permissões mínimas de autenticação de serviço a serviço e acesso de serviço ao restante do Google Cloud.
- Gravar, criar e implantar dois serviços no Cloud Run que interagem.
- Fazer solicitações entre um serviço público e privado do Cloud Run.
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.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run API.
- Instale e inicialize a CLI gcloud.
- Instale o curl para testar o serviço
Funções exigidas
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
) -
Administrador de projetos do IAM (
roles/resourcemanager.projectIamAdmin
) -
Usuário da conta de serviço (
roles/iam.serviceAccountUser
) -
Consumidor do Service Usage (
roles/serviceusage.serviceUsageConsumer
) -
Administrador de armazenamento (
roles/storage.admin
) -
Administrador do repositório do Artifact Registry (
roles/artifactregistry.repoAdmin
)
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de 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
(Madri) Baixo CO2europe-west1
(Bélgica) Baixo CO2europe-west4
(Países Baixos) Baixo CO2europe-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) Baixo CO2us-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) Baixo CO2europe-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 app de amostra no Cloud Shell ou 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.
C#
git clone https://github.com/GoogleCloudPlatform/dotnet-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/markdown-preview/
Python
cd python-docs-samples/run/markdown-preview/
Go
cd golang-samples/run/markdown-preview/
Java
cd java-docs-samples/run/markdown-preview/
C#
cd dotnet-docs-samples/run/markdown-preview/
Como revisar o serviço de renderização Markdown privado
Do ponto de vista do front-end, há uma especificação simples da API para o serviço do Markdown:
- Um endpoint em
/
- Espera solicitações POST
- O corpo da solicitação POST é o texto Markdown
Analise todo o código em busca de problemas de segurança ou saiba mais sobre ele explorando o diretório ./renderer/
. O tutorial não explica o código de transformação do Markdown.
Como enviar o serviço de renderização Markdown privado
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:
Altere para o diretório
renderer
:Node.js
cd renderer/
Python
cd renderer/
Go
cd renderer/
Java
cd renderer/
C#
cd Samples.Run.MarkdownPreview.Renderer/
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/renderer
Em que PROJECT_ID é o ID do projeto do Google Cloud e
renderer
é 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/renderer
Em que PROJECT_ID é o ID do projeto do Google Cloud e
renderer
é 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/renderer
Em que PROJECT_ID é o ID do projeto do Google Cloud e
renderer
é 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.
Use o auxiliar de credencial do gcloud para autorizar o Docker a enviar por push ao Artifact Registry.
gcloud auth configure-docker
Use o plug-in do Maven do Jib para criar e enviar por push o contêiner ao Artifact Registry.
mvn compile jib:build -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
Em que PROJECT_ID é o ID do projeto do Google Cloud e
renderer
é o nome que você quer dar ao seu serviço.Após a conclusão, você receberá uma mensagem "BUILD SUCCESS". A imagem é armazenada no Artifact Registry e pode ser reutilizada.
C#
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
Em que PROJECT_ID é o ID do projeto do Google Cloud e
renderer
é 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.
Implante como um serviço particular com acesso restrito.
O Cloud Run oferece recursos de controle de acesso e identidade de serviço prontos para uso. O controle de acesso fornece uma camada de autenticação que impede que usuários e outros serviços invoquem o serviço. A identidade de serviço permite impedir que o serviço acesse outros recursos do Google Cloud criando uma conta de serviço dedicada com permissões limitadas.
Crie uma conta de serviço para servir como a “identidade de computação” do serviço de renderização. Por padrão, ela não tem privilégios além da associação ao projeto.
Linha de comando
gcloud iam service-accounts create renderer-identity
Terraform
Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.
O serviço de renderização Markdown não se integra diretamente a nada no Google Cloud. Ele não precisa de mais permissões.
Implante com a conta de serviço
renderer-identity
e negue o acesso não autenticado.Linha de comando
gcloud run deploy renderer \ --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer \ --service-account renderer-identity \ --no-allow-unauthenticated
O Cloud Run pode usar o nome da conta do serviço de formulário curto em vez do endereço de e-mail completo se a conta de serviço fizer parte do mesmo projeto.
Terraform
Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.
Como testar o serviço de renderização Markdown privado
Os serviços privados não podem ser carregados diretamente por um navegador da Web. Em vez disso, use curl
ou uma ferramenta de CLI de solicitação HTTP semelhante que permita injetar um cabeçalho Authorization
.
Para enviar um texto em negrito ao serviço e vê-lo converter os asteriscos de marcação em tags HTML <strong>
:
Receba o URL da saída da implantação.
Use
gcloud
para derivar um token de identidade especial somente para desenvolvimento para autenticação:TOKEN=$(gcloud auth print-identity-token)
Crie uma solicitação de curl que transmita o texto bruto de Markdown como um parâmetro de string de consulta com escape de URL:
curl -H "Authorization: Bearer $TOKEN" \ -H 'Content-Type: text/plain' \ -d '**Hello Bold Text**' \ SERVICE_URL
Substitua SERVICE_URL pelo URL fornecido após a implantação do serviço de renderização Markdown.
A resposta será um snippet HTML:
<strong>Hello Bold Text</strong>
Como analisar a integração entre o editor e os serviços de renderização
O serviço de edição fornece uma IU de entrada de texto simples e um espaço para visualização de HTML. Antes de continuar, revise o código recuperado anteriormente abrindo o diretório ./editor/
.
Em seguida, explore as seguintes seções de código que integram com segurança os dois serviços.
Node.js
O módulo render.js
cria solicitações autenticadas para o serviço de renderizador particular. Ele usa o servidor de metadados do Google Cloud no ambiente do Cloud Run para criar um token de identidade e adicioná-lo à solicitação HTTP como parte de um cabeçalho Authorization
.
Em outros ambientes, render.js
usa o Application Default Credentials para solicitar um token dos servidores do Google.
Analise a marcação a partir do JSON e envie-a ao serviço do Renderizador para ser transformada em HTML.
Python
O método new_request
cria solicitações autenticadas para serviços particulares.
Ele usa o servidor de metadados do Google Cloud no ambiente do Cloud Run para criar um token de identidade e adicioná-lo à solicitação HTTP como parte de um cabeçalho Authorization
.
Em outros ambientes, new_request
solicita um token de identidade dos servidores do Google, fazendo a autenticação com Application Default Credentials.
Analise a marcação a partir do JSON e envie-a ao serviço do Renderizador para ser transformada em HTML.
Go
RenderService
cria solicitações autenticadas para serviços particulares. Ele usa o servidor de metadados do Google Cloud no ambiente do Cloud Run para criar um token de identidade e adicioná-lo à solicitação HTTP como parte de um cabeçalho Authorization
.
Em outros ambientes, RenderService
solicita um token de identidade dos servidores do Google, fazendo a autenticação com Application Default Credentials.
A solicitação é enviada ao serviço renderizador após adicionar o texto de marcação a ser transformado em HTML. Os erros de resposta são tratados diferenciando problemas de comunicação e funcionalidade de renderização.
Java
makeAuthenticatedRequest
cria solicitações autenticadas para serviços particulares. Ele usa o servidor de metadados do Google Cloud no ambiente do Cloud Run para criar um token de identidade e adicioná-lo à solicitação HTTP como parte de um cabeçalho Authorization
.
Em outros ambientes, makeAuthenticatedRequest
solicita um token de identidade dos servidores do Google, fazendo a autenticação com Application Default Credentials.
Analise a marcação a partir do JSON e envie-a ao serviço do Renderizador para ser transformada em HTML.
C#
GetAuthenticatedPostResponse
cria solicitações autenticadas para serviços particulares. Ele usa o servidor de metadados do Google Cloud no ambiente do Cloud Run para criar um token de identidade e adicioná-lo à solicitação HTTP como parte de um cabeçalho Authorization
.
Em outros ambientes, GetAuthenticatedPostResponse
solicita um token de identidade dos servidores do Google, fazendo a autenticação com Application Default Credentials.
Analise a marcação a partir do JSON e envie-a ao serviço do Renderizador para ser transformada em HTML.
Como enviar o serviço de editor público
Para criar e implantar seu código:
Altere para o diretório
editor
:Node.js
cd ../editor
Python
cd ../editor
Go
cd ../editor
Java
cd ../editor
C#
cd ../Samples.Run.MarkdownPreview.Editor/
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/editor
Em que PROJECT_ID é o ID do projeto do Google Cloud e
editor
é 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 Container Registry e poderá ser reutilizada, se você quiser.
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
Em que PROJECT_ID é o ID do projeto do Google Cloud e
editor
é 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/editor
Em que PROJECT_ID é o ID do projeto do Google Cloud e
editor
é 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.mvn compile jib:build -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
Em que PROJECT_ID é o ID do projeto do Google Cloud e
editor
é o nome que você quer dar ao seu serviço.Após a conclusão, você receberá uma mensagem "BUILD SUCCESS". A imagem é armazenada no Artifact Registry e pode ser reutilizada.
C#
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
Em que PROJECT_ID é o ID do projeto do Google Cloud e
editor
é 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.
Implante como um serviço particular com acesso especial ao serviço de renderização.
Crie uma conta de serviço para servir como a “identidade de computação” do serviço particular. Por padrão, ela não tem privilégios além da associação ao projeto.
Linha de comando
gcloud iam service-accounts create editor-identity
Terraform
Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.
O serviço Editor não precisa interagir com mais nada no Google Cloud além do serviço de renderização Markdown.
Conceda acesso à identidade de computação
editor-identity
para invocar o serviço de renderização Markdown. Qualquer serviço que use isso como uma identidade de computação terá esse privilégio.Linha de comando
gcloud run services add-iam-policy-binding renderer \ --member serviceAccount:editor-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/run.invoker
Terraform
Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.
Como isso recebe o papel de invocador no contexto do serviço de renderização, o serviço de renderização é o único serviço privado do Cloud Run que o editor pode invocar.
Implante com a conta de serviço
editor-identity
e permita acesso público e não autenticado.Linha de comando
gcloud run deploy editor --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor \ --service-account editor-identity \ --set-env-vars EDITOR_UPSTREAM_RENDER_URL=SERVICE_URL \ --allow-unauthenticated
Substitua:
- PROJECT_ID pelo ID do projeto;
- SERVICE_URL pelo URL fornecido após a implantação do serviço de renderização Markdown.
Terraform
Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.
Implante o serviço de editor:
Conceda à permissão
allUsers
a invocação do serviço:
Noções básicas sobre o tráfego HTTPS
Há três solicitações HTTP envolvidas na renderização de marcação usando esses serviços.
Como testar
Para testar o aplicativo de dois serviços completo:
Navegue até o URL fornecido pela etapa de implantação acima.
Tente editar o texto Markdown à esquerda e clique no botão para visualizá-lo à direita.
O resultado será parecido com este:
Se você optar por continuar desenvolvendo esses serviços, lembre-se de que eles têm acesso restrito do gerenciamento de identidade e acesso (IAM, na sigla em inglês) ao restante do Google Cloud e precisarão receber mais papéis do IAM para acessar muitos outros serviços.
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 os serviços do Cloud Run que você implantou neste tutorial:
gcloud
gcloud run services delete editor gcloud run services delete renderer
Também é possível excluir os serviços do Cloud Run no console do Google Cloud.
Remova as configurações padrão do 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 do editor com o nome
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
do Artifact Registry - Exclua a imagem do contêiner do renderizador com o nome
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
do Artifact Registry - Exclua a conta de serviço do editor
editor-identity@PROJECT_ID.iam.gserviceaccount.com
- Exclua a conta de serviço de renderização
renderer-identity@PROJECT_ID.iam.gserviceaccount.com
- Exclua a imagem do contêiner do editor com o nome
A seguir
- Proteja ainda mais seu projeto percorrendo a lista de verificação usando o IAM de forma segura
- Estenda este exemplo de aplicativo para rastrear o uso de Markdown com métricas personalizadas do Cloud Monitoring
- Consulte o tutorial do Pub/Sub para uma abordagem de microsserviços seguros e assíncronos