Encaminhe eventos entre projetos Google Cloud

Este tutorial mostra como usar o Eventarc para ler eventos de uma origem num projeto e encaminhá-los para um destino noutro projeto. Google Cloud Google Cloud Isto é possível através da utilização do Pub/Sub como uma camada de transporte entre projetos.

Encaminhe eventos Pub/Sub entre projetos

Uma vez que o Pub/Sub é um serviço distribuído globalmente, pode criar um tópico num projeto, publicar nesse tópico a partir de outro projeto e, em seguida, acionar o Eventarc, que encaminha a mensagem para um serviço do Cloud Run:

Eventos entre projetos: Cloud Pub/Sub e Eventarc

  1. Defina o Google Cloud ID do projeto para o seu segundo projeto:

    gcloud config set project PROJECT_TWO_ID

    Substitua PROJECT_TWO_ID pelo ID do seu segundo Google Cloud projeto.

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

    1. Ative as APIs Cloud Run e Eventarc:

      gcloud services enable run.googleapis.com eventarc.googleapis.com
    2. Predefina a localização:

      REGION=REGION

      Substitua REGION pela localização do Eventarc suportada à sua escolha. Por exemplo, us-central1.

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

      TOPIC=my-topic
      gcloud pubsub topics create $TOPIC
    4. Implemente um serviço do Cloud Run não autenticado com 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 vir o URL do serviço, a implementação está concluída.

    5. Associe o tópico ao serviço com um acionador 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

      Esta ação cria um acionador denominado cross-project-trigger.

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

    gcloud config set project PROJECT_ONE_ID

    Substitua PROJECT_ONE_ID pelo ID do seu primeiro Google Cloud projeto.

  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 Google Cloud ID do projeto para o seu segundo projeto:

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

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

    É devolvida uma entrada de registo semelhante à seguinte:

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

Encaminhe eventos do Cloud Storage entre projetos

Use notificações do Pub/Sub para o Cloud Storage para publicar eventos de um projeto para outro e, em seguida, encaminhar os eventos para um serviço do Cloud Run através de um acionador do Eventarc:

Eventos entre projetos: Cloud Storage e Eventarc

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

    gcloud config set project PROJECT_ONE_ID
  2. Crie um contentor 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 Pub/Sub para o contentor no tópico do segundo projeto:

    gcloud storage buckets notifications create gs://$BUCKET --topic=projects/PROJECT_TWO_ID/topics/$TOPIC --payload-format=json
  4. Carregue um ficheiro para o contentor:

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

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

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

    É devolvida uma entrada de registo semelhante à seguinte:

    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",
    [...]
    }

Encaminhe eventos dos registos de auditoria do Google Cloud entre projetos

Os pedidos ao seu serviço podem ser acionados quando é criada uma entrada do registo de auditoria que corresponde aos critérios de filtro do acionador. (Para mais informações, consulte o artigo Determine os filtros de eventos para os registos de auditoria do Cloud.) Neste caso, quando é criada uma instância de VM do Compute Engine no seu primeiro projeto, uma entrada do registo de auditoria que corresponda aos critérios de filtro do acionador permite-lhe capturar e encaminhar um evento para um serviço do Cloud Run no segundo projeto:

Eventos entre projetos: registos de auditoria do Cloud e Eventarc

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

    gcloud config set project PROJECT_ONE_ID
  2. No seu primeiro projeto, ative os tipos de registos Admin Read, Data Read e Data Write para o Compute Engine:

    Tenha em atenção que, ao nível do projeto, precisa da função de gestão de identidade e de acesso (IAM) para configurar os registos de auditoria de acesso a dados para os seus recursos.roles/owner Google Cloud

    1. Leia a política IAM do seu projeto e armazene-a num ficheiro:

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

      auditConfigs:
      - auditLogConfigs:
        - logType: ADMIN_READ
        - logType: DATA_READ
        - logType: DATA_WRITE
        service: compute.googleapis.com
      
    3. Escreva a sua nova Política IAM:

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

      Se o comando anterior comunicar um conflito com outra alteração, repita estes passos, começando por ler a política de IAM do projeto.

  3. No primeiro projeto, crie um destinatário do Cloud Logging para encaminhar os registos de auditoria do Google 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"'

    Deve ser devolvido um lembrete semelhante ao seguinte:

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

    gcloud config set project PROJECT_TWO_ID
  5. No segundo projeto, conceda a função à 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 email da conta de serviço devolvido no passo anterior.

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

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

    Se estiver a usar a Google Cloud consola para criar a instância da VM, pode aceitar as predefinições para os fins deste tutorial.

  8. Defina o Google Cloud ID do projeto para o seu segundo projeto:

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

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

    É devolvida uma entrada de registo semelhante à seguinte:

    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",
      }
    [...]
    }