建立 Cloud Storage 訂閱項目

本文說明如何建立 Cloud Storage 訂閱。您可以使用 Google Cloud 控制台、Google Cloud CLI、用戶端程式庫或 Pub/Sub API 建立 Cloud Storage 訂閱。

事前準備

閱讀本文前,請先熟悉下列內容:

必要角色和權限

以下是角色和權限的相關規範:

  • 如要建立訂閱項目,您必須在專案層級設定存取權控管。

  • 如果訂閱項目和主題位於不同專案中,您也需要資源層級權限,請參閱本節後續的說明。

  • 如要建立 Cloud Storage 訂閱,Pub/Sub 服務代理程式或自訂服務帳戶必須具備寫入特定 Cloud Storage 值區和讀取值區中繼發資訊的權限。如要進一步瞭解如何授予這些權限,請參閱本文件的下一節。

如要取得建立 Cloud Storage 訂閱所需的權限,請要求管理員為您授予專案的 Pub/Sub 編輯者 (roles/pubsub.editor) 身分與存取權管理角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色包含建立 Cloud Storage 訂閱所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要建立 Cloud Storage 訂閱,您必須具備下列權限:

  • 建立訂閱項目: pubsub.subscriptions.create
  • 將訂閱項目附加至主題: pubsub.topics.attachSubscription
  • 從訂閱項目提取: pubsub.subscriptions.consume
  • 取得訂閱項目: pubsub.subscriptions.get
  • 列出訂閱項目: pubsub.subscriptions.list
  • 更新訂閱: pubsub.subscriptions.update
  • 刪除訂閱項目: pubsub.subscriptions.delete
  • 取得訂閱項目的身分與存取權管理政策: pubsub.subscriptions.getIamPolicy
  • 設定訂閱項目的 IAM 政策 pubsub.subscriptions.setIamPolicy

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

如要讓一個專案中的使用者在另一個專案中建立 Cloud Storage 訂閱項目,您必須在兩個專案中為該使用者授予 Pub/Sub 編輯者 (roles/pubsub.editor) 角色。這可提供建立新 Google Cloud 訂閱項目並將其附加至原始主題所需的權限。主題上的 Pub/Sub 編輯者 (roles/pubsub.editor) 角色也有助於將不同專案中的 Google Cloud 訂閱項目附加至主題。

指派角色給服務帳戶

部分 Google Cloud 服務具有 Google Cloud管理的服務帳戶,可讓服務存取您的資源。這些服務帳戶稱為服務代理程式。Pub/Sub 會為每個專案建立並維護服務代理,格式為 service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com

您可以選擇讓 Pub/Sub 服務代理或自訂服務帳戶權限寫入 Cloud Storage 值區。

授予 Pub/Sub 服務代理權限,表示任何在專案中具有建立訂閱項目權限的使用者,都可以寫入 Cloud Storage 值區。如果您想提供更精細的權限,以便寫入 Cloud Storage 值區,請改為設定自訂服務帳戶。

如要進一步瞭解 Cloud Storage IAM,請參閱「Cloud Storage 身分與存取權管理」。

將 Cloud Storage 角色指派給 Pub/Sub 服務代理

如果您想使用 Pub/Sub 服務代理建立 Cloud Storage 訂閱項目,則該代理必須具備寫入特定 Cloud Storage 值區和讀取值區中繼資料的權限。

將 Storage 物件建立者 (roles/storage.objectCreator) 和 Storage 舊版儲存桶讀取者 (roles/storage.legacyBucketReader) 角色授予 Pub/Sub 服務代理。您可以為個別值區或整個專案授予權限。

值區

  1. 前往 Google Cloud 控制台的「Cloud Storage」頁面。

    前往 Cloud Storage

  2. 按一下要寫入訊息的 Cloud Storage 值區。

    「Bucket details」(值區詳細資料) 頁面隨即開啟。

  3. 在「Bucket details」(值區詳細資料) 頁面中,按一下「Permissions」(權限) 分頁標籤。

  4. 在「權限」 >「按照主體查看」分頁中,按一下「授予存取權」

    系統隨即會開啟「授予存取權」頁面。

  5. 在「新增主體」部分,輸入包含訂閱項目的專案 Pub/Sub 服務代理人名稱。

    服務代理的格式為 service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com。舉例來說,如果專案的 PROJECT_NUMBER112233445566,服務代理的格式為 service-112233445566@gcp-sa-pubsub.iam.gserviceaccount.com

  6. 在「Assign roles」 >「Select a role」下拉式選單中,輸入 Creator,然後選取「Storage Object Creator」角色。

  7. 按一下 [Add another role] (新增其他角色)

  8. 在「Select a role」(請選擇角色) 下拉式選單中,輸入 Bucket Reader,然後選取「Storage Legacy Bucket Reader」(Storage 舊版 Bucket Reader) 角色。

  9. 按一下 [儲存]

專案

  1. 前往 Google Cloud 控制台的「IAM」頁面。

    前往身分與存取權管理頁面

  2. 在「權限」 >「按照主體查看」分頁中,按一下「授予存取權」

    系統隨即會開啟「授予存取權」頁面。

  3. 在「新增主體」部分,輸入 Pub/Sub 服務代理人的名稱。

    服務代理的格式為 service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com。舉例來說,如果專案的 PROJECT_NUMBER112233445566,服務代理的格式為 service-112233445566@gcp-sa-pubsub.iam.gserviceaccount.com

  4. 在「Assign roles」 >「Select a role」下拉式選單中,輸入 Storage Admin,然後選取「Storage Admin」角色。

  5. 按一下 [儲存]

將 Cloud Storage 角色指派給自訂服務帳戶

如果您想使用自訂服務帳戶寫入 Cloud Storage 值區,則必須設定下列權限:

  • 自訂服務帳戶必須具備寫入特定 Cloud Storage 值區的權限,以及讀取值區中繼層資料的權限。
  • Pub/Sub 服務代理必須具備自訂服務帳戶的 iam.serviceAccounts.getAccessToken 權限。
  • 建立訂閱項目的使用者必須具備自訂服務帳戶的 iam.serviceAccounts.actAs 權限。

請按照下列步驟建立服務帳戶並授予權限:

  1. 建立自訂服務帳戶。服務帳戶必須與訂閱項目位於相同專案中。

  2. 將 Storage 物件建立者 (roles/storage.objectCreator) 和 Storage Legacy Bucket Reader (roles/storage.legacyBucketReader) 角色授予自訂服務帳戶。

    您可以為專案中的單一資料表或所有資料表授予服務帳戶權限。如要這樣做,請參閱「將角色指派給 Pub/Sub 服務代理人 Google Cloud 」一文中的相應章節。在程序中,將 Pub/Sub 服務代理人電子郵件地址替換為自訂服務帳戶電子郵件地址。

  3. 請在自訂服務帳戶或專案中的所有服務帳戶上,將 iam.serviceAccounts.getAccessToken 權限授予 Pub/Sub 服務代理。您可以將 roles/iam.serviceAccountTokenCreator 角色授予 Pub/Sub 服務代理,藉此授予這項權限。

    請根據您的需求選擇合適的方法。

服務帳戶

  1. 前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。

    前往「Service accounts」(服務帳戶)

  2. 在「Filter」中輸入自訂服務帳戶的名稱。

  3. 從清單中選取服務帳戶。

  4. 按一下「具備存取權的主體」

  5. 按一下「授予存取權」

  6. 在「新增主體」部分,輸入包含訂閱項目的專案 Pub/Sub 服務代理名稱。服務代理的格式為 service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com。舉例來說,如果專案有 project-number=112233445566,服務代理程式格式為 service-112233445566@gcp-sa-pubsub.iam.gserviceaccount.com

  7. 在「Select a role」下拉式選單中,輸入 Service Account,然後選取「Service Account Token Creator」角色。

  8. 按一下 [儲存]

專案

  1. 前往 Google Cloud 控制台的「IAM」頁面。

    前往身分與存取權管理頁面

  2. 按一下「授予存取權」

  3. 在「新增主體」部分,輸入自訂服務帳戶的名稱。

  4. 在「指派角色」部分中,按一下「新增其他角色」

  5. 在「Select a role」下拉式選單中,輸入 Service Account,然後選取「Service Account Token Creator」角色。

  6. 按一下 [儲存]

如果您已建立自訂服務帳戶,應該已具備必要的 iam.serviceAccounts.actAs 權限。如果您需要授予其他人服務帳戶的權限:

  1. 前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。

    前往「Service accounts」(服務帳戶)

  2. 在「Filter」中輸入自訂服務帳戶的名稱。

  3. 從清單中選取服務帳戶。

  4. 按一下「具備存取權的主體」

  5. 按一下「授予存取權」

  6. 在「新增主體」部分,輸入要授予存取權的帳戶名稱。

  7. 在「Select a role」下拉式選單中輸入 Service Account,然後選取「Service Account User」角色。

  8. 按一下 [儲存]

Cloud Storage 訂閱屬性

設定 Cloud Storage 訂閱時,您必須指定所有訂閱類型的共同屬性,以及一些額外的 Cloud Storage 訂閱專屬屬性。

常見的訂閱屬性

瞭解您可以在所有訂閱項目中設定的常見訂閱屬性

值區名稱

您必須先建立 Cloud Storage 值區,才能建立 Cloud Storage 訂閱。

系統會以批次傳送訊息,並儲存在 Cloud Storage 值區中。單一批次或檔案會以物件的形式儲存在值區中。

Cloud Storage 值區必須停用要求者付費

如要建立 Cloud Storage 值區,請參閱「建立值區」。

檔案名稱前置字串、後置字串和日期時間

Cloud Storage 訂閱產生的輸出 Cloud Storage 檔案會以物件形式儲存在 Cloud Storage 值區中。儲存在 Cloud Storage 值區中的物件名稱格式為 <file-prefix><UTC-date-time>_<uuid><file-suffix>

下列清單包含檔案格式和可自訂欄位的詳細資料:

  • <file-prefix> 是自訂檔案名稱前置字元。這是選填欄位。

  • <UTC-date-time> 是可自訂的自動產生字串,會根據物件建立的時間產生。

  • <uuid> 是物件自動產生的隨機字串。

  • <file-suffix> 是自訂檔案名稱尾碼。這是選填欄位。檔案名稱後置字串的結尾不得為「/」。

  • 您可以變更檔案名稱的前置字串和後綴字串:

    • 舉例來說,如果檔案名稱前置字串的值為 prod_,而檔案名稱後置字串的值為 _archive,則範例物件名稱為 prod_2023-09-25T04:10:00+00:00_uN1QuE_archive

    • 如果您未指定檔案名稱前置字串和後置字串,儲存在 Cloud Storage 值區中的物件名稱格式為:<UTC-date-time>_<uuid>

    • Cloud Storage 物件命名規定也適用於檔案名稱的前置字串和後置字串。詳情請參閱「關於 Cloud Storage 物件」。

  • 您可以變更檔案名稱中顯示日期和時間的方式:

    • 您只能使用一次的必要日期時間比對器:年 (YYYYYY)、月 (MM)、日 (DD)、時 (hh)、分 (mm)、秒 (ss)。舉例來說,YY-YYYYMMM 是無效的。

    • 選用比對器 (只能使用一次):日期時間分隔符 (T) 和時區偏移量 (Z+00:00)。

    • 可重複使用的選用元素:連字號 (-)、底線 (_)、半形冒號 (:) 和斜線 (/)。

    • 舉例來說,如果檔案名稱日期時間格式的值為 YYYY-MM-DD/hh_mm_ssZ,則範例物件名稱為 prod_2023-09-25/04_10_00Z_uNiQuE_archive

    • 如果檔案名稱日期時間格式結尾的字元不是比對項目,該字元會取代 <UTC-date-time><uuid> 之間的分隔符。舉例來說,如果檔案名稱日期時間格式的值為 YYYY-MM-DDThh_mm_ss-,則範例物件名稱為 prod_2023-09-25T04_10_00-uNiQuE_archive

檔案批次處理

您可以使用 Cloud Storage 訂閱,決定何時建立新輸出檔案,並將該檔案儲存為 Cloud Storage 值區中的物件。當系統符合其中一個指定的批次處理條件時,Pub/Sub 就會寫入輸出檔案。以下是 Cloud Storage 批次處理條件:

  • Storage 批次作業持續時間上限。這是必要設定。如果指定的最大時間長度已超過,Cloud Storage 訂閱項目就會寫入新的輸出檔案。如果未指定值,系統會套用 5 分鐘的預設值。以下是適用於最大時間長度的值:

    • 最小值 = 1 分鐘
    • 預設值 = 5 分鐘
    • 最大值 = 10 分鐘
  • Storage 批次作業位元組數上限。這是選用設定。如果超出指定的位元組數上限,Cloud Storage 訂閱項目就會寫入新的輸出檔案。以下是適用的最大位元組值:

    • 最小值 = 1 KB
    • 最大值 = 10 GiB
  • Storage 批次作業訊息數上限。這是選用設定。如果超出指定的訊息數量上限,Cloud Storage 訂閱項目就會寫入新的輸出檔案。以下是適用於「最大訊息數量」的值:

    • 最小值 = 1000

舉例來說,您可以將最大時間長度設為 6 分鐘,並將最大位元組數設為 2 GB。如果輸出檔案在第 4 分鐘時達到 2 GB 的檔案大小,Pub/Sub 就會完成先前的檔案,並開始寫入新檔案。

Cloud Storage 訂閱項目可能會同時寫入 Cloud Storage 值區中的多個檔案。如果您已將訂閱項目設為每 6 分鐘建立一個新檔案,可能會發現每 6 分鐘就會建立多個 Cloud Storage 檔案。

在某些情況下,Pub/Sub 可能會在檔案批次處理條件設定的時間之前,就開始寫入新檔案。如果訂閱項目收到的訊息大於最大位元組值,檔案也可能會超過最大位元組值。

檔案格式

建立 Cloud Storage 訂閱時,您可以指定要儲存在 Cloud Storage 值區中的輸出檔案格式,例如 TextAvro

  • 文字:訊息會以純文字格式儲存。換行字元會將檔案中的訊息與前一則訊息分開。系統只會儲存訊息酬載,而不會儲存屬性或其他中繼資料。

  • Avro:訊息會儲存在 Apache Avro 二進位格式中。選取 Avro 後,您可以啟用下列額外屬性:

    • 寫入中繼資料:這個選項可讓您將訊息中繼資料與訊息一併儲存。subscription_namemessage_idpublish_timeattributes 等中繼資料會寫入輸出 Avro 物件的頂層欄位,而資料以外的所有其他訊息屬性 (例如 ordering_key,如果有) 則會新增為 attributes 對應項目中的項目。

      如果停用「寫入中繼資料」,系統只會將訊息酬載寫入輸出 Avro 物件。以下是輸出訊息的 Avro 結構定義,其中已停用寫入中繼資料

      {
        "type": "record",
        "namespace": "com.google.pubsub",
        "name": "PubsubMessage",
        "fields": [
          { "name": "data", "type": "bytes" }
        ]
      }
      

      以下是啟用寫入中繼資料功能的輸出訊息 Avro 結構定義:

      {
        "type": "record",
        "namespace": "com.google.pubsub",
        "name": "PubsubMessageWithMetadata",
        "fields": [
          { "name": "subscription_name", "type": "string" },
          { "name": "message_id", "type": "string"  },
          { "name": "publish_time", "type": {
              "type": "long",
              "logicalType": "timestamp-micros"
            }
          },
          { "name": "attributes", "type": { "type": "map", "values": "string" } },
          { "name": "data", "type": "bytes" }
        ]
      }
      
    • 使用主題結構定義:這個選項可讓 Pub/Sub 在寫入 Avro 檔案時,使用已連結訂閱的 Pub/Sub 主題結構定義

      使用這個選項時,請務必確認下列額外規定:

      • 主題結構定義必須採用 Apache Avro 格式

      • 如果同時啟用「使用主題結構」和「寫入中繼資料」,則主題結構的根目錄必須包含 Record 物件。Pub/Sub 會擴充記錄的欄位清單,納入中繼資料欄位。因此,記錄不得包含任何與中繼資料欄位 (subscription_namemessage_idpublish_timeattributes) 同名的欄位。

服務帳戶

您可以使用下列選項將訊息寫入 BigQuery 資料表或 Cloud Storage 值區:

  • 設定自訂服務帳戶,讓只有具備服務帳戶 iam.serviceAccounts.actAs 權限的使用者,才能建立可寫入資料表或值區的訂閱項目。包含 iam.serviceAccounts.actAs 權限的角色範例是「服務帳戶使用者」 (roles/iam.serviceAccountUser) 角色。

  • 使用預設的 Pub/Sub 服務代理,讓任何可在專案中建立訂閱項目的使用者,建立可寫入資料表或值區的訂閱項目。如果您未指定自訂服務帳戶,預設設定為 Pub/Sub 服務代理。

建立 Cloud Storage 訂閱項目

控制台

  1. 在 Google Cloud 控制台中,前往「訂閱項目」頁面。

    前往「訂閱項目」頁面

  2. 按一下「Create Subscription」 (建立訂閱項目)

  3. 在「Subscription ID」欄位中輸入名稱。

    如要進一步瞭解如何命名訂閱項目,請參閱「命名主題或訂閱項目的規範」。

  4. 從下拉式選單中選擇或建立主題。

    訂閱項目會接收主題的訊息。

    如要瞭解如何建立主題,請參閱「建立及管理主題」一文。

  5. 將「Delivery type」選為「Write to Cloud Storage」

  6. 在 Cloud Storage bucket 中,按一下「Browse」

    • 您可以從任何適當的專案中選取現有值區。

    • 您也可以按一下建立圖示,然後按照畫面上的指示建立新的值區。

      建立值區後,請選取 Cloud Storage 訂閱項目的值區。

      如要進一步瞭解如何建立值區,請參閱「建立值區」。

    指定值區時,Pub/Sub 會檢查 Pub/Sub 服務代理是否具備該值區的適當權限。如果發生權限問題,您會看到類似以下的訊息:Unable to verify if the Pub/Sub service agent has write permissions on this bucket. You may be lacking permissions to view or set permissions

  7. 如果發生權限問題,請按一下「設定權限」,然後按照畫面上的指示操作。

    或者,您也可以按照「將 Cloud Storage 角色指派給 Pub/Sub 服務代理」中的操作說明進行。

  8. 在「File format」(檔案格式) 中,選取「Text」或「Avro」

    如果您選取「Avro」Avro,也可以選擇是否要將郵件中繼資料儲存在輸出內容中。

    如要進一步瞭解這兩個選項 (包括 Avro 格式的訊息中繼資料選項),請參閱「檔案格式」。

  9. 選用:您可以為所有要寫入 Cloud Storage 值區的檔案指定檔案名稱前置字串、後置字串和日期時間。檔案會以物件形式儲存在值區中。

    如要進一步瞭解如何設定檔案前置字串、後置字串和日期時間,請參閱「檔案名稱前置字串、後置字串和日期時間」。

  10. 針對「檔案批次處理」,請指定建立新檔案前,最多可等待的時間。

    您也可以選擇設定檔案的大小上限或訊息數量上限。

    如要進一步瞭解這兩種檔案批次處理選項,請參閱「檔案批次處理」。

  11. 強烈建議您啟用Dead lettering 功能,以便處理訊息失敗問題。

    詳情請參閱「死信主題」。

  12. 您可以保留其他設定的預設值,然後按一下「建立」

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 如要建立 Cloud Storage 訂閱項目,請執行 gcloud pubsub subscriptions create 指令
    gcloud pubsub subscriptions create SUBSCRIPTION_ID \
        --topic=TOPIC_ID \
        --cloud-storage-bucket=BUCKET_NAME \
        --cloud-storage-file-prefix=CLOUD_STORAGE_FILE_PREFIX \
        --cloud-storage-file-suffix=CLOUD_STORAGE_FILE_SUFFIX \
        --cloud-storage-file-datetime-format=CLOUD_STORAGE_FILE_DATETIME_FORMAT \
        --cloud-storage-max-duration=CLOUD_STORAGE_MAX_DURATION \
        --cloud-storage-max-bytes=CLOUD_STORAGE_MAX_BYTES \
        --cloud-storage-max-messages=CLOUD_STORAGE_MAX_MESSAGES \
        --cloud-storage-output-format=CLOUD_STORAGE_OUTPUT_FORMAT \
        --cloud-storage-write-metadata
        --cloud-storage-use-topic-schema

    如果您想使用自訂服務帳戶,請將該帳戶做為額外引數提供:

    gcloud pubsub subscriptions create SUBSCRIPTION_ID \
        --topic=TOPIC_ID \
        --cloud-storage-bucket=BUCKET_NAME \
        --cloud-storage-file-prefix=CLOUD_STORAGE_FILE_PREFIX \
        --cloud-storage-file-suffix=CLOUD_STORAGE_FILE_SUFFIX \
        --cloud-storage-file-datetime-format=CLOUD_STORAGE_FILE_DATETIME_FORMAT \
        --cloud-storage-max-duration=CLOUD_STORAGE_MAX_DURATION \
        --cloud-storage-max-bytes=CLOUD_STORAGE_MAX_BYTES \
        --cloud-storage-max-messages=CLOUD_STORAGE_MAX_MESSAGES \
        --cloud-storage-output-format=CLOUD_STORAGE_OUTPUT_FORMAT \
        --cloud-storage-write-metadata
        --cloud-storage-use-topic-schema
        --cloud-storage-service-account-email=SERVICE_ACCOUNT_NAME
        

    在指令中,只有 SUBSCRIPTION_ID--topic 旗標和 --cloud-storage-bucket 旗標是必要的。其餘的旗標為選用,可以省略。

    更改下列內容:

    • SUBSCRIPTION_ID:新 Cloud Storage 訂閱項目的名稱或 ID。
    • TOPIC_ID:主題的名稱或 ID。
    • BUCKET_NAME:指定現有值區的名稱。例如,prod_bucket。儲存格名稱不得包含專案 ID。如要建立值區,請參閱「建立值區」。
    • CLOUD_STORAGE_FILE_PREFIX:指定 Cloud Storage 檔案名稱的前置字串。例如:log_events_
    • CLOUD_STORAGE_FILE_SUFFIX:指定 Cloud Storage 檔案名稱的後置字串。例如:.txt
    • CLOUD_STORAGE_FILE_DATETIME_FORMAT:指定 Cloud Storage 檔案名稱的日期時間格式。例如:YYYY-MM-DD/hh_mm_ssZ
    • CLOUD_STORAGE_MAX_DURATION:在建立新 Cloud Storage 檔案前,可經過的最大時間長度。這個值必須介於 1 公尺至 10 公尺之間。例如:5m
    • CLOUD_STORAGE_MAX_BYTES:在建立新檔案前,可寫入 Cloud Storage 檔案的最大位元組數。值必須介於 1KB 至 10GB 之間。例如:20MB
    • CLOUD_STORAGE_MAX_MESSAGES:在建立新檔案前,可寫入 Cloud Storage 檔案的訊息數量上限。值必須大於或等於 1000。例如:100000
    • CLOUD_STORAGE_OUTPUT_FORMAT:寫入 Cloud Storage 的資料輸出格式。值如下:
      • text:訊息會以原始文字寫入,並以換行符號分隔。
      • avro:訊息會以 Avro 二進位檔案格式寫入。--cloud-storage-write-metadata--cloud-storage-use-topic-schema 只會影響輸出格式為 avro 的訂閱項目。
    • SERVICE_ACCOUNT_NAME:指定用於寫入 Cloud Storage 的服務帳戶名稱。

C++

在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 C++。詳情請參閱 Pub/Sub C++ API 參考說明文件

如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。

namespace pubsub = ::google::cloud::pubsub;
namespace pubsub_admin = ::google::cloud::pubsub_admin;
[](pubsub_admin::SubscriptionAdminClient client,
   std::string const& project_id, std::string const& topic_id,
   std::string const& subscription_id, std::string const& bucket) {
  google::pubsub::v1::Subscription request;
  request.set_name(
      pubsub::Subscription(project_id, subscription_id).FullName());
  request.set_topic(pubsub::Topic(project_id, topic_id).FullName());
  request.mutable_cloud_storage_config()->set_bucket(bucket);
  auto sub = client.CreateSubscription(request);
  if (!sub) {
    if (sub.status().code() == google::cloud::StatusCode::kAlreadyExists) {
      std::cout << "The subscription already exists\n";
      return;
    }
    throw std::move(sub).status();
  }

  std::cout << "The subscription was successfully created: "
            << sub->DebugString() << "\n";
}

C#

在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 C#。詳情請參閱 Pub/Sub C# API 參考說明文件

如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。


using Google.Cloud.PubSub.V1;
using Google.Protobuf.WellKnownTypes;
using System;

public class CreateCloudStorageSubscriptionSample
{
    public Subscription CreateCloudStorageSubscription(string projectId, string topicId, string subscriptionId,
        string bucket, string filenamePrefix, string filenameSuffix, TimeSpan maxDuration)
    {
        SubscriberServiceApiClient subscriber = SubscriberServiceApiClient.Create();
        TopicName topicName = TopicName.FromProjectTopic(projectId, topicId);
        SubscriptionName subscriptionName = SubscriptionName.FromProjectSubscription(projectId, subscriptionId);

        var subscriptionRequest = new Subscription
        {
            SubscriptionName = subscriptionName,
            TopicAsTopicName = topicName,
            CloudStorageConfig = new CloudStorageConfig
            {
                Bucket = bucket,
                FilenamePrefix = filenamePrefix,
                FilenameSuffix = filenameSuffix,
                MaxDuration = Duration.FromTimeSpan(maxDuration)
            }
        };
        var subscription = subscriber.CreateSubscription(subscriptionRequest);
        return subscription;
    }
}

Go

在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Go。詳情請參閱 Pub/Sub Go API 參考說明文件

如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/pubsub"
)

// createCloudStorageSubscription creates a Pub/Sub subscription that exports messages to Cloud Storage.
func createCloudStorageSubscription(w io.Writer, projectID, subID string, topic *pubsub.Topic, bucket string) error {
	// projectID := "my-project-id"
	// subID := "my-sub"
	// topic of type https://godoc.org/cloud.google.com/go/pubsub#Topic
	// note bucket should not have the gs:// prefix
	// bucket := "my-bucket"
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %w", err)
	}
	defer client.Close()

	sub, err := client.CreateSubscription(ctx, subID, pubsub.SubscriptionConfig{
		Topic: topic,
		CloudStorageConfig: pubsub.CloudStorageConfig{
			Bucket:         bucket,
			FilenamePrefix: "log_events_",
			FilenameSuffix: ".avro",
			OutputFormat:   &pubsub.CloudStorageOutputFormatAvroConfig{WriteMetadata: true},
			MaxDuration:    1 * time.Minute,
			MaxBytes:       1e8,
		},
	})
	if err != nil {
		return fmt.Errorf("client.CreateSubscription: %w", err)
	}
	fmt.Fprintf(w, "Created Cloud Storage subscription: %v\n", sub)

	return nil
}

Java

在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Java。詳情請參閱 Pub/Sub Java API 參考說明文件

如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。

import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
import com.google.protobuf.Duration;
import com.google.pubsub.v1.CloudStorageConfig;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.ProjectTopicName;
import com.google.pubsub.v1.Subscription;
import java.io.IOException;

public class CreateCloudStorageSubscriptionExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String topicId = "your-topic-id";
    String subscriptionId = "your-subscription-id";
    String bucket = "your-bucket";
    String filenamePrefix = "log_events_";
    String filenameSuffix = ".text";
    Duration maxDuration = Duration.newBuilder().setSeconds(300).build();

    createCloudStorageSubscription(
        projectId, topicId, subscriptionId, bucket, filenamePrefix, filenameSuffix, maxDuration);
  }

  public static void createCloudStorageSubscription(
      String projectId,
      String topicId,
      String subscriptionId,
      String bucket,
      String filenamePrefix,
      String filenameSuffix,
      Duration maxDuration)
      throws IOException {
    try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {

      ProjectTopicName topicName = ProjectTopicName.of(projectId, topicId);
      ProjectSubscriptionName subscriptionName =
          ProjectSubscriptionName.of(projectId, subscriptionId);

      CloudStorageConfig cloudStorageConfig =
          CloudStorageConfig.newBuilder()
              .setBucket(bucket)
              .setFilenamePrefix(filenamePrefix)
              .setFilenameSuffix(filenameSuffix)
              .setMaxDuration(maxDuration)
              .build();

      Subscription subscription =
          subscriptionAdminClient.createSubscription(
              Subscription.newBuilder()
                  .setName(subscriptionName.toString())
                  .setTopic(topicName.toString())
                  .setCloudStorageConfig(cloudStorageConfig)
                  .build());

      System.out.println("Created a CloudStorage subscription: " + subscription.getAllFields());
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */
// const topicName = 'YOUR_TOPIC_NAME';
// const subscriptionName = 'YOUR_SUBSCRIPTION_NAME';
// const bucket = 'YOUR_BUCKET_ID';
// const filenamePrefix = 'YOUR_FILENAME_PREFIX';
// const filenameSuffix = 'YOUR_FILENAME_SUFFIX';
// const maxDuration = 60;

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function createCloudStorageSubscription(
  topicName,
  subscriptionName,
  bucket,
  filenamePrefix,
  filenameSuffix,
  maxDuration,
) {
  const options = {
    cloudStorageConfig: {
      bucket,
      filenamePrefix,
      filenameSuffix,
      maxDuration: {
        seconds: maxDuration,
      },
    },
  };

  await pubSubClient
    .topic(topicName)
    .createSubscription(subscriptionName, options);

  console.log(
    `Created subscription ${subscriptionName} with a cloud storage configuration.`,
  );
}

Node.js

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */
// const topicName = 'YOUR_TOPIC_NAME';
// const subscriptionName = 'YOUR_SUBSCRIPTION_NAME';
// const bucket = 'YOUR_BUCKET_ID';
// const filenamePrefix = 'YOUR_FILENAME_PREFIX';
// const filenameSuffix = 'YOUR_FILENAME_SUFFIX';
// const maxDuration = 60;

// Imports the Google Cloud client library
import {CreateSubscriptionOptions, PubSub} from '@google-cloud/pubsub';

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function createCloudStorageSubscription(
  topicName: string,
  subscriptionName: string,
  bucket: string,
  filenamePrefix: string,
  filenameSuffix: string,
  maxDuration: number,
) {
  const options: CreateSubscriptionOptions = {
    cloudStorageConfig: {
      bucket,
      filenamePrefix,
      filenameSuffix,
      maxDuration: {
        seconds: maxDuration,
      },
    },
  };

  await pubSubClient
    .topic(topicName)
    .createSubscription(subscriptionName, options);

  console.log(
    `Created subscription ${subscriptionName} with a cloud storage configuration.`,
  );
}

PHP

在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 PHP。詳情請參閱 Pub/Sub PHP API 參考說明文件

如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。

use Google\Cloud\PubSub\PubSubClient;

/**
 * Creates a Pub/Sub GCS subscription.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 * @param string $subscriptionName  The Pub/Sub subscription name.
 * @param string $bucket The Cloud Storage bucket name without any prefix like "gs://".
 */
function create_cloud_storage_subscription($projectId, $topicName, $subscriptionName, $bucket)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $subscription = $topic->subscription($subscriptionName);
    $config = ['bucket' => $bucket];
    $subscription->create([
        'cloudStorageConfig' => $config
    ]);

    printf('Subscription created: %s' . PHP_EOL, $subscription->name());
}

Python

在嘗試這個範例之前,請先按照 Pub/Sub 快速入門:使用用戶端程式庫中的操作說明設定 Python。詳情請參閱 Pub/Sub Python API 參考說明文件

如要向 Pub/Sub 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。

from google.cloud import pubsub_v1
from google.protobuf import duration_pb2

# TODO(developer)
# project_id = "your-project-id"
# topic_id = "your-topic-id"
# subscription_id = "your-subscription-id"
# bucket = "my-bucket"

filename_prefix = "log_events_"
filename_suffix = ".avro"
# Either CloudStorageConfig.AvroConfig or CloudStorageConfig.TextConfig
# defaults to TextConfig
avro_config = pubsub_v1.types.CloudStorageConfig.AvroConfig(write_metadata=True)

publisher = pubsub_v1.PublisherClient()
subscriber = pubsub_v1.SubscriberClient()
topic_path = publisher.topic_path(project_id, topic_id)
subscription_path = subscriber.subscription_path(project_id, subscription_id)
max_duration = duration_pb2.Duration()
max_duration.FromSeconds(300)

cloudstorage_config = pubsub_v1.types.CloudStorageConfig(
    bucket=bucket,
    filename_prefix=filename_prefix,
    filename_suffix=filename_suffix,
    avro_config=avro_config,
    # Min 1 minutes, max 10 minutes
    max_duration=max_duration,
    # Min 1 KB, max 10 GiB
    max_bytes=10000000,
)

# Wrap the subscriber in a 'with' block to automatically call close() to
# close the underlying gRPC channel when done.
with subscriber:
    subscription = subscriber.create_subscription(
        request={
            "name": subscription_path,
            "topic": topic_path,
            "cloud_storage_config": cloudstorage_config,
        }
    )

print(f"CloudStorage subscription created: {subscription}.")
print(f"Bucket for subscription is: {bucket}")
print(f"Prefix is: {filename_prefix}")
print(f"Suffix is: {filename_suffix}")

監控 Cloud Storage 訂閱項目

Cloud Monitoring 提供多項指標,可用於監控訂閱項目

如需 Pub/Sub 相關指標的完整清單和說明,請參閱 Pub/Sub 監控說明文件

您也可以在 Pub/Sub 中監控訂閱項目。

後續步驟