瞭解實用的疑難排解步驟,解決您在使用 Pub/Sub 時遇到的問題。
無法建立主題
確認您具備必要的權限。如要建立 Pub/Sub 主題,您需要專案的 Pub/Sub 編輯者 (roles/pubsub.editor
) 身分與存取權管理角色。如果沒有這個角色,請與管理員聯絡。
如要進一步瞭解如何排解主題相關問題,請參閱下列頁面:
無法建立訂閱
請確認您已完成下列事項:
確認您具備必要的權限。如要建立 Pub/Sub 訂閱項目,您必須在專案中具備 Pub/Sub 編輯者 (roles/pubsub.editor) IAM 角色。如果沒有這個角色,請與管理員聯絡。
指定訂閱名稱。
指定要附加訂閱項目的現有主題名稱。
建立推送訂閱時,在
pushEndpoint
欄位中,以小寫 (而非http://
或HTTPS://
) 將https://
指定為接收 URL 的通訊協定。
如需訂閱項目的疑難排解資訊,請參閱下列頁面:
排解 pull、 push、 BigQuery、 或 Cloud Storage 的問題
排解權限問題
Pub/Sub 權限可控管哪些使用者和服務帳戶可以對 Pub/Sub 資源執行動作。如果權限設定錯誤,可能會導致權限遭拒錯誤,並中斷郵件流程。稽核記錄會詳細記錄所有權限變更,方便您找出問題來源。
如要使用稽核記錄排解 Pub/Sub 權限問題,請按照下列步驟操作:
取得查看記錄檔探索工具的必要權限。
詳情請參閱「事前準備」一文。
前往 Trusted Cloud 控制台的「Logs Explorer」頁面。
選取現有的 Trusted Cloud 專案、資料夾或組織。
以下列出可用來尋找相關記錄的篩選器:
resource.type="pubsub_topic" OR resource.type="pubsub_subscription"
:如果問題可能涉及主題或訂閱設定變更,或是存取權控管,請使用這項查詢做為疑難排解的起點。你也可以搭配其他篩選器,進一步修正搜尋結果。protoPayload.methodName="google.iam.v1.SetIamPolicy"
:懷疑問題是由於權限不正確或遺漏時,請使用這項查詢。這項功能可協助您追蹤身分與存取權管理政策的變更者和變更內容。這有助於排解問題,例如使用者無法發布至主題或訂閱項目、應用程式遭拒存取 Pub/Sub 資源,或是存取權控管發生非預期變更。protoPayload.status.code=7
:如果遇到與權限明確相關的錯誤,請使用這項查詢。這有助於找出失敗的動作和嘗試執行這些動作的使用者。您可以將這項查詢與先前的查詢合併,找出可能導致權限遭拒的特定資源和 IAM 政策變更。
分析記錄,判斷事件的時間戳記、進行變更的主體,以及變更類型等因素。
您可以根據稽核記錄收集到的資訊採取修正措施。
排解 Terraform 權限問題
搭配 Terraform 使用 Pub/Sub 時,請在 Terraform 程式碼中明確授予必要角色。舉例來說,如要發布應用程式,應用程式的服務帳戶必須具備 roles/pubsub.publisher
角色。如果 Terraform 程式碼未明確定義這個角色,日後的 terraform apply
可能會移除該角色。這通常發生在不相關的更新期間,導致可靠的應用程式突然發生 PERMISSION_DENIED
錯誤。在程式碼中明確定義角色,即可避免發生這類意外回歸。
訂閱項目已刪除
刪除 Pub/Sub 訂閱項目主要有兩種方式:
具備足夠權限的使用者或服務帳戶刻意刪除訂閱項目。
訂閱項目會在閒置一段時間後自動刪除,預設為 31 天。如要進一步瞭解訂閱方案到期政策,請參閱「到期期限」一文。
如要排解已刪除的訂閱方案問題,請按照下列步驟操作:
前往 Trusted Cloud 控制台的 Pub/Sub 訂閱項目頁面,確認訂閱項目已不再列出。如要進一步瞭解如何列出訂閱項目,請參閱「列出訂閱項目」。
檢查稽核記錄。前往「記錄檔探索工具」。 使用篩選器
protoPayload.methodName="google.pubsub.v1.Subscriber.DeleteSubscription"
找出已刪除的訂閱項目。檢查記錄,判斷是否有人刪除訂閱項目,或訂閱項目是否因閒置而遭刪除。InternalExpireInactiveSubscription
表示訂閱項目因閒置而遭刪除。如要進一步瞭解如何使用稽核記錄排解問題,請參閱使用稽核記錄排解 Pub/Sub 問題。
403 (Forbidden)
個錯誤
403 錯誤通常表示您沒有執行動作的適當權限。舉例來說,嘗試發布至主題或從訂閱項目提取內容時,可能會收到 403 User not authorized
錯誤訊息。
如果您是這類錯誤,請執行下列步驟:
- 請確認您已在Trusted Cloud 控制台中啟用 Pub/Sub API。
確定提出要求的主體在相關 Pub/Sub API 資源上具有所需權限,特別是您針對跨專案通訊使用 Pub/Sub API 時。
如果您使用 Dataflow,請確認
{PROJECT_NUMBER}@cloudservices.s3ns-system.iam.gserviceaccount.com
和 Compute Engine 服務帳戶{PROJECT_NUMBER}-compute@developer.s3ns-system.iam.gserviceaccount.com
均具備相關 Pub/Sub API 資源的必要權限。詳情請參閱「Dataflow 安全與權限」。如果您使用 App Engine,請檢查專案的「權限」頁面,確認 App Engine 服務帳戶是否列為 Pub/Sub 編輯者。如果不是,請將 App Engine 服務帳戶新增為 Pub/Sub 編輯者。通常,App Engine 服務帳戶的格式為
<project-id>@appspot.s3ns-system.iam.gserviceaccount.com
。您可以使用稽核記錄排解權限問題。
其他常見錯誤代碼
如要查看其他常見的 Pub/Sub API 相關錯誤代碼及其說明,請參閱「錯誤代碼」。
使用過度管理作業
如果您發現自己使用太多管理作業配額,就可能需要重構程式碼。您可考慮使用此虛擬程式碼/虛擬碼作為實例。在本範例中,管理作業 (GET
) 用於先檢查訂閱是否存在,然後再嘗試使用其資源。GET
和 CREATE
都是管理員作業:
if !GetSubscription my-sub {
CreateSubscription my-sub
}
Consume from subscription my-sub
更有效率的模式是嘗試由訂閱項目使用訊息 (假設您能夠合理確定訂閱項目名稱)。在這種樂觀的方法中,您只會在發生錯誤時取得或建立訂閱。請參閱以下範例:
try {
Consume from subscription my-sub
} catch NotFoundError {
CreateSubscription my-sub
Consume from subscription my-sub
}
您可以使用下列程式碼範例,以所選語言實作這個模式:
Go
以下範例使用 Go Pub/Sub 用戶端程式庫的主要版本 (v2)。如果您仍在使用第 1 版程式庫,請參閱第 2 版遷移指南。如要查看第 1 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Go 設定說明進行操作。詳情請參閱 Pub/Sub Go API 參考說明文件。
Java
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Java 設定操作說明進行操作。詳情請參閱 Pub/Sub Java API 參考說明文件。
Node.js
在嘗試這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Node.js 設定說明進行操作。詳情請參閱 Pub/Sub Node.js API 參考說明文件。
Node.ts
在嘗試這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Node.js 設定說明進行操作。詳情請參閱 Pub/Sub Node.js API 參考說明文件。
Python
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Python 設定操作說明來進行。詳情請參閱 Pub/Sub Python API 參考說明文件。
C++
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 C++ 設定操作說明進行操作。詳情請參閱 Pub/Sub C++ API 參考說明文件。