Inoltra gli eventi tra i progetti Google Cloud

Questo tutorial mostra come utilizzare Eventarc per leggere gli eventi da un'origine in un progetto Google Cloud e indirizzarli a una destinazione di destinazione in un altro progetto Google Cloud . Ciò è possibile utilizzando Pub/Sub come livello di trasporto tra progetti.

Instradare gli eventi Pub/Sub tra i progetti

Poiché Pub/Sub è un servizio distribuito a livello globale, puoi creare un argomento in un progetto, pubblicare in quell'argomento da un altro progetto e poi attivare Eventarc, che indirizza il messaggio a un servizio Cloud Run:

Eventi tra progetti: Cloud Pub/Sub ed Eventarc

  1. Imposta l'ID progetto Google Cloud sul secondo progetto:

    gcloud config set project PROJECT_TWO_ID

    Sostituisci PROJECT_TWO_ID con l'ID del tuo secondo progettoGoogle Cloud .

  2. Nel secondo progetto:

    1. Abilita le API Cloud Run ed Eventarc:

      gcloud services enable run.googleapis.com eventarc.googleapis.com
    2. Imposta la posizione predefinita:

      REGION=REGION

      Sostituisci REGION con la posizione Eventarc supportata che preferisci. Ad esempio us-central1.

    3. Crea un argomento Pub/Sub:

      TOPIC=my-topic
      gcloud pubsub topics create $TOPIC
    4. Esegui il deployment di un servizio Cloud Run non autenticato utilizzando un'immagine predefinita, us-docker.pkg.dev/cloudrun/container/hello:

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

      Quando vedi l'URL del servizio, il deployment è completato.

    5. Collega l'argomento al servizio con un trigger 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

      Viene creato un trigger denominato cross-project-trigger.

  3. Imposta l'ID progetto Google Cloud sul tuo primo progetto:

    gcloud config set project PROJECT_ONE_ID

    Sostituisci PROJECT_ONE_ID con l'ID del tuo primo progettoGoogle Cloud .

  4. Nel primo progetto, pubblica un messaggio nell'argomento del secondo progetto:

    gcloud pubsub topics publish projects/PROJECT_TWO_ID/topics/$TOPIC --message="hello"
  5. Imposta l'ID progetto Google Cloud sul secondo progetto:

    gcloud config set project PROJECT_TWO_ID
  6. Nel secondo progetto, verifica che l'evento generato sia stato registrato:

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

    Viene restituita una voce di logging simile alla seguente:

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

Esegui il routing degli eventi di Cloud Storage tra i progetti

Utilizza le notifiche Pub/Sub per Cloud Storage per pubblicare eventi da un progetto a un altro e poi indirizzarli a un servizio Cloud Run tramite un trigger Eventarc:

Eventi tra progetti: Cloud Storage ed Eventarc

  1. Imposta l'ID progetto Google Cloud sul tuo primo progetto:

    gcloud config set project PROJECT_ONE_ID
  2. Crea un bucket Cloud Storage:

    PROJECT1=$(gcloud config get-value project)
    BUCKET=$PROJECT1-cross-project
    gcloud storage buckets create gs://$BUCKET --location=${REGION}
  3. Crea una notifica Pub/Sub per il bucket nell'argomento del secondo progetto:

    gcloud storage buckets notifications create gs://$BUCKET --topic=projects/PROJECT_TWO_ID/topics/$TOPIC --payload-format=json
  4. Carica un file nel bucket:

    echo "Hello World" > random.txt
    gcloud storage cp random.txt gs://$BUCKET/random.txt
  5. Imposta l'ID progetto Google Cloud sul secondo progetto:

    gcloud config set project PROJECT_TWO_ID
  6. Nel secondo progetto, verifica che l'evento generato sia stato registrato:

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

    Viene restituita una voce di logging simile alla seguente:

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

Instradare gli eventi Cloud Audit Logs tra i progetti

Le richieste al tuo servizio possono essere attivate quando viene creata una voce di log di controllo che corrisponde ai criteri di filtro del trigger. Per ulteriori informazioni, vedi Determinare i filtri eventi per Cloud Audit Logs. In questo caso, quando viene creata un'istanza VM di Compute Engine nel tuo primo progetto, una voce di log di controllo che corrisponde ai criteri di filtro del trigger ti consente di acquisire e indirizzare un evento a un servizio Cloud Run nel secondo progetto:

Eventi tra progetti: Cloud Audit Logs ed Eventarc

  1. Imposta l'ID progetto Google Cloud sul tuo primo progetto:

    gcloud config set project PROJECT_ONE_ID
  2. Nel primo progetto, abilita i tipi di log Lettura amministratore, Lettura dati e Scrittura dati per Compute Engine:

    Tieni presente che a livello di progetto devi disporre del ruolo roles/owner Identity and Access Management (IAM) per configurare gli audit log dell'accesso ai dati per le tue risorse Google Cloud .

    1. Leggi il criterio IAM del progetto e archivialo in un file:

      gcloud projects get-iam-policy PROJECT_ONE_ID > /tmp/policy.yaml
      
    2. Modifica /tmp/policy.yaml, aggiungendo o modificando solo la configurazione degli audit log di accesso ai dati.

      auditConfigs:
      - auditLogConfigs:
        - logType: ADMIN_READ
        - logType: DATA_READ
        - logType: DATA_WRITE
        service: compute.googleapis.com
      
    3. Scrivi il nuovo criterio IAM:

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

      Se il comando precedente segnala un conflitto con un'altra modifica, ripeti questi passaggi, a partire dalla lettura del criterio IAM del progetto.

  3. Nel primo progetto, crea un sink Cloud Logging per indirizzare Cloud Audit Logs all'argomento nel secondo progetto:

    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"'

    Dovrebbe essere restituito un promemoria simile al seguente:

    Please remember to grant `serviceAccount:p1011272509317-375795@gcp-sa-logging.iam.gserviceaccount.com` the Pub/Sub Publisher role on the topic.
  4. Imposta l'ID progetto Google Cloud sul secondo progetto:

    gcloud config set project PROJECT_TWO_ID
  5. Nel secondo progetto, concedi il ruolo al account di servizio:

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

    Sostituisci SERVICE_ACCOUNT con l'indirizzo email del account di servizio restituito nel passaggio precedente.

  6. Imposta l'ID progetto Google Cloud sul tuo primo progetto:

    gcloud config set project PROJECT_ONE_ID
  7. Nel primo progetto, crea un'istanza VM di Compute Engine.

    Se utilizzi la console Google Cloud per creare l'istanza VM, puoi accettare i valori predefiniti ai fini di questo tutorial.

  8. Imposta l'ID progetto Google Cloud sul secondo progetto:

    gcloud config set project PROJECT_TWO_ID
  9. Nel secondo progetto, verifica che l'evento generato sia stato registrato:

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

    Viene restituita una voce di logging simile alla seguente:

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