Neste tutorial, mostramos como criar um serviço de votação com o seguinte:
Um cliente baseado em navegador que:
- usa o Identity Platform para buscar um token de ID;
- permite que os usuários votem no animal de estimação favorito;
- adiciona esse token de ID para uma solicitação ao servidor do Cloud Run que processa o voto.
Um servidor do Cloud Run que:
- verifica se o usuário final foi autenticado corretamente fornecendo um token de ID válido;
- processa o voto do usuário final;
- usa as próprias credenciais para enviar o voto ao Cloud SQL para armazenamento.
Um banco de dados PostgresSQL que armazena os votos.
Para simplificar, este tutorial usa o Google como provedor: os usuários precisam fazer a autenticação usando uma Conta do Google para receber o token de ID. No entanto, é possível usar outros provedores ou métodos de autenticação para fazer login de usuários.
Esse serviço reduz riscos de segurança usando o Secret Manager para proteger dados confidenciais usados para se conectar à instância do Cloud SQL. Ele também usa uma identidade de serviço com privilégio mínimo para proteger o acesso ao banco de dados.
Objetivos
Grave, crie e implante um serviço no Cloud Run que mostra como:
Use o Identity Platform para autenticar um usuário final no back-end do serviço do Cloud Run.
Crie uma identidade com privilégio mínimo para que o serviço conceda acesso mínimo aos recursos do Google Cloud.
Use o Secret Manager para processar dados confidenciais ao conectar o serviço Cloud Run a um banco de dados PostgreSQL.
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, Secret Manager, Cloud SQL, Artifact Registry, and Cloud Build APIs.
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 projeto:
-
Administrador do repositório do Artifact Registry (
roles/artifactregistry.repoAdmin
) -
Editor do Cloud Build (
roles/cloudbuild.builds.editor
) -
Administrador do Cloud Run (
roles/run.admin
) -
Administrador do Cloud SQL (
roles/cloudsql.admin
) -
Criar contas de serviço (
roles/iam.serviceAccountCreator
) -
Administrador do Identity Platform (
roles/identityplatform.admin
) -
Editor de configuração OAuth (
roles/oauthconfig.editor
) -
Administrador de projetos do IAM (
roles/resourcemanager.projectIamAdmin
) -
Administrador do Secret Manager (
roles/secretmanager.admin
) -
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 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.
Configuração dos padrões 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 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.
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/idp-sql/
Python
cd python-docs-samples/run/idp-sql/
Java
cd java-docs-samples/run/idp-sql/
Como visualizar a arquitetura
Um usuário final faz a primeira solicitação ao servidor do Cloud Run.
O cliente é carregado no navegador.
O usuário fornece credenciais de login na caixa de diálogo de Login do Google do Identity Platform. Um alerta de aceitação do usuário conectado é exibido.
O controle é redirecionado de volta para o servidor. O usuário final vota usando o cliente, que busca um token de ID do Identity Platform e o adiciona ao cabeçalho da solicitação de voto.
Ao receber a solicitação, o servidor verifica o token de ID do Identity Platform, confirmando se o usuário final está devidamente autenticado. Em seguida, o servidor envia o voto para o Cloud SQL, usando suas próprias credenciais.
Noções básicas sobre o código principal
A amostra é implementada como cliente e servidor, conforme descrito a seguir.
Integração com o Identity Platform: código do lado do cliente
Este exemplo usa SDKs do Firebase para integração com o Identity Platform a fim de fazer login e gerenciar usuários. Para se conectar ao Identity Platform, o JavaScript do lado do cliente mantém a referência às credenciais do projeto como um objeto de configuração e importa os SDKs do Firebase para JavaScript necessários:
O SDK do Firebase para JavaScript processa o fluxo de login solicitando que o usuário final faça login na Conta do Google em uma janela pop-up. Em seguida, ele o redireciona de volta para o serviço.
Quando um usuário faz login corretamente, o cliente usa os métodos do Firebase para produzir um token de ID. O cliente adiciona o token de ID ao cabeçalho Authorization
da solicitação
para o servidor.
Integração com o Identity Platform: código do lado do servidor
O servidor usa o SDK Admin do Firebase
para verificar o token do ID do usuário enviado pelo cliente. Se o token de ID fornecido tiver o formato correto, não tiver expirado e estiver devidamente assinado, o método retornará o token de ID decodificado. O servidor extrai o uid
do Identity Platform para esse usuário.
Node.js
Python
Java
Como conectar o servidor ao Cloud SQL
O servidor conecta-se ao soquete do domínio Unix da instância do Cloud SQL usando o formato: /cloudsql/CLOUD_SQL_CONNECTION_NAME
.
Node.js
Python
Java
Use a integração de ativação do Spring Cloud Google Cloud PostgreSQL para interagir com os bancos de dados do PostgreSQL no Cloud SQL usando bibliotecas JDBC do Spring. Defina o Cloud SQL para MySQL para configurar automaticamente um beanDataSource
, que, junto do Spring JDBC, fornece um objeto JdbcTemplate
que permite operações como consulta e modificação de um banco de dados.
Como lidar com configurações confidenciais com o Gerenciador de secrets
O Secret Manager permite o armazenamento centralizado e seguro de dados sensíveis, como a configuração do Cloud SQL. O servidor usa uma variável de ambiente para injetar no ambiente de execução as credenciais do Cloud SQL contidas no Secret Manager. Saiba mais sobre como usar secrets com o Cloud Run.
Node.js
Python
Java
Configurar o Identity Platform
O Identity Platform requer a configuração manual no console do Google Cloud.
No console do Google Cloud, acesse a página do Marketplace do Identity Platform.
Clique em Ativar Identity Platform.
Crie sua tela de permissão OAuth:
Em uma nova janela, acesse a página APIs e serviços > Credenciais.
Selecione a página Tela de permissão OAuth.
Para fins de teste, selecione Externo.
Clique em Criar.
Na caixa de diálogo Informações do aplicativo,
- informe o nome do aplicativo;
- selecione um dos e-mails exibidos de suporte ao usuário;
- insira o e-mail que você quer usar como contato do desenvolvedor.
Clique em Salvar e continuar.
Na caixa de diálogo Escopos, clique em Salvar e continuar.
Na caixa de diálogo Testar usuários, clique em Salvar e continuar.
Na caixa de diálogo Resumo, clique em Voltar ao painel.
Em Status da publicação, clique em Publicar aplicativo.
Clique em Confirmar.
Crie e consiga seu ID do cliente OAuth e Secret:
Na parte superior da página, clique em Criar credenciais e selecione
OAuth client ID
.Em Tipo de aplicativo, selecione Web app e informe o nome.
Clique em Criar.
Anote
client_id
eclient_secret
para uso posterior neste procedimento.
Configure o Google como provedor:
Acesse a página "Provedores de identidade" no Console do Cloud.
Clique em Adicionar um provedor.
Selecione Google na lista.
Nas definições da configuração do SDK da Web, insira os valores
client_id
eclient_secret
das etapas anteriores.Em Configurar seu aplicativo, clique em Detalhes de configuração.
Copie os valores
apiKey
eauthDomain
nostatic/config.js
da amostra para inicializar o SDK do cliente do Identity Platform.Clique em Salvar.
Como implantar o serviço
Siga as etapas abaixo para concluir o provisionamento e a implantação da infraestrutura ou automatizar o processo no Cloud Shell clicando em "Executar no Google Cloud":
Crie uma instância do Cloud SQL com um banco de dados PostgreSQL usando o console ou a CLI:
gcloud sql instances create CLOUD_SQL_INSTANCE_NAME \ --database-version=POSTGRES_12 \ --region=CLOUD_SQL_REGION \ --cpu=2 \ --memory=7680MB \ --root-password=DB_PASSWORD
Adicione seus valores da credencial do Cloud SQL a
postgres-secrets.json
:Node.js
Python
Java
Crie um secret com controle de versões usando o console ou a CLI:
gcloud secrets create idp-sql-secrets \ --replication-policy="automatic" \ --data-file=postgres-secrets.json
Crie uma conta de serviço para o servidor usando o console ou a CLI:
gcloud iam service-accounts create idp-sql-identity
Conceda papéis para acesso ao Secret Manager e ao Cloud SQL usando o console ou a CLI:
Permita que a conta de serviço associada ao servidor acesse o secret criado:
gcloud secrets add-iam-policy-binding idp-sql-secrets \ --member serviceAccount:idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
Permita que a conta de serviço associada ao servidor acesse o Cloud SQL:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudsql.client
Crie um Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
REPOSITORY
é o nome do repositório. Para cada local de repositório em um projeto, os nomes dos repositórios precisam ser exclusivos.
Crie a imagem do contêiner usando o Cloud Build:
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
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/idp-sql
Implante a imagem de contêiner no Cloud Run usando o console ou a CLI. O servidor é implantado para permitir o acesso não autenticado. Dessa maneira, o usuário pode carregar o cliente e iniciar o processo. O servidor verifica manualmente o token de ID adicionado à solicitação de votação, autenticando o usuário final.
gcloud run deploy idp-sql \ --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql \ --allow-unauthenticated \ --service-account idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --add-cloudsql-instances PROJECT_ID:REGION:CLOUD_SQL_INSTANCE_NAME \ --update-secrets CLOUD_SQL_CREDENTIALS_SECRET=idp-sql-secrets:latest
Observe também as flags
--service-account
,--add-cloudsql-instances
e--update-secrets
, que especificam a identidade do serviço, a conexão da instância do Cloud SQL e o nome do secret com a versão como variável de ambiente, respectivamente.
Toques finais
O Identity Platform exige que você autorize o URL de serviço do Cloud Run como um redirecionamento permitido depois de fazer login do usuário:
Para editar o provedor do Google, clique no ícone de caneta na página Provedores de identidade.
Clique em Adicionar domínio em "Domínios autorizados" no painel à direita e insira o URL do serviço do Cloud Run.
Localize o URL do serviço nos registros após a criação ou implantação ou encontre-o a qualquer momento usando:
gcloud run services describe idp-sql --format 'value(status.url)'
Acesse a página APIs e serviços > Credenciais
Clique no ícone do lápis ao lado do seu ID do cliente OAuth para editá-lo e no botão Adicionar URI
Authorized redirect URIs click the
.No campo, copie e cole o URL a seguir e clique no botão Salvar na parte inferior da página.
https://PROJECT_ID.firebaseapp.com/__/auth/handler
Testar
Para testar o serviço completo:
Navegue até o URL fornecido pela etapa de implantação acima.
Clique no botão Fazer login com o Google e siga o fluxo de autenticação.
Dê seu voto!
Você verá o seguinte:
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 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:
A seguir
- Saiba mais sobre Como se conectar do Cloud Run ao Cloud SQL.
- Saiba mais sobre métodos de login e gerenciamento de usuários com o Identity Platform.
- Analise outras formas de autenticar desenvolvedores, serviços e usuários de serviços implantados no Cloud Run
- Conheça outras demonstrações, tutoriais e amostras do Cloud Run