Acione fluxos de trabalho com eventos diretos do Cloud Storage (CLI gcloud)

Este início rápido mostra como executar um fluxo de trabalho usando um acionador do Eventarc que recebe eventos do Cloud Storage.

O acionador executa o fluxo de trabalho ao ouvir um evento de criação de objeto num contentor do Cloud Storage e passa o evento como um argumento de tempo de execução para um fluxo de trabalho de destino.

Neste início rápido:

  1. Crie um contentor do Cloud Storage como uma origem de eventos.

  2. Use fluxos de trabalho para criar e implementar um fluxo de trabalho que extrai e devolve o nome do contentor de armazenamento e o nome de um ficheiro carregado.

  3. Crie um acionador do Eventarc que ligue o contentor do Cloud Storage ao recetor de eventos do Workflows.

  4. Gere um evento carregando um ficheiro de texto para o contentor do Cloud Storage. Este evento é transmitido como um argumento de tempo de execução para o fluxo de trabalho de destino.

  5. Veja o nome do contentor e o nome do ficheiro de texto como resultado da execução do fluxo de trabalho.


Para seguir orientações passo a passo para esta tarefa diretamente na Google Cloud consola, clique em Orientar-me:

Visita guiada


Antes de começar

As restrições de segurança definidas pela sua organização podem impedir a conclusão dos seguintes passos. Para informações de resolução de problemas, consulte o artigo Desenvolva aplicações num ambiente Google Cloud restrito.

  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. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  4. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  5. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • 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.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Install the Google Cloud CLI.

  8. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  9. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  10. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • 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.

  11. Verify that billing is enabled for your Google Cloud project.

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

  13. Atualize os componentes de gcloud:
    gcloud components update
  14. Inicie sessão com a sua conta:
    gcloud auth login
  15. Defina as variáveis de ambiente

    Defina as variáveis de ambiente usadas neste início rápido.

    export PROJECT_ID=PROJECT_ID
    export WORKFLOW_LOCATION=us-central1
    export TRIGGER_LOCATION=us-central1
    gcloud config set project ${PROJECT_ID}
    gcloud config set workflows/location ${WORKFLOW_LOCATION}
    gcloud config set eventarc/location ${TRIGGER_LOCATION}
    

    Pode encontrar o ID do projeto na página Boas-vindas da Google Cloud consola.

    Configure as suas contas de serviço

    Conceda as autorizações necessárias às contas de serviço usadas neste início rápido.

    1. Se for o criador do projeto, é-lhe concedida a função básica de proprietário (roles/owner). Por predefinição, esta função do Identity and Access Management (IAM) inclui as autorizações necessárias para acesso total à maioria dos Google Cloud recursos, e pode ignorar este passo.

      Se não for o criador do projeto, as autorizações necessárias têm de ser concedidas no projeto ao principal adequado. Por exemplo, um principal pode ser uma Conta Google (para utilizadores finais) ou uma conta de serviço (para aplicações e cargas de trabalho de computação). Para mais informações, consulte a página Funções e autorizações do destino de eventos.

      Autorizações necessárias

      Para receber as autorizações de que precisa para concluir este início rápido, peça ao seu administrador para lhe conceder as seguintes funções de IAM no seu projeto:

      Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

      Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

    2. Tome nota da conta de serviço predefinida do Compute Engine, uma vez que a vai anexar a um acionador do Eventarc para representar a identidade do acionador para fins de teste. Esta conta de serviço é criada automaticamente após a ativação ou a utilização de um Google Cloud serviço que usa o Compute Engine e com o seguinte formato de email:

      PROJECT_NUMBER-compute@developer.gserviceaccount.com

      Substitua PROJECT_NUMBER pelo seu Google Cloud número do projeto. Pode encontrar o número do projeto na página Boas-vindas da Google Cloud consola ou executando o seguinte comando:

      gcloud projects describe PROJECT_ID --format='value(projectNumber)'

      Para ambientes de produção, recomendamos vivamente que crie uma nova conta de serviço e lhe conceda uma ou mais funções do IAM que contenham as autorizações mínimas necessárias e siga o princípio do privilégio mínimo.

    3. Conceda a função de recetor de eventos do Eventarc (roles/eventarc.eventReceiver) no projeto à conta de serviço predefinida do Compute Engine para que o acionador do Eventarc possa receber eventos de fornecedores de eventos.
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
          --role=roles/eventarc.eventReceiver
    4. Conceda a função de invocador dos fluxos de trabalho (roles/workflows.invoker) no projeto à conta de serviço predefinida do Compute Engine para que a conta tenha autorização para acionar a execução do fluxo de trabalho.
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
          --role=roles/workflows.invoker
    5. Conceda a função de escritor de registos do Logging (roles/logging.logWriter) no projeto à conta de serviço predefinida do Compute Engine para que o fluxo de trabalho possa enviar registos para o Cloud Logging.
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
          --role=roles/logging.logWriter
    6. Antes de criar um acionador para eventos diretos do Cloud Storage, conceda a função de publicador 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'
    7. Se ativou o agente do serviço Cloud Pub/Sub a 8 de abril de 2021 ou antes, para suportar pedidos de envio autenticados do Pub/Sub, conceda a função de criador de tokens de conta de serviço (roles/iam.serviceAccountTokenCreator) ao agente do serviço. Caso contrário, esta função é concedida por predefiniçã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 contentor do Cloud Storage

    Crie um contentor do Cloud Storage para usar como origem de eventos:

      gcloud storage buckets create gs://${PROJECT_ID}-bucket --location=us-central1
    

    Crie e implemente um fluxo de trabalho

    Crie e implemente um fluxo de trabalho que é executado quando um objeto criado no contentor do Cloud Storage aciona um fluxo de trabalho com um pedido HTTP.

    1. No seu diretório inicial, crie um novo ficheiro denominado myEventWorkflow.yaml ou myEventWorkflow.json.

    2. Copie e cole o seguinte no novo ficheiro e guarde-o:

      YAML

        main:
          params: [event]
          steps:
              - log_event:
                  call: sys.log
                  args:
                      text: ${event}
                      severity: INFO
              - extract_bucket_object:
                  assign:
                  - bucket: ${event.data.bucket}
                  - object: ${event.data.name}
              - return_bucket_object:
                      return:
                          bucket: ${bucket}
                          object: ${object}
        

      JSON

      {
      "main": {
      "params": [
        "event"
      ],
      "steps": [
        {
          "log_event": {
            "call": "sys.log",
            "args": {
              "text": "${event}",
              "severity": "INFO"
            }
          }
        },
        {
          "extract_bucket_object": {
            "assign": [
              {
                "bucket": "${event.data.bucket}"
              },
              {
                "object": "${event.data.name}"
              }
            ]
          }
        },
        {
          "return_bucket_object": {
            "return": {
              "bucket": "${bucket}",
              "object": "${object}"
            }
          }
        }
      ]
      }
      }
    3. Implemente o fluxo de trabalho:

      export MY_WORKFLOW=myEventWorkflow
      gcloud workflows deploy ${MY_WORKFLOW} --source=myEventWorkflow.yaml
      

      Substitua .yaml por .json se tiver copiado a versão JSON do fluxo de trabalho de exemplo.

    Crie um acionador do Eventarc

    O acionador do Eventarc envia eventos do contentor do Cloud Storage para o destino do Workflows.

    1. Crie um acionador que filtre eventos do Cloud Storage:

      gcloud eventarc triggers create storage-events-trigger \
          --destination-workflow=${MY_WORKFLOW} \
          --event-filters="type=google.cloud.storage.object.v1.finalized" \
          --event-filters="bucket=${PROJECT_ID}-bucket" \
          --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"
      

      Esta ação cria um acionador denominado storage-events-trigger.

      Tenha em atenção que, quando cria um acionador do Eventarc pela primeira vez num projeto, pode haver um atraso no aprovisionamento do agente do serviço Eventarc. Google Cloud Normalmente, pode resolver este problema tentando criar o acionador novamente. Para mais informações, consulte o artigo Erros de acesso negado.

    2. Para confirmar que storage-events-trigger foi criado com êxito, execute o seguinte comando:

      gcloud eventarc triggers describe storage-events-trigger --location=${TRIGGER_LOCATION}
      

      O resultado deve ser semelhante ao seguinte, indicando a hora de criação e a localização do acionador:

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

    Gere e veja um evento

    1. Para gerar um evento, carregue um ficheiro de texto para o Cloud Storage:

      echo "Hello World" > random.txt
      gcloud storage cp random.txt gs://${PROJECT_ID}-bucket/random.txt
      

      O carregamento gera um evento que é transmitido como um argumento de tempo de execução para o fluxo de trabalho, que devolve os nomes do contentor de armazenamento e do ficheiro carregado.

    2. 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 deve ser semelhante ao seguinte, apresentando um NOME e um ESTADO igual a SUCCEEDED para cada execução do fluxo de trabalho:

      NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/8c02b8f1-8836-4a6d-99d9-fc321eb9668f
      STATE: SUCCEEDED
      START_TIME: 2021-10-13T03:38:03.019148617Z
      END_TIME: 2021-10-13T03:38:03.249705805Z
      NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/a6319d9d-36a6-4117-904e-3d1118bdc90a
      STATE: SUCCEEDED
      START_TIME: 2021-10-13T17:28:51.492864252Z
      END_TIME: 2021-10-13T17:28:52.227212414Z
      

      Tenha em atenção 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, uma vez que é usado no passo seguinte.

    3. Para ver o estado de 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 à hora em que o ficheiro foi carregado para o contentor.

      O resultado é semelhante ao seguinte:

      argument: [...]
      name: projects/218898424763/locations/us-central1/workflows/myEventWorkflow/executions/86d2567b-0f1e-49b3-8b10-cdac5d0f6239
      result: '{"bucket":"PROJECT_ID-bucket","object":"random.txt"}'
      startTime: '2021-10-13T03:38:03.019148617Z'
      state: SUCCEEDED
      
    4. Verifique se a hora"timeCreated": "2021-10-13T03:38" em que o contentor do Cloud Storage foi atualizado e a startTime da execução do fluxo de trabalho correspondem entre si.

    Parabéns, gerou com êxito um evento do Cloud Storage que acionou um recetor de eventos do Workflows através do Eventarc.

    Limpar

    Para evitar incorrer em custos na sua Google Cloud conta pelos recursos usados nesta página, elimine o Google Cloud projeto com os recursos.

    1. Elimine o fluxo de trabalho que criou:

      gcloud workflows delete ${MY_WORKFLOW}
      

      Quando lhe for perguntado se quer continuar, introduza y.

    2. Elimine o contentor de armazenamento:

      gcloud storage rm gs://${PROJECT_ID}-bucket/ --recursive
      
    3. Elimine o acionador criado neste tutorial:

      gcloud eventarc triggers delete storage-events-trigger
      
    4. Em alternativa, pode eliminar o seu Google Cloud projeto para evitar incorrer em custos. A eliminação do seu Google Cloud projeto interrompe a faturação de todos os recursos usados nesse projeto.

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    O que se segue?