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:
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 .No segundo projeto, faça o seguinte:
Ative as APIs do Cloud Run e do Eventarc:
gcloud services enable run.googleapis.com eventarc.googleapis.com
Defina o local padrão:
REGION=REGION
Substitua
REGION
pelo local compatível com o Eventarc de sua escolha. Por exemplo,us-central1
.Crie um tópico do Pub/Sub:
TOPIC=my-topic gcloud pubsub topics create $TOPIC
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.
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
.
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 .No primeiro projeto, publique uma mensagem no tópico do segundo projeto:
gcloud pubsub topics publish projects/PROJECT_TWO_ID/topics/$TOPIC --message="hello"
Defina o ID do projeto Google Cloud como o segundo projeto:
gcloud config set project PROJECT_TWO_ID
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:
Defina o ID do projeto Google Cloud como seu primeiro projeto:
gcloud config set project PROJECT_ONE_ID
Crie um bucket do Cloud Storage:
PROJECT1=$(gcloud config get-value project) BUCKET=$PROJECT1-cross-project gcloud storage buckets create gs://$BUCKET --location=${REGION}
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
Faça upload de um arquivo no bucket:
echo "Hello World" > random.txt gcloud storage cp random.txt gs://$BUCKET/random.txt
Defina o ID do projeto Google Cloud como o segundo projeto:
gcloud config set project PROJECT_TWO_ID
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:
Defina o ID do projeto Google Cloud como seu primeiro projeto:
gcloud config set project PROJECT_ONE_ID
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 .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
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
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.
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.
Defina o ID do projeto Google Cloud como o segundo projeto:
gcloud config set project PROJECT_TWO_ID
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.Defina o ID do projeto Google Cloud como seu primeiro projeto:
gcloud config set project PROJECT_ONE_ID
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.
Defina o ID do projeto Google Cloud como o segundo projeto:
gcloud config set project PROJECT_TWO_ID
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", } [...] }