Encaminhar eventos entre projetos do Google Cloud


Neste tutorial, mostramos como usar o Eventarc para ler eventos a partir de uma origem em um projeto do Google Cloud e ecaminhá-los para um destino em outro projeto do Google Cloud. Isso é possível usando o Pub/Sub como uma camada de transporte entre projetos.

Objetivos

Com este tutorial, você vai:

  1. criar um tópico em um projeto e publicá-lo em outro projeto. Isso encaminha eventos para um serviço não autenticado do Cloud Run usando um gatilho do Eventarc;

  2. usar as notificações do Pub/Sub para publicar eventos do Cloud Storage de um projeto para outro. Encaminhe os eventos para um serviço não autenticado do Cloud Run usando um gatilho Eventarc;

  3. usar coletores do Cloud Logging para publicar registros de auditoria do Cloud de um projeto para outro. Encaminhe os eventos para um serviço não autenticado do Cloud Run usando um gatilho do Eventarc.

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. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

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.

Você vai precisar de dois projetos para este tutorial. As etapas a seguir se aplicam aos dois projetos.

  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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

    gcloud init
  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. Atualize os componentes da gcloud:
    gcloud components update
  11. Faça login usando sua conta:
    gcloud auth login

Encaminhar eventos do Pub/Sub entre projetos

Como o Pub/Sub é um serviço distribuído globalmente, é possível criar um tópico em um projeto, publicá-lo em outro projeto e acionar o Eventarc, que encaminhará a mensagem para um serviço do Cloud Run:

Eventos entre projetos: Cloud Pub/Sub e Eventarc

  1. Defina o ID do projeto do Google Cloud como o segundo projeto:

    gcloud config set project PROJECT_TWO_ID

    Substitua PROJECT_TWO_ID pelo ID do segundo projeto do Google Cloud.

  2. No segundo projeto, faça o seguinte:

    1. Ative as APIs do Cloud Run e do Eventarc:

      gcloud services enable run.googleapis.com eventarc.googleapis.com
    2. Defina o local padrão:

      REGION=REGION

      Substitua REGION pelo local compatível com o Eventarc de sua escolha. Por exemplo, us-central1.

    3. Crie um tópico do Pub/Sub:

      TOPIC=my-topic
      gcloud pubsub topics create $TOPIC
    4. Implante um serviço não autenticado do Cloud Run usando uma imagem pré-criada, us-docker.pkg.dev/cloudrun/container/hello:

      gcloud run deploy hello \
          --image=us-docker.pkg.dev/cloudrun/container/hello \
          --allow-unauthenticated \
          --region=$REGION

      Quando o URL do serviço for exibido, a implantação estará concluída.

    5. Conecte o tópico ao serviço com um gatilho do Eventarc:

      gcloud eventarc triggers create cross-project-trigger \
          --destination-run-service=hello \
          --destination-run-region=${REGION} \
          --location=${REGION} \
          --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
          --transport-topic=projects/PROJECT_TWO_ID/topics/$TOPIC

      Isso cria um gatilho chamado cross-project-trigger.

  3. Defina o ID do projeto do Google Cloud como seu primeiro projeto:

    gcloud config set project PROJECT_ONE_ID

    Substitua PROJECT_ONE_ID pelo ID do primeiro projeto do Google Cloud.

  4. No primeiro projeto, publique uma mensagem no tópico do segundo projeto:

    gcloud pubsub topics publish projects/PROJECT_TWO_ID/topics/$TOPIC --message="hello"
  5. Defina o ID do projeto do Google Cloud como o segundo projeto:

    gcloud config set project PROJECT_TWO_ID
  6. No segundo projeto, confirme se o evento gerado foi registrado:

    gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:hello" --format=json

    Uma entrada de registro semelhante a esta será retornada:

    "message": "Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: hello"

Encaminhar eventos do Cloud Storage entre projetos

Use notificações do Pub/Sub para Cloud Storage para publicar eventos de um projeto para outro e, em seguida, encaminhe os eventos para um serviço do Cloud Run por um gatilho do Eventarc:

Eventos entre projetos: Cloud Storage e Eventarc

  1. Defina o ID do projeto do Google Cloud como seu primeiro projeto:

    gcloud config set project PROJECT_ONE_ID
  2. Crie um bucket do Cloud Storage:

    PROJECT1=$(gcloud config get-value project)
    BUCKET=$PROJECT1-cross-project
    gcloud storage buckets create gs://$BUCKET --location=${REGION}
  3. Crie uma notificação do Pub/Sub para o bucket com o tópico no segundo projeto:

    gcloud storage buckets notifications create gs://$BUCKET --topic=projects/PROJECT_TWO_ID/topics/$TOPIC --payload-format=json
  4. Faça upload de um arquivo no bucket:

    echo "Hello World" > random.txt
    gcloud storage cp random.txt gs://$BUCKET/random.txt
  5. Defina o ID do projeto do Google Cloud como o segundo projeto:

    gcloud config set project PROJECT_TWO_ID
  6. No segundo projeto, confirme se o evento gerado foi registrado:

    gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:random.txt" --format=json

    Uma entrada de registro semelhante a esta será retornada:

    Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: {
      "kind": "storage#object",
      "id": "project1-cross-project/random.txt/1635327604259719",
      "selfLink": "https://www.googleapis.com/storage/v1/b/project1-cross-project/o/random.txt",
      "name": "random.txt",
      "bucket": "project1-cross-project",
      "generation": "1635327604259719",
    [...]
    }

Encaminhar eventos de registros de auditoria do Cloud entre projetos

As solicitações para o serviço podem ser acionadas quando uma entrada de registro de auditoria for criada e corresponder aos critérios de filtro do gatilho. (Para mais informações, consulte Determinar filtros de evento para registros de auditoria do Cloud.) Neste caso, quando uma instância de VM do Compute Engine é criada no primeiro projeto, uma entrada de registro de auditoria que corresponde aos critérios de filtro do gatilho permite capturar e encaminhar um evento para um serviço do Cloud Run no segundo projeto:

Eventos entre projetos: registros de auditoria do Cloud e Eventarc

  1. Defina o ID do projeto do Google Cloud como seu primeiro projeto:

    gcloud config set project PROJECT_ONE_ID
  2. No primeiro projeto, ative os tipos de registro Leitura de administradores, Leitura de dados e Gravação de dados para o Compute Engine:

    No nível do projeto, é preciso ter o papel de gerenciamento de identidade e acesso roles/owner para configurar os registros de auditoria de acesso a dados para os recursos do Google Cloud.

    1. Leia a política de IAM do projeto e guarde-a em um arquivo:

      gcloud projects get-iam-policy PROJECT_ONE_ID > /tmp/policy.yaml
      
    2. Edite /tmp/policy.yaml, adicionando ou alterando apenas a configuração dos registros de auditoria de acesso a dados.

      auditConfigs:
      - auditLogConfigs:
        - logType: ADMIN_READ
        - logType: DATA_READ
        - logType: DATA_WRITE
        service: compute.googleapis.com
      
    3. Grave a nova política de IAM:

      gcloud projects set-iam-policy PROJECT_ONE_ID /tmp/policy.yaml
      

      Se o comando anterior relatar um conflito com outra alteração, repita essas etapas, começando com a leitura da política de IAM do projeto.

  3. No primeiro projeto, crie um coletor do Cloud Logging para encaminhar os registros de auditoria do Cloud para o tópico no segundo projeto:

    gcloud logging sinks create cross-project-sink \
        pubsub.googleapis.com/projects/PROJECT_TWO_ID/topics/my-topic \
        --log-filter='protoPayload.methodName="beta.compute.instances.insert"'

    Um lembrete semelhante ao seguinte será retornado:

    Please remember to grant `serviceAccount:p1011272509317-375795@gcp-sa-logging.iam.gserviceaccount.com` the Pub/Sub Publisher role on the topic.
  4. Defina o ID do projeto do Google Cloud como o segundo projeto:

    gcloud config set project PROJECT_TWO_ID
  5. No segundo projeto, conceda o papel à conta de serviço:

    gcloud pubsub topics add-iam-policy-binding my-topic \
        --member=SERVICE_ACCOUNT \
        --role=roles/pubsub.publisher

    Substitua SERVICE_ACCOUNT pelo endereço de e-mail da conta de serviço retornado na etapa anterior.

  6. Defina o ID do projeto do Google Cloud como seu primeiro projeto:

    gcloud config set project PROJECT_ONE_ID
  7. No primeiro projeto, crie uma instância de VM do Compute Engine.

    Se você estiver usando o Console do Google Cloud para criar a instância de VM, aceite os padrões para os fins deste tutorial.

  8. Defina o ID do projeto do Google Cloud como o segundo projeto:

    gcloud config set project PROJECT_TWO_ID
  9. No segundo projeto, confirme se o evento gerado foi registrado:

    gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:beta.compute.instances.insert" --format=json

    Uma entrada de registro semelhante a esta será retornada:

    Received event of type google.cloud.pubsub.topic.v1.messagePublished. Eventdata: {
      "logName": "projects/workflows-atamel/logs/cloudaudit.googleapis.com%2Factivity",
      "operation": {
        "id": "operation-1635330842489-5cf5321f4f454-ecc363cd-3883c08d",
        "last": true,
        "producer": "compute.googleapis.com"
      },
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "methodName": "beta.compute.instances.insert",
      }
    [...]
    }

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:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

delete-tutorial-resources

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

  2. Remova as configurações padrão do gcloud CLI que você adicionou durante a configuração do tutorial.

    Exemplo:

    gcloud config unset run/region

    ou

    gcloud config unset project

  3. Exclua outros recursos do Google Cloud criados neste tutorial:

    • Exclua o gatilho do Eventarc:

      gcloud eventarc triggers delete TRIGGER_NAME
      
      Substitua TRIGGER_NAME pelo nome do gatilho.

    • Exclua o tópico Pub/Sub:

      gcloud pubsub topics delete TOPIC TOPIC_ID
      
      Substitua TOPIC_ID pelo ID do tópico.

    • Exclua o coletor do Cloud Logging:

      gcloud logging sinks delete SINK_NAME
      
      Substitua SINK_NAME pelo nome do coletor.

A seguir