Encaminhar eventos entre projetos do Google Cloud

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

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 Google Cloud como o segundo projeto:

    gcloud config set project PROJECT_TWO_ID

    Substitua PROJECT_TWO_ID pelo ID do seu segundo projeto doGoogle 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 gera um gatilho chamado cross-project-trigger.

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

    gcloud config set project PROJECT_ONE_ID

    Substitua PROJECT_ONE_ID pelo ID do seu primeiro projeto doGoogle 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 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 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 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 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 Identity and Access Management 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 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 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 Google Cloud para criar a instância de VM, aceite os padrões para os fins deste tutorial.

  8. Defina o ID do projeto 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",
      }
    [...]
    }