本文說明如何建立 BigQuery 訂閱項目。您可以使用 Google Cloud 控制台、Google Cloud CLI、用戶端程式庫或 Pub/Sub API 建立 BigQuery 訂閱項目。
事前準備
閱讀本文前,請務必熟悉下列概念:
- 訂閱的運作方式。 
- BigQuery 訂閱項目的工作流程。 
- 如何設定無效信件主題,處理訊息傳送失敗的問題。 
除了熟悉 Pub/Sub 和 BigQuery 之外,請務必符合下列先決條件,再建立 BigQuery 訂閱項目:
- BigQuery 資料表已存在。或者,您也可以在建立 BigQuery 訂閱項目時建立資料表,詳情請參閱本文後續章節。 
- Pub/Sub 主題結構定義與 BigQuery 資料表結構定義的相容性。如果新增不相容的 BigQuery 資料表,系統會顯示與相容性相關的錯誤訊息。詳情請參閱「結構定義相容性」。 
必要角色和權限
以下是角色和權限相關的規範:
- 如要建立訂閱項目,您必須在專案層級設定存取權控管。 
- 如果訂閱項目和主題位於不同專案中,您也需要資源層級權限,本節稍後會說明這點。 
- 如要建立 BigQuery 訂閱項目,Pub/Sub 服務代理程式或自訂服務帳戶必須具備寫入特定 BigQuery 資料表的權限。如要進一步瞭解如何授予這些權限,請參閱本文的下一節。 
- 您可以在專案中設定 BigQuery 訂閱項目,將資料寫入其他專案的 BigQuery 資料表。 
    
      如要取得建立 BigQuery 訂閱項目所需的權限,請要求管理員授予您專案的 Pub/Sub 編輯者  (roles/pubsub.editor) 身分與存取權管理角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
  
  
這個預先定義的角色具備建立 BigQuery 訂閱項目所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要建立 BigQuery 訂閱項目,您必須具備下列權限:
- 
                從訂閱項目提取:
                  pubsub.subscriptions.consume
- 
                建立訂閱項目:
                  pubsub.subscriptions.create
- 
                刪除訂閱項目:
                  pubsub.subscriptions.delete
- 
                取得訂閱方案:
                  pubsub.subscriptions.get
- 
                列出訂閱項目:
                  pubsub.subscriptions.list
- 
                更新訂閱項目:
                  pubsub.subscriptions.update
- 
                將訂閱項目附加至主題:
                  pubsub.topics.attachSubscription
- 
                取得訂閱項目的 IAM 政策:
                  pubsub.subscriptions.getIamPolicy
- 
                為訂閱項目設定 IAM 政策:
                  pubsub.subscriptions.setIamPolicy
如要允許某個專案中的主體在另一個專案中建立 BigQuery 訂閱項目,您必須在兩個專案中都授予該主體 Pub/Sub 編輯者 (roles/pubsub.editor) 角色。這項角色提供建立新 BigQuery 訂閱項目,並將其附加至原始主題的必要權限。主題的 Pub/Sub 編輯者 (roles/pubsub.editor) 角色也有助於將不同專案中的 BigQuery 訂閱項目附加至主題。
指派角色給服務帳戶
部分 Google Cloud 服務有 Google Cloud代管的服務帳戶,可讓服務存取您的資源。這些服務帳戶稱為服務代理程式。Pub/Sub 會為每個專案建立並維護服務代理程式,格式為 service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com。
您可以選擇讓 Pub/Sub 服務代理或自訂服務帳戶權限寫入 BigQuery 資料表。
授予 Pub/Sub 服務代理權限後,凡是有權在專案中建立訂閱項目的使用者,都能寫入 BigQuery 資料表。如要提供更精細的 BigQuery 資料表寫入權限,請改為設定自訂服務帳戶。
如要進一步瞭解 BigQuery IAM,請參閱 BigQuery 角色和權限。
將 BigQuery 角色指派給 Pub/Sub 服務代理程式
如要使用 Pub/Sub 服務代理程式建立 BigQuery 訂閱項目,該代理程式必須有權寫入特定 BigQuery 資料表,並讀取資料表的中繼資料。
將 BigQuery 資料編輯者 (roles/bigquery.dataEditor) 角色授予 Pub/Sub 服務代理程式。您可以針對個別表格或整個專案授予權限。
資料表
- 前往 Google Cloud 控制台的「BigQuery Studio」。 
- 在標示為「依名稱和標籤篩選」的 Explorer 窗格搜尋方塊中,輸入資料表名稱並按下 Enter 鍵。 
- 按一下要授予權限的表格。 
- 依序選取表格的「更多動作」 >「共用」 >「權限」。 - 或者,按一下表格,然後在主頁面依序點選「共用」 >「權限」。 - 「共用權限」視窗隨即開啟。 
- 按一下「新增主體」。 
- 在「新增主體」部分,輸入包含訂閱項目的專案的 Pub/Sub 服務代理名稱。服務代理的格式為 - service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com。舉例來說,如果專案 ID 為- project-number=112233445566,服務代理人的格式為- service-112233445566@gcp-sa-pubsub.iam.gserviceaccount.com。
- 在「Select a role」(選取角色) 下拉式選單中輸入 - BigQuery,然後選取「BigQuery Data Editor」(BigQuery 資料編輯者) 角色。
- 按一下 [儲存]。 
專案
- 前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。 
- 按一下「授予存取權」。 
- 在「新增主體」部分,輸入 Pub/Sub 服務代理程式的名稱。服務代理的格式為 - service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com。舉例來說,如果專案 ID 為- project-number=112233445566,服務代理人的格式為- service-112233445566@gcp-sa-pubsub.iam.gserviceaccount.com。
- 在「指派角色」部分中,按一下「新增其他角色」。 
- 在「Select a role」(選取角色) 下拉式選單中輸入 - BigQuery,然後選取「BigQuery Data Editor」(BigQuery 資料編輯者) 角色。
- 按一下 [儲存]。 
將 BigQuery 角色指派給自訂服務帳戶
如要使用自訂服務帳戶寫入 BigQuery 資料表,請設定下列權限:
- 自訂服務帳戶必須具備寫入特定 BigQuery 資料表和讀取資料表的中繼資料的權限。
- Pub/Sub 服務代理必須具備自訂服務帳戶的 iam.serviceAccounts.getAccessToken權限。
- 建立訂閱方案的使用者必須具備自訂服務帳戶的iam.serviceAccounts.actAs權限。
請按照下列步驟建立服務帳戶並授予權限:
- 建立自訂服務帳戶。服務帳戶必須與訂閱項目位於相同專案。 
- 向自訂服務帳戶授予「BigQuery 資料編輯者」( - roles/bigquery.dataEditor) 角色。- 您可以授予服務帳戶專案中單一資料表的權限,或是專案中所有資料表的權限。如要這麼做,請參閱「將 BigQuery 角色指派給 Pub/Sub 服務代理程式」一文中的適當章節。在程序中,將 Pub/Sub 服務代理人電子郵件地址替換為自訂服務帳戶電子郵件地址。 
- 將自訂服務帳戶或專案中所有服務帳戶的 - iam.serviceAccounts.getAccessToken權限授予 Pub/Sub 服務代理程式。如要授予這項權限,請將- roles/iam.serviceAccountTokenCreator角色授予 Pub/Sub 服務代理。- 請依據需求選擇適當的方法。 
服務帳戶
- 前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。 
- 在「Filter」(篩選器) 中輸入自訂服務帳戶的名稱。 
- 從清單中選取服務帳戶。 
- 按一下「具備存取權的主體」。 
- 按一下「授予存取權」。 
- 在「新增主體」部分,輸入包含訂閱項目的專案的 Pub/Sub 服務代理程式名稱。服務代理的格式為 - service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com。舉例來說,如果專案 ID 為- project-number=112233445566,服務代理人的格式為- service-112233445566@gcp-sa-pubsub.iam.gserviceaccount.com。
- 在「Select a role」(請選擇角色) 下拉式選單中輸入 - Service Account,然後選取「Service Account Token Creator」(服務帳戶憑證建立者) 角色。
- 按一下 [儲存]。 
專案
- 前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。 
- 按一下「授予存取權」。 
- 在「新增主體」部分,輸入自訂服務帳戶的名稱。 
- 在「指派角色」部分中,按一下「新增其他角色」。 
- 在「Select a role」(請選擇角色) 下拉式選單中輸入 - Service Account,然後選取「Service Account Token Creator」(服務帳戶憑證建立者) 角色。
- 按一下 [儲存]。 
如果您建立了自訂服務帳戶,應該已具備必要的 iam.serviceAccounts.actAs 權限。如要授予他人服務帳戶的權限:
- 前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。 
- 在「Filter」(篩選器) 中輸入自訂服務帳戶的名稱。 
- 從清單中選取服務帳戶。 
- 按一下「具備存取權的主體」。 
- 按一下「授予存取權」。 
- 在「新增主體」部分,輸入要授予存取權的帳戶名稱。 
- 在「Select a role」(選取角色) 下拉式選單中輸入 - Service Account,然後選取「Service Account User」(服務帳戶使用者) 角色。
- 此外,如果 BigQuery 資料表是 Apache Iceberg 資料表,請授予 Pub/Sub 服務帳戶「Storage 管理員」角色 ( - roles/storage.admin),以便存取 Cloud Storage bucket。
- 按一下 [儲存]。 
BigQuery 訂閱項目屬性
設定 BigQuery 訂閱項目時,您可以指定下列屬性。
常見屬性
瞭解可為所有訂閱項目設定的常見訂閱項目屬性。
使用主題結構定義
這個選項可讓 Pub/Sub 使用訂閱項目所連結的 Pub/Sub 主題結構定義。此外,Pub/Sub 會將訊息中的欄位寫入 BigQuery 資料表中的對應欄。
使用這個選項時,請務必確認是否符合下列額外規定:
- 主題結構定義和 BigQuery 結構定義中的欄位必須具有相同名稱,且類型必須彼此相容。 
- 主題結構定義中的任何選填欄位,在 BigQuery 結構定義中也必須是選填欄位。 
- 主題結構定義中的必填欄位不一定要是 BigQuery 結構定義中的必填欄位。 
- 如果 BigQuery 欄位不在主題結構定義中,這些 BigQuery 欄位就必須處於 - NULLABLE模式。
- 如果主題結構定義有 BigQuery 結構定義中沒有的額外欄位,且這些欄位可以捨棄,請選取「捨棄不明欄位」選項。 
- 您只能選取其中一個訂閱屬性:「使用主題結構定義」或「使用資料表結構定義」。 
如未選取「使用主題結構定義」或「使用資料表結構定義」選項,請確認 BigQuery 資料表有名為「data」的資料欄,且類型為 BYTES、STRING 或 JSON。dataPub/Sub 會將訊息寫入這個 BigQuery 資料欄。
您可能不會立即看到 Pub/Sub 主題結構定義或 BigQuery 資料表結構定義的變更,對寫入 BigQuery 資料表的訊息生效。舉例來說,如果啟用「捨棄不明欄位」選項,且 Pub/Sub 結構定義中有某個欄位,但 BigQuery 結構定義中沒有,即使將該欄位新增至 BigQuery 結構定義,寫入 BigQuery 資料表的訊息可能仍不包含該欄位。最終,結構定義會同步處理,後續訊息也會包含該欄位。
為 BigQuery 訂閱項目使用「使用主題結構定義」選項時,您也可以運用 BigQuery 變更資料擷取 (CDC) 功能。CDC 會處理現有資料列的變更並套用,藉此更新 BigQuery 資料表。
如要進一步瞭解這項功能,請參閱「使用變更資料擷取功能串流傳輸資料表更新」。
如要瞭解如何搭配 BigQuery 訂閱項目使用這項功能,請參閱「BigQuery 變更資料擷取」。
使用資料表結構定義
這個選項可讓 Pub/Sub 使用 BigQuery 資料表的結構定義,將 JSON 訊息的欄位寫入對應的資料欄。使用這個選項時,請記得檢查下列額外需求:
- BigQuery 資料表中的每個資料欄名稱只能包含英文字母 (a-z、A-Z)、數字 (0-9) 或底線 (_)。 
- 發布的訊息必須採用 JSON 格式。 - 如果 BigQuery 資料表欄的資料類型為 - JSON,Pub/Sub 訊息中的對應欄位必須是有效的 JSON,且採用逸出字串。舉例來說,如果資料欄名稱為- myData,訊息欄位就必須是- "myData": "{\"key\":\"value\"}"。如果訊息不含有效的 JSON,BigQuery 會拒絕接收。
- 系統支援下列 JSON 轉換: - JSON 類型 - BigQuery 資料類型 - string- NUMERIC、- BIGNUMERIC、- DATE、- TIME、- DATETIME或- TIMESTAMP- number- NUMERIC、- BIGNUMERIC、- DATE、- TIME、- DATETIME或- TIMESTAMP- 使用 number至DATE、DATETIME、TIME或TIMESTAMP轉換時,數字必須符合支援的表示法。
- 使用 number到NUMERIC或BIGNUMERIC轉換時,值的精確度和範圍會受限於 IEEE 754 浮點運算標準接受的範圍。如需高精確度或更廣泛的值範圍,請改用string轉換為NUMERIC或BIGNUMERIC。
- 使用 string轉換為NUMERIC或BIGNUMERIC時,Pub/Sub 會假設字串是使用者可解讀的數字 (例如"123.124")。如果處理字串時發生錯誤,Pub/Sub 會將字串視為以 BigDecimalByteStringEncoder 編碼的位元組。
 
- 使用 
- 如果訂閱項目的主題有相關聯的結構定義,則訊息編碼屬性必須設為 - JSON。
- 如果訊息中沒有 BigQuery 欄位,這些 BigQuery 欄位就必須處於 - NULLABLE模式。
- 如果訊息含有 BigQuery 結構定義中沒有的額外欄位,且這些欄位可以捨棄,請選取「捨棄不明欄位」選項。 
- 您只能選取其中一個訂閱屬性:「使用主題結構定義」或「使用資料表結構定義」。 
如未選取「使用主題結構定義」或「使用資料表結構定義」選項,請確認 BigQuery 資料表有名為「data」的資料欄,且類型為 BYTES、STRING 或 JSON。dataPub/Sub 會將訊息寫入這個 BigQuery 資料欄。
您可能不會立即看到寫入 BigQuery 資料表的訊息生效,舉例來說,如果啟用「捨棄不明欄位」選項,且訊息中存在某個欄位,但 BigQuery 結構定義中沒有該欄位,即使將該欄位新增至 BigQuery 結構定義,寫入 BigQuery 資料表的訊息可能仍不包含該欄位。最終,結構定義會同步處理,後續訊息也會包含該欄位。
為 BigQuery 訂閱項目使用「使用資料表結構定義」選項時,您也可以運用 BigQuery 變更資料擷取 (CDC) 功能。CDC 會處理現有資料列的變更並套用,藉此更新 BigQuery 資料表。
如要進一步瞭解這項功能,請參閱「使用變更資料擷取功能串流傳輸資料表更新」。
如要瞭解如何搭配 BigQuery 訂閱項目使用這項功能,請參閱「BigQuery 變更資料擷取」。
捨棄不明欄位
這個選項會搭配「使用主題結構定義」或「使用資料表結構定義」選項使用。啟用這個選項後,Pub/Sub 會捨棄主題結構定義或訊息中現有但不在 BigQuery 結構定義中的任何欄位。將訊息寫入 BigQuery 資料表時,系統會捨棄不屬於 BigQuery 結構定義的欄位。
如果未設定「捨棄不明欄位」,系統不會將含有額外欄位的訊息寫入 BigQuery,並會將該則訊息保留在訂閱項目的待處理工作中,除非您設定無效信件主題。
「捨棄不明欄位」設定不會影響 Pub/Sub 主題結構定義或 BigQuery 資料表結構定義中未定義的欄位。在這種情況下,系統會將有效的 Pub/Sub 訊息傳送至訂閱項目。不過,由於 BigQuery 沒有為這些額外欄位定義資料欄,因此在 BigQuery 寫入程序中,這些欄位會遭到捨棄。如要避免這種情況,請確保 Pub/Sub 訊息中包含的所有欄位,也包含在 BigQuery 資料表結構定義中。
額外欄位的行為也可能取決於使用的特定結構定義類型 (Avro、通訊協定緩衝區) 和編碼 (JSON、二進位)。如要瞭解這些因素如何影響額外欄位的處理方式,請參閱特定架構類型和編碼的說明文件。
寫入中繼資料
這個選項可讓 Pub/Sub 將每則訊息的中繼資料寫入 BigQuery 資料表中的其他資料欄。如未啟用,中繼資料就不會寫入 BigQuery 資料表。
如果選取「寫入中繼資料」選項,請確認 BigQuery 資料表是否包含下表所述的欄位。
如未選取「寫入中繼資料」選項,目的地 BigQuery 資料表就只需要 data 欄位,除非 use_topic_schema 為 true。如果同時選取「寫入中繼資料」和「使用主題結構定義」選項,主題的結構定義就不得包含任何名稱與中繼資料參數名稱相符的欄位。這項限制包括這些蛇形命名法參數的駝峰式大小寫版本。
| 參數 | |
|---|---|
| subscription_name | STRING 訂閱方案名稱。 | 
| message_id | STRING 訊息 ID | 
| publish_time | TIMESTAMP 發布訊息的時間。 | 
| data | BYTES、STRING 或 JSON 訊息內文。 如果目的地 BigQuery 資料表未選取「使用主題結構定義」或「使用資料表結構定義」,就必須提供  | 
| attributes | STRING 或 JSON 內含所有訊息屬性的 JSON 物件。當中也包含 Pub/Sub 訊息的其他欄位,包括排序鍵 (如有)。 | 
建立 BigQuery 訂閱項目
下列範例說明如何建立訂閱項目並透過 BigQuery 傳送資料。
主控台
- 前往 Google Cloud 控制台的「Subscriptions」(訂閱項目) 頁面。 
- 按一下「Create Subscription」 (建立訂閱項目)。 
- 在「Subscription ID」(訂閱項目 ID) 欄位中輸入名稱。 如要瞭解如何命名訂閱項目,請參閱「主題或訂閱項目命名規範」。 
- 從下拉式選單中選擇或建立主題。訂閱項目會接收來自主題的訊息。 
- 選取「Delivery type」(傳送類型),然後選取「Write to BigQuery」(寫入 BigQuery)。 
- 選取 BigQuery 資料表的專案。 
- 選取現有資料集或建立新資料集。 如要瞭解如何建立資料集,請參閱建立資料集。 
- 選取現有表格或建立新表格。 如要瞭解如何建立資料表,請參閱「建立資料表」。 
- 強烈建議您啟用「Dead lettering」來處理訊息傳送失敗的問題。詳情請參閱「無法傳送訊息的主題」。 
- 點選「建立」。 
你也可以在「主題」頁面建立訂閱項目。 這個捷徑可將主題與訂閱項目建立關聯。
gcloud
監控 BigQuery 訂閱項目
Cloud Monitoring 提供多項指標,可監控訂閱項目。
如要查看所有可用的 Pub/Sub 相關指標及其說明,請參閱 Pub/Sub 的監控說明文件。
您也可以在 Pub/Sub 中監控訂閱項目。
後續步驟
- 使用 gcloud指令建立或修改訂閱項目。
- 使用 REST API 建立或修改訂閱項目。
- 排解 BigQuery 訂閱項目問題。