Acionar fluxos de trabalho usando mensagens do Pub/Sub (CLI gcloud)

Neste guia de início rápido, mostramos como executar um fluxo de trabalho usando um gatilho do Eventarc que recebe eventos usando o Pub/Sub. O gatilho executa o fluxo de trabalho transmitindo eventos entregues pelo Pub/Sub como argumentos de ambiente de execução para um fluxo de trabalho de destino.

Neste guia de início rápido, você vai:

  1. Use o Workflows para criar e implantar um fluxo de trabalho que decodifica e retorna mensagens do Pub/Sub.
  2. Crie um gatilho do Eventarc que conecte um tópico do Pub/Sub a um receptor de eventos do Workflows.
  3. Publique uma mensagem para o tópico do Pub/Sub a fim de gerar um evento. Esse evento é transmitido como um argumento de ambiente de execução para o fluxo de trabalho de destino.
  4. Veja a mensagem do Pub/Sub como resultado da execução do fluxo de trabalho.

Antes de começar

Verifique se você tem acesso a esse recurso solicitando a inclusão do projeto às visualizações particulares do Workflows 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. Atualize os componentes da gcloud:
    gcloud components update
  11. Ative as APIs Compute Engine, Eventarc, Pub/Sub e Workflows.
    gcloud services enable \
    compute.googleapis.com \
    eventarc.googleapis.com \
    pubsub.googleapis.com \
    workflows.googleapis.com \
    workflowexecutions.googleapis.com
  12. Defina as variáveis de configuração usadas neste tutorial:
    export WORKFLOW_LOCATION=us-central1
    export TRIGGER_LOCATION=us-central1
    export PROJECT_ID=PROJECT_ID
    gcloud config set project ${PROJECT_ID}
    gcloud config set workflows/location ${WORKFLOW_LOCATION}
    gcloud config set eventarc/location ${TRIGGER_LOCATION}
  13. 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 a fim de concluir o guia de início rápido, peça ao administrador para conceder a você os seguintes papéis do IAM no 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.

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

  15. Conceda o papel Invocador do fluxo de trabalho (roles/workflows.invoker) no projeto à conta de serviço padrão do Compute Engine para que ela tenha permissão para acionar a execução do seu fluxo de trabalho.
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/workflows.invoker
  16. 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 e implantar um fluxo de trabalho

Crie e implante um fluxo de trabalho que é executado quando uma mensagem publicada em um tópico do Pub/Sub aciona um fluxo de trabalho com uma solicitação HTTP.

  1. Abra um terminal ou o Cloud Shell.
  2. No diretório inicial, crie um novo arquivo chamado myFirstWorkflow.yaml ou myFirstWorkflow.json.
  3. Copie e cole o seguinte no novo arquivo e salve:

    YAML

    main:
      params: [event]
      steps:
        - decode_pubsub_message:
            assign:
               - base64: ${base64.decode(event.data.message.data)}
               - message: ${text.decode(base64)}
        - return_pubsub_message:
            return: ${message}

    JSON

    {
      "main": {
        "params": [
          "event"
        ],
        "steps": [
          {
            "decode_pubsub_message": {
              "assign": [
                {
                  "base64": "${base64.decode(event.data.message.data)}"
                },
                {
                  "message": "${text.decode(base64)}"
                }
              ]
            }
          },
          {
            "return_pubsub_message": {
              "return": "${message}"
            }
          }
        ]
      }
    }
  4. Implante o fluxo de trabalho:
    export MY_WORKFLOW=myFirstWorkflow
    gcloud workflows deploy ${MY_WORKFLOW} --source=myFirstWorkflow.yaml
    Substitua .yaml por .json se você tiver copiado a versão JSON do fluxo de trabalho do exemplo.

Criar um gatilho do Eventarc

Quando uma mensagem é publicada no tópico do Pub/Sub, o evento aciona o fluxo de trabalho.

  1. Crie um gatilho para detectar mensagens do Pub/Sub:

    Novo tópico pub/sub

    gcloud eventarc triggers create events-pubsub-trigger \
        --destination-workflow=${MY_WORKFLOW} \
        --destination-workflow-location=${WORKFLOW_LOCATION} \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"

    Isso cria um novo tópico do Pub/Sub e um gatilho para ele chamado events-pubsub-trigger.

    Tópico do Pub/Sub atual

    gcloud eventarc triggers create events-pubsub-trigger \
        --destination-workflow=${MY_WORKFLOW} \
        --destination-workflow-location=${WORKFLOW_LOCATION} \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --transport-topic=TOPIC_ID

    Substitua TOPIC_ID pelo ID do tópico do Pub/Sub atual.

    Isso cria um gatilho chamado events-pubsub-trigger para um tópico do Pub/Sub atual.

    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. Confirme se o gatilho foi criado:
    gcloud eventarc triggers describe events-pubsub-trigger --location=${TRIGGER_LOCATION}

    A saída será semelhante à seguinte listando o horário de criação e o local do acionador:

    createTime: '2021-10-14T15:15:43.872360951Z'
    [...]
    name: projects/PROJECT_ID/locations/us-central1/triggers/events-pubsub-trigger

Gerar e visualizar um evento

Publique uma mensagem no tópico do Pub/Sub para gerar um evento e acionar o fluxo de trabalho. O evento gerado é transmitido como um argumento de ambiente de execução para o fluxo de trabalho, que retorna a mensagem do Pub/Sub como resultado da execução do fluxo de trabalho. Verifique se o tamanho dos eventos enviados para o fluxo de trabalho não excede 512 KB.

  1. Se você criou um acionador para um novo tópico do Pub/Sub, encontre e defina o tópico do Pub/Sub criado, como uma variável de ambiente:

    export TOPIC_ID=$(basename $(gcloud eventarc triggers describe events-pubsub-trigger --format='value(transport.pubsub.topic)'))
  2. Para acionar o fluxo de trabalho, envie uma mensagem ao tópico do Pub/Sub:

    gcloud pubsub topics publish $TOPIC_ID --message "Hello there"

    O evento gerado é transmitido como um argumento de ambiente de execução para o fluxo de trabalho, que retorna uma mensagem "Hello there".

  3. Para verificar se uma execução de fluxos de trabalho foi acionada, liste as últimas cinco execuções:

    gcloud workflows executions list ${MY_WORKFLOW} --limit=5

    O resultado vai ser semelhante a este, listando um NOME e ESTADO igual a SUCCEEDED para cada execução de fluxo de trabalho:

    NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/8c02b8f1-8836-4a6d-99d9-fc321eb9668f
    STATE: SUCCEEDED
    START_TIME: 2021-09-13T19:15:10.275677049Z
    END_TIME: 2021-09-13T19:15:10.963136883Z
    NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/a6319d9d-36a6-4117-904e-3d1118bdc90a
    STATE: SUCCEEDED
    START_TIME: 2021-09-13T17:28:51.492864252Z
    END_TIME: 2021-09-13T17:28:52.227212414Z
    

    Observe que, no campo NAME do exemplo anterior, a6319d9d-36a6-4117-904e-3d1118bdc90a é o ID da execução do fluxo de trabalho. Copie o ID de execução para usar na próxima etapa.

  4. Para ver o status da execução, execute o seguinte comando:

    gcloud workflows executions describe WORKFLOW_EXECUTION_ID --workflow=${MY_WORKFLOW}

    Substitua WORKFLOW_EXECUTION_ID pelo ID da execução do fluxo de trabalho que corresponde ao horário de publicação do tópico do Pub/Sub. O resultado será assim:

    argument: [...]
    endTime: '2021-09-13T17:28:47.301012152Z'
    name: projects/1234567/locations/us-central1/workflows/myFirstWorkflow/executions/f72bc6d4-5ea0-4dfb-bb14-2dae82303120
    result: 'Hello there'
    startTime: '2021-09-13T17:28:51.492864252Z'
    state: SUCCEEDED
  5. Verifique se o publish_time em que a mensagem do Pub/Sub foi publicada e o startTime da execução do fluxo de trabalho correspondem entre si.

Parabéns! Você gerou um evento usando um tópico do Pub/Sub que acionou um receptor de eventos do Workflows usando o Eventarc.

Limpar

  1. Exclua o fluxo de trabalho que você criou:
    gcloud workflows delete ${MY_WORKFLOW}
    Quando perguntar se você quer continuar, digite y.
  2. Exclua o gatilho que você criou:
    gcloud eventarc triggers delete events-pubsub-trigger
  3. 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 nele.

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

A seguir