在 Google Cloud 專案之間轉送事件

本教學課程說明如何使用 Eventarc,從一個 Google Cloud 專案中的來源讀取事件,並將事件轉送至另一個 Google Cloud 專案中的目標目的地。您可以使用 Pub/Sub 做為跨專案傳輸層,達到這個目的。

跨專案傳送 Pub/Sub 事件

由於 Pub/Sub 是全球分散式服務,您可以在一個專案中建立主題,從另一個專案發布至該主題,然後觸發 Eventarc,將訊息傳送至 Cloud Run 服務:

跨專案事件:Cloud Pub/Sub 和 Eventarc

  1. 將 Google Cloud 專案 ID 設為第二個專案:

    gcloud config set project PROJECT_TWO_ID

    PROJECT_TWO_ID 替換為第二個專案的 ID。Google Cloud

  2. 在第二個專案中,執行下列步驟:

    1. 啟用 Cloud Run 和 Eventarc API:

      gcloud services enable run.googleapis.com eventarc.googleapis.com
    2. 設定預設位置:

      REGION=REGION

      REGION 替換為您選擇的支援 Eventarc 位置。例如:us-central1

    3. 建立 Pub/Sub 主題:

      TOPIC=my-topic
      gcloud pubsub topics create $TOPIC
    4. 使用預先建構的映像檔 us-docker.pkg.dev/cloudrun/container/hello 部署未經驗證的 Cloud Run 服務:

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

      看到服務網址時,表示部署作業已完成。

    5. 使用 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

      這項操作會建立名為 cross-project-trigger 的觸發條件。

  3. 將 Google Cloud 專案 ID 設為第一個專案:

    gcloud config set project PROJECT_ONE_ID

    PROJECT_ONE_ID 替換為第一個專案的 ID。Google Cloud

  4. 在第一個專案中,將訊息發布到第二個專案的主題:

    gcloud pubsub topics publish projects/PROJECT_TWO_ID/topics/$TOPIC --message="hello"
  5. 將 Google Cloud 專案 ID 設為第二個專案:

    gcloud config set project PROJECT_TWO_ID
  6. 在第二個專案中,確認系統是否已記錄產生的事件:

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

    系統會傳回類似以下的記錄項目:

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

在專案間轉送 Cloud Storage 事件

使用 Cloud Storage 適用的 Pub/Sub 通知,將事件從一個專案發布至另一個專案,然後透過 Eventarc 觸發條件將事件轉送至 Cloud Run 服務:

跨專案事件:Cloud Storage 和 Eventarc

  1. 將 Google Cloud 專案 ID 設為第一個專案:

    gcloud config set project PROJECT_ONE_ID
  2. 建立 Cloud Storage bucket:

    PROJECT1=$(gcloud config get-value project)
    BUCKET=$PROJECT1-cross-project
    gcloud storage buckets create gs://$BUCKET --location=${REGION}
  3. 為第二個專案中的主題建立 bucket 的 Pub/Sub 通知:

    gcloud storage buckets notifications create gs://$BUCKET --topic=projects/PROJECT_TWO_ID/topics/$TOPIC --payload-format=json
  4. 將檔案上傳至 bucket:

    echo "Hello World" > random.txt
    gcloud storage cp random.txt gs://$BUCKET/random.txt
  5. 將 Google Cloud 專案 ID 設為第二個專案:

    gcloud config set project PROJECT_TWO_ID
  6. 在第二個專案中,確認系統是否已記錄產生的事件:

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

    系統會傳回類似以下的記錄項目:

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

在專案間傳送 Cloud 稽核記錄事件

如果建立的稽核記錄項目符合觸發條件的篩選條件,系統就會觸發對服務的要求。(詳情請參閱「決定 Cloud 稽核記錄的事件篩選器」一文)。在本例中,當您在第一個專案中建立 Compute Engine VM 執行個體時,符合觸發條件篩選條件的稽核記錄項目會擷取事件,並將事件傳送至第二個專案中的 Cloud Run 服務:

跨專案事件:Cloud 稽核記錄和 Eventarc

  1. 將 Google Cloud 專案 ID 設為第一個專案:

    gcloud config set project PROJECT_ONE_ID
  2. 在第一個專案中,為 Compute Engine 啟用「管理員讀取」、「資料讀取」和「資料寫入」記錄類型:

    請注意,在專案層級,您需要 Identity and Access Management (IAM) 角色,才能為資源設定資料存取稽核記錄。roles/owner Google Cloud

    1. 讀取專案的 IAM 政策,並儲存在檔案中:

      gcloud projects get-iam-policy PROJECT_ONE_ID > /tmp/policy.yaml
      
    2. 編輯 /tmp/policy.yaml,僅新增或變更資料存取稽核記錄設定。

      auditConfigs:
      - auditLogConfigs:
        - logType: ADMIN_READ
        - logType: DATA_READ
        - logType: DATA_WRITE
        service: compute.googleapis.com
      
    3. 撰寫新的 IAM 政策:

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

      如果前述指令回報與其他變更發生衝突,請重複這些步驟,從讀取專案的 IAM 政策開始。

  3. 在第一個專案中,建立 Cloud Logging 接收器,將 Cloud 稽核記錄傳送至第二個專案中的主題:

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

    系統應會傳回類似以下的提醒:

    Please remember to grant `serviceAccount:p1011272509317-375795@gcp-sa-logging.` the Pub/Sub Publisher role on the topic.
  4. 將 Google Cloud 專案 ID 設為第二個專案:

    gcloud config set project PROJECT_TWO_ID
  5. 在第二個專案中,將角色授予服務帳戶:

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

    SERVICE_ACCOUNT 替換為上一個步驟傳回的服務帳戶電子郵件地址。

  6. 將 Google Cloud 專案 ID 設為第一個專案:

    gcloud config set project PROJECT_ONE_ID
  7. 在第一個專案中建立 Compute Engine VM 執行個體

    如果您使用 Google Cloud 控制台建立 VM 執行個體,可以接受預設值,以符合本教學課程的目的。

  8. 將 Google Cloud 專案 ID 設為第二個專案:

    gcloud config set project PROJECT_TWO_ID
  9. 在第二個專案中,確認系統是否已記錄產生的事件:

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

    系統會傳回類似以下的記錄項目:

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