Este tutorial mostra como gravar e acionar uma função do Cloud Run orientada a eventos com um gatilho do Pub/Sub.
É possível configurar o roteamento de eventos, incluindo a origem e o destino do evento, especificando filtros para um acionador do Eventarc. No exemplo deste tutorial, a publicação de uma mensagem em um tópico do Pub/Sub aciona o evento, e uma solicitação é enviada para a função na forma de uma solicitação HTTP.
Se você é novo no Pub/Sub e quer saber mais, consulte a documentação do Pub/Sub para conferir guias de início rápido e referências importantes.
Objetivos
Com este tutorial, você vai:
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
As restrições de segurança definidas pela sua organização podem impedir que você conclua as etapas a seguir. Para informações sobre solução de problemas, consulte Desenvolver aplicativos em um ambiente restrito do Google Cloud.
- 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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
- Se você não estiver usando o Cloud Shell, atualize os componentes da Google Cloud CLI e faça login usando sua conta:
gcloud components update gcloud auth login
- Ative as APIs:
gcloud services enable artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com \ logging.googleapis.com \ pubsub.googleapis.com
- Defina as variáveis de configuração usadas neste tutorial:
export REGION=us-central1 gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
- Crie uma conta de serviço:
SERVICE_ACCOUNT=eventarc-trigger-sa gcloud iam service-accounts create $SERVICE_ACCOUNT
Se você precisa seguir uma política da organização de restrição de domínio que restringe invocações não autenticadas para seu projeto, será necessário acessar o serviço implantado, conforme descrito em Como testar serviços particulares.
Funções exigidas
-
Se você for o criador do projeto, receberá o papel de proprietário básico (
roles/owner
). Por padrão, esse papel do gerenciamento de identidade e acesso (IAM) inclui as permissões necessárias para acesso total à maioria dos recursos do Google Cloud, e você pode pular esta etapa.Se você não é o criador do projeto, as permissões necessárias precisam ser concedidas ao principal apropriado. Por exemplo, um principal pode ser uma Conta do Google (para usuários finais) ou uma conta de serviço (para aplicativos e cargas de trabalho de computação). Para mais informações, consulte a página Papéis e permissões do destino do evento.
Permissões necessárias
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:
-
Desenvolvedor de origem do Cloud Run (
roles/run.sourceDeveloper
) -
Administrador de projetos do IAM (
roles/resourcemanager.projectIamAdmin
) -
Usuário da conta de serviço (
roles/iam.serviceAccountUser
) -
Administrador do Service Usage (
roles/serviceusage.serviceUsageAdmin
) -
Acessador de exibição de registros (
roles/logging.viewAccessor
)
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.
-
Desenvolvedor de origem do Cloud Run (
Anote as propriedades da conta de serviço padrão do Compute Engine, porque você vai anexá-la a um gatilho do Eventarc para representar a identidade do acionador para fins de teste. Essa conta de serviço é criada automaticamente depois de ativar ou usar um serviço do Google Cloud que usa o Compute Engine e com o seguinte formato de e-mail:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
Substitua
PROJECT_NUMBER
pelo número do projeto do Google Cloud. Encontre o número do projeto na página Boas-vindas do console do Google Cloud ou executando o seguinte comando:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
Para ambientes de produção, é altamente recomendável criar uma nova conta de serviço, conceder a ela um ou mais papéis do IAM que contenham as permissões mínimas necessárias, bem como seguir o princípio de privilégio mínimo.
- Por padrão, os serviços do Cloud Run só podem ser chamados por proprietários do projeto, editores do projeto e administradores e invocadores do Cloud Run.
É possível controlar o acesso por serviço. No entanto, para fins de teste, conceda o
papel de chamador
do Cloud Run (
run.invoker
) no projeto do Google Cloud à conta de serviço do Compute Engine. Isso concede o papel em todos os serviços e jobs do Cloud Run em um projeto.gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/run.invoker
Se você criar um gatilho para um serviço autenticado do Cloud Run sem conceder o papel de chamador do Cloud Run, o gatilho será criado com sucesso e estará ativo. No entanto, o acionador não funcionará conforme o esperado e uma mensagem semelhante à seguinte aparecerá nos registros:
The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.
- Conceda o
papel de receptor de eventos
do Eventarc (
roles/eventarc.eventReceiver
) no projeto à conta de serviço padrão do Compute Engine para que o gatilho do Eventarc possa receber eventos de provedores de eventos.gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/eventarc.eventReceiver
- Antes de criar um gatilho para eventos diretos do Cloud Storage,
conceda o papel de publisher do
Pub/Sub (
roles/pubsub.publisher
) ao agente de serviço do Cloud Storage:SERVICE_ACCOUNT="$(gcloud storage service-agent --project=PROJECT_ID)" gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role='roles/pubsub.publisher'
- Se você ativou o agente de serviço do Cloud Pub/Sub até 8 de abril
de 2021, para oferecer compatibilidade com solicitações push autenticadas do Pub/Sub, conceda
o papel de Criador de token da conta de serviço (
roles/iam.serviceAccountTokenCreator
) ao agente de serviço. Caso contrário, esse papel é concedido por padrão:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
Criar um tópico do Pub/Sub
Nas funções do Cloud Run, os tópicos do Pub/Sub não são criados automaticamente quando você implanta uma função. Antes de implantar a função, publique uma mensagem neste tópico do Pub/Sub para acionar a função:
gcloud pubsub topics create YOUR_TOPIC_NAME
Preparar o aplicativo
Clone o repositório do app de amostra na máquina local:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
.NET
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
Ruby
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git
PHP
git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
Mude para o diretório que contém o exemplo de código das funções do Cloud Run para acessar o Pub/Sub:
Node.js
cd nodejs-docs-samples/functions/v2/helloPubSub/
Python
cd python-docs-samples/functions/v2/pubsub/
Go
cd golang-samples/functions/functionsv2/hellopubsub/
Java
cd java-docs-samples/functions/v2/pubsub/
.NET
cd dotnet-docs-samples/functions/helloworld/HelloPubSub/
Ruby
cd ruby-docs-samples/functions/helloworld/pubsub/
PHP
cd php-docs-samples/functions/helloworld_pubsub/
Confira o código de amostra:
Node.js
Python
Go
Java
.NET
Ruby
PHP
Implantar uma função orientada a eventos
Para implantar a função, execute o seguinte comando no diretório que contém o exemplo de código:
Node.js
gcloud beta run deploy FUNCTION \
--source . \
--function helloPubSub \
--base-image nodejs22 \
Python
gcloud beta run deploy FUNCTION \
--source . \
--function subscribe \
--base-image python312 \
Go
gcloud beta run deploy FUNCTION \
--source . \
--function HelloPubSub \
--base-image go122 \
Java
gcloud beta run deploy FUNCTION \
--source . \
--function functions.SubscribeToTopic \
--base-image java21 \
.NET
gcloud beta run deploy FUNCTION \
--source . \
--function HelloPubSub.Function \
--base-image dotnet8 \
Ruby
gcloud beta run deploy FUNCTION \
--source . \
--function hello_pubsub \
--base-image ruby33 \
PHP
gcloud beta run deploy FUNCTION \
--source . \
--function helloworldPubsub \
--base-image php83 \
Substitua FUNCTION pelo nome da função que você está implantando. Se você omitir esse parâmetro, será solicitado que você insira um nome ao executar o comando.
BASE_IMAGE é o ambiente de imagem base da sua função. Para mais detalhes sobre as imagens de base e os pacotes incluídos em cada imagem, consulte Imagens de base dos ambientes de execução.
Se você for solicitado a criar um repositório na região especificada, responda
pressionando y
.
Quando a implantação for concluída, a CLI do Google Cloud vai mostrar um URL em que
o serviço está em execução.
Criar um gatilho do Eventarc
Para implantar a função com um acionador do Pub/Sub, execute o seguinte comando no diretório que contém o exemplo de código:
Crie um gatilho do Eventarc no Pub/Sub:
gcloud eventarc triggers create TRIGGER_NAME \ --location=${REGION} \ --destination-run-service=FUNCTION \ --destination-run-region=${REGION} \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
Substitua:
- TRIGGER_NAME pelo nome do gatilho.
- FUNCTION pelo nome da função.
- PROJECT_NUMBER pelo número do projeto do Google Cloud.
Ao criar um gatilho do Eventarc pela primeira vez em um projeto do Google Cloud, pode haver um atraso no provisionamento do agente de serviço do Eventarc. Esse problema geralmente pode ser resolvido ao tentar criar o acionador novamente. Para mais informações, consulte Erros de permissão negada.
Confirme se o gatilho foi criado com êxito. Embora o gatilho seja criado imediatamente, pode levar até dois minutos para que ele seja totalmente funcional.
gcloud eventarc triggers list --location=${REGION}
A saída será semelhante a esta:
NAME: helloworld-events TYPE: google.cloud.pubsub.topic.v1.messagePublished DESTINATION: Cloud Run service: helloworld-events ACTIVE: Yes LOCATION: us-central1
Acionar a função
Para testar a função do Pub/Sub:
Atribua o tópico a uma variável:
TOPIC_ID=$(gcloud eventarc triggers describe TRIGGER_NAME --location $REGION --format='value(transport.pubsub.topic)')
Publique uma mensagem no tópico:
gcloud pubsub topics publish $TOPIC_ID --message="Hello World"
O serviço do Cloud Run registra o corpo da mensagem recebida. Você pode ver isso na seção "Registros" da sua instância do Cloud Run:
- Acesse o console do Google Cloud.
- Clique na função.
Selecione a guia Registros.
Os registros podem demorar alguns instantes para aparecer. Se eles não aparecerem imediatamente, verifique novamente após alguns instantes.
Procure a mensagem "Hello World!".
Limpar
Se você criou um novo projeto para este tutorial, exclua o projeto. Se você usou um projeto já existente e quer mantê-lo sem as alterações incluídas com este tutorial, exclua os recursos criados para o tutorial.
Exclua 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.
delete-tutorial-resources
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 as configurações padrão do gcloud CLI que você adicionou durante a configuração do tutorial.
Por exemplo:
gcloud config unset run/region
ou
gcloud config unset project
Exclua outros recursos do Google Cloud criados neste tutorial:
- Exclua o gatilho do Eventarc:
Substituagcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
pelo nome do gatilho.
- Exclua o gatilho do Eventarc: