使用 Pub/Sub 訊息接收事件 (Terraform)

本快速入門導覽課程說明如何使用 Terraform 建立 Eventarc 觸發條件,接收來自 Pub/Sub 的直接事件,並將事件傳送至 Cloud Run 服務。如要進一步瞭解如何使用 Terraform 建立 Eventarc 觸發條件,請參閱「使用 Terraform 建立觸發條件」。

在本快速入門導覽課程中,您將完成下列事項:

  1. 準備部署 Terraform。

  2. 定義 Terraform 設定,以執行下列操作:

    1. 啟用 API。
    2. 建立服務帳戶。
    3. 建立 Pub/Sub 主題做為事件供應商。
    4. 將服務部署至 Cloud Run 做為事件目的地。
    5. 建立 Eventarc 觸發條件。
  3. 套用 Terraform 設定。

這樣一來,您就能將訊息發布至 Pub/Sub 主題,產生事件。Eventarc 觸發條件會將訊息轉送至部署在 Cloud Run 的事件接收器服務,而該服務會記錄事件訊息,為您提供事件導向架構的簡單範例。

事前準備

貴機構定義的安全性限制,可能會導致您無法完成下列步驟。如需疑難排解資訊,請參閱「在受限的 Google Cloud 環境中開發應用程式」。

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. 安裝 Google Cloud CLI。

  3. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  4. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  5. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要「專案建立者」角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

  6. 確認專案已啟用計費功能 Google Cloud

  7. 啟用 Cloud Resource Manager 和 Identity and Access Management (IAM) API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com
  8. 如果您使用本機殼層,請為使用者帳戶建立本機驗證憑證:

    gcloud auth application-default login

    如果您使用 Cloud Shell,則不需要執行這項操作。

    如果系統傳回驗證錯誤,且您使用外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI

  9. 安裝 Google Cloud CLI。

  10. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  11. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  12. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要「專案建立者」角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

  13. 確認專案已啟用計費功能 Google Cloud

  14. 啟用 Cloud Resource Manager 和 Identity and Access Management (IAM) API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com
  15. 如果您使用本機殼層,請為使用者帳戶建立本機驗證憑證:

    gcloud auth application-default login

    如果您使用 Cloud Shell,則不需要執行這項操作。

    如果系統傳回驗證錯誤,且您使用外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI

  16. 如要使用現有專案進行本指南中的操作,請確認您具有完成本指南所需的權限。如果您建立新專案,則已具備必要權限。

    所需權限

    如要取得完成本快速入門導覽課程所需的權限,請要求管理員在專案中授予您下列 IAM 角色:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

    您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

準備部署 Terraform

部署任何 Terraform 資源前,您必須先建立 Terraform 設定檔。您可以使用 Terraform 設定檔,透過 Terraform 語法定義基礎架構的偏好最終狀態。

  1. 如果您使用本機殼層,請安裝 Terraform

    Terraform 已整合至 Cloud Shell 環境,您可以使用 Cloud Shell 部署 Terraform 資源,不必安裝 Terraform。

  2. 在 Cloud Shell 或本機殼層中,設定要套用 Terraform 設定的預設 Google Cloud 專案。每項專案只需要執行一次這個指令,且可以在任何目錄中執行:

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    PROJECT_ID 替換為 Google Cloud 專案 ID。

    請注意,如果您在 Terraform 設定檔中設定明確值,環境變數就會遭到覆寫。

  3. 每個 Terraform 設定檔都必須有自己的目錄 (也稱為「根模組」)。建立目錄,並在該目錄中建立新檔案:

    mkdir DIRECTORY && cd DIRECTORY && touch main.tf

    DIRECTORY 替換為 Terraform 目錄的名稱。

    檔案名稱必須有 .tf 副檔名,例如在本快速入門中,設定檔為 main.tf

定義 Terraform 設定

將下列 Terraform 程式碼片段複製到 main.tf 檔案中。如要從 GitHub 複製整個程式碼範例,請按一下程式碼片段右上角的 >「前往 GitHub 查看」

啟用 API

如要啟用套用 Terraform 設定所需的 API,請使用 google_project_service Terraform 資源:

# Enable Cloud Run API
resource "google_project_service" "run" {
  service            = "run.googleapis.com"
  disable_on_destroy = false
}

# Enable Eventarc API
resource "google_project_service" "eventarc" {
  service            = "eventarc.googleapis.com"
  disable_on_destroy = false
}

# Enable Pub/Sub API
resource "google_project_service" "pubsub" {
  service            = "pubsub.googleapis.com"
  disable_on_destroy = false
}

建立服務帳戶

每個 Eventarc 觸發程序都與 IAM 服務帳戶相關聯。如要建立專屬的服務帳戶以進行測試,請使用 google_service_account Terraform 資源:

# Create a dedicated service account
resource "google_service_account" "eventarc" {
  account_id   = "eventarc-trigger-sa"
  display_name = "Eventarc trigger service account"
}

如果您是在 2021 年 4 月 8 日當天或之前啟用 Pub/Sub 服務代理,請將服務帳戶憑證建立者角色 (roles/iam.serviceAccountTokenCreator) 授予服務代理。

resource "google_project_iam_member" "tokencreator" {
  project  = data.google_project.project.id
  role     = "roles/iam.serviceAccountTokenCreator"
  member   = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com"
}

建立 Pub/Sub 主題做為事件供應商

如要建立 Pub/Sub 主題,請使用 google_pubsub_topic Terraform 資源。如要在主題層級將 Pub/Sub 發布者角色 (roles/pubsub.publisher) 授予服務帳戶,請使用 google_pubsub_topic_iam_member Terraform 資源:

# Create a Pub/Sub topic
resource "google_pubsub_topic" "default" {
  name = "pubsub_topic"
}

# Grant permission to publish messages to a Pub/Sub topic
resource "google_pubsub_topic_iam_member" "pubsubpublisher" {
  project    = google_pubsub_topic.default.project
  topic      = google_pubsub_topic.default.name
  member     = "serviceAccount:${google_service_account.eventarc.email}"
  role       = "roles/pubsub.publisher"
  depends_on = [google_pubsub_topic.default]
}

將事件接收器部署至 Cloud Run

如要建立 Cloud Run 服務做為事件目的地,請使用 google_cloud_run_v2_service Terraform 資源。如要在服務層級將 Cloud Run Invoker 角色 (roles/run.invoker) 授予服務帳戶,請使用 google_cloud_run_v2_service_iam_member Terraform 資源:

# Deploy a Cloud Run service
resource "google_cloud_run_v2_service" "default" {
  name     = "hello-events"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      # This sample container listens to HTTP requests and logs received events
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.eventarc.email
  }

  depends_on = [google_project_service.run]
}

# Grant permission to invoke Cloud Run services
resource "google_cloud_run_v2_service_iam_member" "runinvoker" {
  project    = google_cloud_run_v2_service.default.project
  location   = google_cloud_run_v2_service.default.location
  name       = google_cloud_run_v2_service.default.name
  role       = "roles/run.invoker"
  member     = "serviceAccount:${google_service_account.eventarc.email}"
  depends_on = [google_cloud_run_v2_service.default]
}

建立 Eventarc 觸發條件

如要建立 Eventarc 觸發條件來監聽 Pub/Sub 訊息,請使用 google_eventarc_trigger Terraform 資源:

# Create an Eventarc trigger, routing Pub/Sub events to Cloud Run
resource "google_eventarc_trigger" "default" {
  name     = "trigger-pubsub-cloudrun-tf"
  location = google_cloud_run_v2_service.default.location

  # Capture messages published to a Pub/Sub topic
  matching_criteria {
    attribute = "type"
    value     = "google.cloud.pubsub.topic.v1.messagePublished"
  }

  # Send events to Cloud Run
  destination {
    cloud_run_service {
      service = google_cloud_run_v2_service.default.name
      region  = google_cloud_run_v2_service.default.location
    }
  }

  transport {
    pubsub {
      topic = google_pubsub_topic.default.id
    }
  }

  service_account = google_service_account.eventarc.email
  depends_on = [
    google_project_service.eventarc,
    google_pubsub_topic_iam_member.pubsubpublisher
  ]
}

套用 Terraform 設定

使用 Terraform CLI 根據設定檔佈建基礎架構。詳情請參閱「基本 Terraform 指令」。

  1. 初始化 Terraform。每個目錄只需執行一次這項操作。

    terraform init

    如要使用最新版 Google 供應商,請加入 -upgrade 選項 (選用):

    terraform init -upgrade
  2. 檢查設定,確認 Terraform 將建立或更新的資源符合您的預期:

    terraform plan

    視需要修正設定。

  3. 執行下列指令,並在提示中輸入 yes,套用 Terraform 設定:

    terraform apply

    一般來說,您會一次套用所有設定。不過,您也可以指定特定資源。例如:

    terraform apply -target="google_eventarc_trigger.default"

    啟用 API 後,可能需要幾分鐘的時間,相關動作才會傳播,然後您才能部署任何其他資源。如果遇到問題,請再次嘗試套用 Terraform 設定。

    等待 Terraform 顯示「Apply complete!」訊息。

確認資源建立作業

  1. 確認 Cloud Run 服務已建立:

    gcloud run services list --region us-central1
    

    畫面會顯示如下的輸出內容:

    SERVICE: hello-events
    REGION: us-central1
    URL: https://hello-events-13335919645.us-central1.run.app
    LAST DEPLOYED BY: ...
    LAST DEPLOYED AT: 2024-12-16T15:00:52.606160Z
    
  2. 確認已建立 Eventarc 觸發條件:

    gcloud eventarc triggers list --location us-central1
    

    畫面會顯示如下的輸出內容:

    NAME: trigger-pubsub-cloudrun-tf
    TYPE: google.cloud.pubsub.topic.v1.messagePublished
    DESTINATION: Cloud Run service: hello-events
    ACTIVE: Yes
    LOCATION: us-central1
    

產生及查看 Pub/Sub 主題事件

將訊息發布至 Pub/Sub 主題,即可產生事件。Eventarc 觸發條件會將訊息轉送至部署在 Cloud Run 的事件接收器服務,而該服務會記錄事件訊息。

  1. 找出 Pub/Sub 主題並設為環境變數:

    gcloud config set eventarc/location us-central1
    export RUN_TOPIC=$(gcloud eventarc triggers describe trigger-pubsub-cloudrun-tf \
        --format='value(transport.pubsub.topic)')
    
  2. 如要產生事件,請將訊息發布至 Pub/Sub 主題:

    gcloud pubsub topics publish $RUN_TOPIC --message "Hello World!"
    

    事件會轉送至 Cloud Run 服務,該服務會記錄事件訊息。

  3. 篩選服務建立的記錄項目:

    gcloud logging read 'jsonPayload.message: "Received event of type google.cloud.pubsub.topic.v1.messagePublished"'
    
  4. 尋找類似下列內容的記錄項目:

    jsonPayload:
    ...
    message: 'Received event of type google.cloud.pubsub.topic.v1.messagePublished.
        Event data: Hello World!'
    

您已成功使用 Terraform 將事件接收器服務部署至 Cloud Run,並建立 Eventarc 觸發條件。從 Pub/Sub 產生事件後,您可以在 Cloud Run 記錄中查看該事件。

清除所用資源

完成本快速入門導覽課程所述工作後,您可以刪除建立的資源,避免繼續計費。

執行下列指令,並在提示中輸入 yes,即可移除先前透過 Terraform 設定套用的資源:

terraform destroy

或者,您也可以刪除 Google Cloud 專案,以免產生費用。 刪除 Google Cloud 專案後,系統就會停止對專案使用的所有資源收取費用。

刪除 Google Cloud 專案:

gcloud projects delete PROJECT_ID

如果打算進行多個教學課程及快速入門導覽課程,重複使用專案有助於避免超出專案配額限制。

後續步驟