Se sua arquitetura estiver usando vários serviços, esses serviços provavelmente precisam se comunicar uns com os outros, usando meios síncronos ou assíncronos. Muitos desses serviços podem ser privados e exigir credenciais para acesso.
Para a comunicação assíncrona, é possível usar os seguintes serviços do Google Cloud:
- Cloud Tasks para comunicação assíncrona de um para um
- Pub/Sub para comunicação assíncrona de um para muitos, de um para um e de muitos para um
- Cloud Scheduler para comunicação assíncrona programada regularmente
- Eventarc para comunicação baseada em eventos
Em todos esses casos, o serviço usado gerencia a interação com o serviço de recebimento, com base na configuração definida.
Mas para a comunicação síncrona, o serviço chama outro serviço
diretamente, por HTTP, usando o URL do endpoint. Para este caso de uso, verifique
se cada serviço só pode fazer solicitações para serviços
específicos. Por exemplo, se você tiver um serviço login
, ele poderá
acessar o serviço user-profiles
, mas não o serviço search
.
Nessa situação, o Google recomenda usar o IAM e uma identidade de serviço baseada em uma conta de serviço gerenciada pelo usuário por serviço que tenha recebido o conjunto mínimo de permissões necessárias para fazer o trabalho.
Além disso, a solicitação precisa apresentar um comprovante da identidade do serviço de chamada. Para fazer isso, configure o serviço de chamada para adicionar um token de ID do OpenID Connect assinado pelo Google como parte da solicitação.
Configurar a conta de serviço
Para configurar uma conta de serviço, configure o serviço de recebimento para aceitar solicitações do
serviço de chamada tornando a conta de serviço do serviço de chamada um principal
no serviço de recebimento. Em seguida, você concede a essa conta de serviço o papel de Chamador (roles/run.invoker
)
do Cloud Run. Para executar as duas tarefas, siga as instruções na guia apropriada:
IU do Console
Acesse o Console do Google Cloud:
Selecione o serviço de recebimento.
Clique em Mostrar painel de informações no canto superior direito para mostrar a guia Permissões.
Clique em Adicionar principal.
Digite a identidade do serviço de chamada. Este é geralmente um endereço de e-mail, por padrão
PROJECT_NUMBER-compute@developer.gserviceaccount.com
.Selecione o papel
Cloud Run Invoker
no menu suspenso Selecionar um papel.Clique em Salvar.
gcloud
Use o comando gcloud run services add-iam-policy-binding
:
gcloud run services add-iam-policy-binding RECEIVING_SERVICE \ --member='serviceAccount:CALLING_SERVICE_IDENTITY' \ --role='roles/run.invoker'
em que RECEIVING_SERVICE
é o nome do serviço
de recebimento e CALLING_SERVICE_IDENTITY
é o endereço
de e-mail da conta de serviço, por padrão
PROJECT_NUMBER-compute@developer.gserviceaccount.com
.
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 inicial do Cloud Run destinado a ser público.
Substitua us-docker.pkg.dev/cloudrun/container/hello
por uma referência à imagem do seu contêiner.
O código do Terraform a seguir torna o serviço inicial público.
O código do Terraform a seguir cria um segundo serviço do Cloud Run destinado a ser particular.
Substitua us-docker.pkg.dev/cloudrun/container/hello
por uma referência à imagem do seu contêiner.
O código do Terraform a seguir torna o segundo serviço particular.
O código do Terraform a seguir cria uma conta de serviço.
O código do Terraform a seguir permite que os serviços anexados à conta de serviço invoquem o serviço inicial particular do Cloud Run.
Adquirir e configurar o token de ID
Depois de conceder o papel adequado à conta de serviço de chamada, siga estas etapas:
Busque um token de ID assinado pelo Google usando um dos métodos descritos na seção a seguir. Defina a declaração de público-alvo (
aud
) como o URL do serviço que recebe ou um público-alvo personalizado configurado. Se você não estiver usando um público-alvo personalizado, o valoraud
precisará permanecer como o URL do serviço, mesmo ao fazer solicitações para uma tag de tráfego específica.Adicione o token de ID buscado na etapa anterior a um dos seguintes cabeçalhos na solicitação para o serviço de recebimento:
- Um cabeçalho
Authorization: Bearer ID_TOKEN
. - Um cabeçalho
X-Serverless-Authorization: Bearer ID_TOKEN
. É possível usar esse cabeçalho se o aplicativo já usar o cabeçalhoAuthorization
para autorização personalizada. Isso remove a assinatura antes de transmitir o token para o contêiner do usuário.
- Um cabeçalho
Para ver outras formas de conseguir um token de ID que não estejam descritas nesta página, consulte Métodos para receber um token de ID.
Usar as bibliotecas de autenticação
A maneira mais fácil e confiável de adquirir e configurar o processo do token de ID é usar as bibliotecas de autenticação.
Esse código funciona em qualquer ambiente, mesmo fora do Google Cloud, em que as bibliotecas podem conseguir credenciais de autenticação para uma conta de serviço, incluindo ambientes compatíveis com aplicativos locais Credenciais padrão.
Para definir o Application Default Credentials, faça o download de um arquivo de chave da conta de serviço e defina a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS
como o caminho do arquivo de chave da conta de serviço. Para mais informações, consulte Como o Application Default Credentials funciona.
Esse código não funciona para receber credenciais de autenticação para uma conta de usuário.
Node.js
Python
Go
Java
Usar o servidor de metadados
Se, por algum motivo, não for possível usar as bibliotecas de autenticação, será possível buscar um token de ID no servidor de metadados do Compute enquanto o contêiner estiver em execução no Cloud Run. Esse método não funciona fora do Google Cloud, inclusive na máquina local.
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=[AUDIENCE]" \
-H "Metadata-Flavor: Google"
Em que AUDIENCE é o URL do serviço que você está invocando ou um público-alvo personalizado configurado.
A tabela a seguir resume as principais partes de uma solicitação de consulta de metadados.
Componentes | Descrição |
---|---|
URL raiz | Todos os valores de metadados são definidos como subcaminhos abaixo do seguinte URL raiz: http://metadata.google.internal/computeMetadata/v1 |
Cabeçalho da solicitação | O seguinte cabeçalho precisa estar em cada solicitação: Metadata-Flavor: Google Esse cabeçalho indica que a solicitação foi enviada com a intenção de recuperar valores de metadados, em vez de recuperar involuntariamente de uma fonte insegura e permite que o servidor de metadados retorne os dados solicitados. Se você não fornecer esse cabeçalho, o servidor de metadados negará sua solicitação. |
Para ver instruções completas de um aplicativo usando essa técnica de autenticação de serviço a serviço, siga o tutorial sobre como proteger os serviços do Cloud Run.
Usar a federação de identidade da carga de trabalho de fora do Google Cloud
Se o ambiente usar um provedor de identidade com suporte da federação de identidade da carga de trabalho, será possível usar o método a seguir para autenticar com segurança o serviço do Cloud Run fora do Google Cloud:
Configure sua conta de serviço conforme descrito em Configurar a conta de serviço nesta página.
Configure a federação de identidade da carga de trabalho para seu provedor de identidade, conforme descrito em Como configurar a federação de identidade da carga de trabalho.
Siga as instruções em Como conceder permissões de identidade externas para personificar uma conta de serviço.
Use a API REST para adquirir um token de curta duração, mas, em vez de chamar
generateAccessToken
para receber um token de acesso, chamegenerateIdToken
para receber um token de ID.Por exemplo, usando curl:
ID_TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT:generateIdToken \ -H "Content-Type: text/json; charset=utf-8" \ -H "Authorization: Bearer $STS_TOKEN" \ -d @- <<EOF | jq -r .token { "audience": "SERVICE_URL" } EOF ) echo $ID_TOKEN
Em que
SERVICE_ACCOUNT
é o endereço de e-mail da conta de serviço que o pool de identidades da carga de trabalho está configurado para acessar, eSERVICE_URL
é o URL do serviço do Cloud Run. que você está chamando. Esse valor precisa permanecer como o URL do serviço, mesmo ao fazer solicitações a uma tag de tráfego específica.$STS_TOKEN
é o token do serviço de token de segurança que você recebeu na etapa anterior nas instruções de federação da identidade da carga de trabalho.
É possível incluir o token de ID da etapa anterior na solicitação ao
serviço usando um cabeçalho
Authorization: Bearer ID_TOKEN
ou um cabeçalho X-Serverless-Authorization: Bearer ID_TOKEN
. Se
ambos os cabeçalhos forem fornecidos, somente o cabeçalho X-Serverless-Authorization
será verificado.
Usar uma chave de conta de serviço salva fora do Google Cloud
Se a federação de identidade da carga de trabalho não for adequada para seu ambiente, será possível usar uma chave de conta de serviço salva para autenticar de fora do Google Cloud. Atualize o código de cliente para usar as bibliotecas de autenticação como descrito anteriormente com o Application Default Credentials.
Para adquirir um token de ID assinado pelo Google, use um JWT autoassinado, mas isso é bastante complicado e propenso a erros. As etapas básicas são as seguintes:
Autoassine um JWT da conta de serviço com a declaração
target_audience
definida como o URL do serviço que recebe ou um público-alvo personalizado configurado. Se você não estiver usando domínios personalizados, o valortarget_audience
permanecerá como o URL do serviço, mesmo ao fazer solicitações para uma tag de tráfego específica.Troque o JWT autoassinado por um token de ID assinado pelo Google, que precisa ter a reivindicação
aud
definida como a URL mostrada anteriormente.Inclua o token de ID na solicitação ao serviço usando um cabeçalho
Authorization: Bearer ID_TOKEN
ou um cabeçalhoX-Serverless-Authorization: Bearer ID_TOKEN
. Se ambos os cabeçalhos forem fornecidos, somente o cabeçalhoX-Serverless-Authorization
será verificado.
Receber solicitações autenticadas
No serviço particular de recebimento, é possível analisar o cabeçalho de autorização para receber as informações enviadas pelo token do portador.
Python
A seguir
- Saiba mais sobre a validação de tokens de ID.