Receber eventos diretos do Cloud Storage (CLI gcloud)

Neste guia de início rápido, mostramos como receber eventos diretos do Cloud Storage (sem usar os Registros de auditoria do Cloud) em um serviço do Cloud Run não autenticado usando o Eventarc.

É possível configurar o acionamento de notificações em resposta a vários eventos dentro de um bucket do Cloud Storage: criação, exclusão e arquivamento de objetos e atualizações de metadados. Para mais informações, consulte Criar um gatilho para rotear eventos do Cloud Storage para o Cloud Run.

Neste guia de início rápido, você fará as seguintes tarefas:

  1. Criar um bucket do Cloud Storage para ser a origem do evento.

  2. Implantar um serviço de receptor de eventos no Cloud Run

  3. Criar um gatilho do Eventarc.

  4. Gerar um evento fazendo upload de um arquivo no bucket do Cloud Storage e visualizá-lo nos registros do Cloud Run.

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.

  1. 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.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. 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.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Install the Google Cloud CLI.
  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. 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.

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Ative as APIs Cloud Run, Cloud Storage, Eventarc e Pub/Sub.

    gcloud services enable \
    eventarc.googleapis.com \
    pubsub.googleapis.com \
    run.googleapis.com \
    storage.googleapis.com
  11. Atualize os componentes gcloud:
    gcloud components update
  12. Faça login usando sua conta:
    gcloud auth login
  13. Defina as variáveis de configuração usadas neste guia de início rápido:
    gcloud config set run/region us-central1
    gcloud config set run/platform managed
    gcloud config set eventarc/location us-central1
  14. 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:

    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.

  15. 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.

  16. 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
  17. 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'
  18. 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:
gsutil mb -l us-central1 gs://PROJECT_ID-bucket/

Depois que a origem do evento é criada, implante o serviço de receptor de eventos no Cloud Run.

Implantar o serviço de receptor de eventos no Cloud Run

Implante um serviço do Cloud Run que receberá e registrará eventos usando uma imagem pré-criada, us-docker.pkg.dev/cloudrun/container/hello:

gcloud run deploy helloworld-events \
    --image=us-docker.pkg.dev/cloudrun/container/hello \
    --allow-unauthenticated

Quando a implantação for bem-sucedida, a linha de comando exibirá o URL de serviço.

Agora que você implantou o serviço de receptor de eventos chamado helloworld-events no Cloud Run, configure o gatilho.

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.

  1. Crie um gatilho que filtre edventos do Cloud Storage e que use a conta de serviço parão do Compute Engine.

      gcloud eventarc triggers create storage-events-trigger \
          --destination-run-service=helloworld-events \
          --destination-run-region=us-central1 \
          --event-filters="type=google.cloud.storage.object.v1.finalized" \
          --event-filters="bucket=PROJECT_ID-bucket" \
          --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Isso gera um gatilho chamado storage-events-trigger.

    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.

  2. Para confirmar se storage-events-trigger foi criado, execute:

      gcloud eventarc triggers list --location=us-central1
    

    A saída será assim:

     NAME                    TYPE                                      DESTINATION_RUN_SERVICE  DESTINATION_RUN_PATH  ACTIVE
     storage-events-trigger  google.cloud.storage.object.v1.finalized  helloworld-events                              Yes
    

Gerar e visualizar um evento

  1. Para gerar um evento, faça upload de um arquivo de texto para o Cloud Storage.

     echo "Hello World" > random.txt
     gsutil cp random.txt gs://PROJECT_ID-bucket/random.txt
    

    O upload gera um evento e o serviço do Cloud Run registra a mensagem do evento.

  2. Para visualizar a entrada de registro, filtre as entradas e retorne a saída no formato JSON:

    gcloud logging read 'jsonPayload.message: "Received event of type google.cloud.storage.object.v1.finalized."'
    
  3. Procure uma entrada de registro semelhante a esta:

    jsonPayload:
      event:
      ...
      eventType: google.cloud.storage.object.v1.finalized
      message: |
        Received event of type google.cloud.storage.object.v1.finalized. Event data: {
          "kind": "storage#object",
          "id": "PROJECT_ID-bucket/random.txt/1713970683868432",
          "selfLink": "https://www.googleapis.com/storage/v1/b/PROJECT_ID-bucket/o/random.txt",
          "name": "random.txt",
          "bucket": "PROJECT_ID-bucket",
          ...
        }
    

Parabéns! Você implantou com sucesso um serviço de receptor de eventos no Cloud Run, criou um gatilho do Eventarc, gerou um evento a partir do Cloud Storage e o visualizou nos registros do Cloud Run.

Limpar

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados.

É possível:

  1. Exclua o bucket do Cloud Storage.

  2. Exclua o serviço do Cloud Run.

  3. Excluir o gatilho do Eventarc.

Se preferir, exclua o projeto do Google Cloud para evitar cobranças. A exclusão do projeto do Google Cloud interrompe o faturamento de todos os recursos usados no projeto.

Delete a Google Cloud project:

gcloud projects delete PROJECT_ID

Se você planeja ver vários tutoriais e guias de início rápido, a reutilização de projetos pode evitar que você exceda os limites da cota do projeto.

A seguir