Neste tutorial, mostramos como implantar uma função orientada a eventos no Cloud Run. e usar o Eventarc para acionar a função em resposta a Eventos do Cloud Storage usando a CLI do Google Cloud.
Ao especificar filtros para um gatilho do Eventarc, você pode configurar o roteamento de eventos, incluindo a origem e o destino do evento. Para o exemplo deste tutorial, a atualização de um bucket do Cloud Storage aciona o evento, e uma solicitação é enviada para a função na forma de uma solicitação HTTP.
Objetivos
Com este tutorial, você vai:
Custos
Neste documento, você vai 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 de Google Cloud .
- Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a gcloud CLI, execute o seguinte comando:
gcloud init -
Crie ou selecione um Google Cloud projeto.
Funções necessárias para selecionar ou criar um projeto
- Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
-
Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos
(
roles/resourcemanager.projectCreator), que contém a permissãoresourcemanager.projects.create. Saiba como conceder papéis.
-
Crie um projeto do Google Cloud :
gcloud projects create PROJECT_ID
Substitua
PROJECT_IDpor um nome para o projeto Google Cloud que você está criando. -
Selecione o projeto Google Cloud que você criou:
gcloud config set project PROJECT_ID
Substitua
PROJECT_IDpelo nome do projeto do Google Cloud .
-
Verifique se o faturamento está ativado para o projeto do Google Cloud .
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a gcloud CLI, execute o seguinte comando:
gcloud init -
Crie ou selecione um Google Cloud projeto.
Funções necessárias para selecionar ou criar um projeto
- Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
-
Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos
(
roles/resourcemanager.projectCreator), que contém a permissãoresourcemanager.projects.create. Saiba como conceder papéis.
-
Crie um projeto do Google Cloud :
gcloud projects create PROJECT_ID
Substitua
PROJECT_IDpor um nome para o projeto Google Cloud que você está criando. -
Selecione o projeto Google Cloud que você criou:
gcloud config set project PROJECT_ID
Substitua
PROJECT_IDpelo nome do projeto do Google Cloud .
-
Verifique se o faturamento está ativado para o projeto do Google Cloud .
- 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 \ storage.googleapis.com
- Defina as variáveis de configuração a serem 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}
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.
Definir os papéis necessários
Você ou seu administrador precisa conceder à conta do implantador, à identidade do gatilho e, opcionalmente, ao agente de serviço do Pub/Sub e ao agente de serviço do Cloud Storage os seguintes papéis do IAM.
Papéis necessários para a conta do implantador
-
Se você for o criador do projeto, vai receber o papel de proprietário básico (
roles/owner). Por padrão, esse papel do Identity and Access Management (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.
Para conseguir as permissões necessárias a fim de concluir o tutorial, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:
-
Editor do Cloud Build (
roles/cloudbuild.builds.editor) -
Administrador do Cloud Run (
roles/run.admin) -
Desenvolvedor de origem do Cloud Run (
roles/run.sourceDeveloper) -
Administrador do Eventarc (
roles/eventarc.admin) -
Acessador de exibição de registros (
roles/logging.viewAccessor) -
Administrador de projetos do IAM (
roles/resourcemanager.projectIamAdmin) -
Administrador da conta de serviço (
roles/iam.serviceAccountAdmin) -
Usuário da conta de serviço (
roles/iam.serviceAccountUser) -
Administrador do Service Usage (
roles/serviceusage.serviceUsageAdmin) -
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 usando papéis personalizados ou outros papéis predefinidos.
Observe que, por padrão, as permissões do Cloud Build incluem permissões para upload e download de artefatos do Artifact Registry.
-
Editor do Cloud Build (
Papéis necessários para a identidade do gatilho
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_NUMBERpelo 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 invocador
do Cloud Run (
run.invoker) no projeto 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
Papel opcional para o agente de serviço do Cloud Storage
- 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'
Papel opcional para o agente de serviço do Pub/Sub
- 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
Crie um bucket do Cloud Storage
Crie um bucket do Cloud Storage para usar como origem do evento:
gcloud storage buckets create -l us-central1 gs://PROJECT_ID-bucket/
Criar uma função orientada a eventos
Para escrever uma função orientada a eventos, siga estas etapas:
Node.js
Crie um novo diretório com o nome
helloGCSe altere o diretório nele:mkdir helloGCS cd helloGCSCrie um arquivo
package.jsonno diretóriohelloGCSpara especificar as dependências do Node.js:Crie um arquivo
index.jsno diretóriohelloGCScom o seguinte exemplo de Node.js:
Python
Crie um novo diretório com o nome
helloGCSe altere o diretório nele:mkdir helloGCS cd helloGCSCrie um arquivo
requirements.txtno diretóriohelloGCSpara especificar dependências do Python:Isso adiciona os pacotes necessários para a amostra.
Crie um arquivo
main.pyno diretóriohelloGCScom o seguinte exemplo em Python:
Implantar uma função orientada a eventos
Implante a função chamada helloworld-events executando o seguinte comando
no diretório que contém o exemplo de código:
Node.js
gcloud run deploy helloworld-events \
--source . \
--function helloGCS \
--base-image BASE_IMAGE \
--region us-central1
Substitua BASE_IMAGE pelo ambiente de imagem base da sua função, por exemplo, nodejs24. Para mais detalhes sobre as imagens de base e os pacotes incluídos em cada uma delas, consulte Ambientes de execução de linguagem e imagens de base compatíveis.
Python
gcloud run deploy helloworld-events \
--source . \
--function hello_gcs \
--base-image BASE_IMAGE \
--region us-central1
Substitua BASE_IMAGE pelo ambiente de imagem base da sua função, por exemplo, python314. Para mais detalhes sobre as imagens de base e os pacotes incluídos em cada uma delas, consulte Ambientes de execução de linguagem e imagens de base compatíveis.
Quando a implantação for concluída, a Google Cloud CLI vai mostrar um URL em que o serviço está em execução.
Criar um gatilho do Eventarc
O gatilho do Eventarc envia eventos do
bucket do Cloud Storage para o
serviço helloworld-events do Cloud Run.
Crie um gatilho que filtre eventos do Cloud Storage:
gcloud eventarc triggers create TRIGGER_NAME \ --location=${REGION} \ --destination-run-service=helloworld-events \ --destination-run-region=${REGION} \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=PROJECT_ID-bucket" \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
Substitua:
- TRIGGER_NAME pelo nome do gatilho.
- PROJECT_ID com o ID do seu projeto Google Cloud .
- 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.storage.object.v1.finalized DESTINATION: Cloud Run service: helloworld-events ACTIVE: Yes LOCATION: us-central1
Gerar e visualizar um evento
Faça upload de um arquivo de texto para o bucket do Cloud Storage para gerar um evento roteado para a função. A função do Cloud Run registra o evento nos registros do serviço.
Para gerar um evento, faça o upload de um arquivo de texto no Cloud Storage:
echo "Hello World" > random.txt gcloud storage cp random.txt gs://PROJECT_ID-bucket/random.txt
O upload gera um evento e a função do Cloud Run registra a mensagem do evento.
Para visualizar a entrada de registro:
Filtre as entradas de registro e retorne a saída no formato JSON:
gcloud logging read "resource.labels.service_name=helloworld-events AND textPayload:random.txt" --format=json
Procure uma entrada de registro semelhante a esta:
[ { .... "resource": { "labels": { .... "location": "us-central1", ..... "service_name": "helloworld-events" }, }, "textPayload": "File: random.txt", ..... } ]Os registros podem demorar alguns instantes para aparecer. Se eles não aparecerem imediatamente, verifique novamente após um minuto.
A entrada de registro confirma que você implantou uma função orientada a eventos que foi acionada quando um arquivo de texto foi enviado para o Cloud Storage.
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:
- No console Google Cloud , acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
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 consoleGoogle 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/regionou
gcloud config unset projectExclua outros recursos do Google Cloud criados neste tutorial:
- Exclua o gatilho do Eventarc:
Substituagcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAMEpelo nome do gatilho.
- Exclua o gatilho do Eventarc: