如要診斷及解決 AlloyDB for PostgreSQL 的身分與存取權管理 (IAM) 驗證登入失敗問題,您可以在 Logs Explorer 中檢查驗證警告記錄。
如要判斷 IAM 驗證失敗的原因,請按照下列步驟操作:
前往 Google Cloud 控制台的「Logs Explorer」頁面:
在「All resources」(所有資源) 下拉式選單中,選取「AlloyDB Instance」(AlloyDB 執行個體)。
在「嚴重性」下方,按一下「警告」。
如果沒有「快訊」選項,表示所選時間範圍內沒有驗證失敗記錄。您可能需要使用 Logs Explorer 控制項調整視窗。
在「Query results」(查詢結果) 下方,查看記錄項目是否有下列其中一則訊息:
Request had invalid authentication credentials.- 存取權杖無效。
Caller does not have required permission to use project.- IAM 主體不具備必要的 IAM 角色或權限。完整錯誤訊息會指出缺少的角色或權限。
IAM principal does not match database user.存取權杖指定的已驗證 IAM 主體,與您要連線的資料庫使用者不符。
如要查看權杖指定的主體,請執行下列指令:
curl -H "Content-Type: application/x-www-form-urlencoded" \ -d "access_token=ACCESS_TOKEN" \ https://www.googleapis.com/oauth2/v1/tokeninfo將
ACCESS_TOKEN替換為 OAuth 2.0 存取權杖。如果服務帳戶的縮短主體 (不含
.gserviceaccount.com尾碼的電子郵件地址) 超過 63 個字元,也會發生這項錯誤。PostgreSQL 的角色和使用者 ID 長度上限為 63 個字元。雖然 AlloyDB 允許您建立使用者,但 PostgreSQL 會在內部目錄中將角色名稱截斷為 63 個位元組。登入時,AlloyDB 的 IAM 驗證層會將 OAuth 權杖中完整、未截斷的主體與截斷的資料庫角色進行比較,導致字串不相符。
解決方法:使用服務帳戶模擬功能
如果無法縮短服務帳戶名稱,可以透過服務帳戶模擬來規避這項限制。這樣一來,執行工作負載的身分與登入資料庫的身分就會分開:
- 建立 Proxy 服務帳戶,名稱的縮短主體 (不含
.gserviceaccount.com尾碼) 不得超過 63 個字元,例如db-proxy@PROJECT_ID.iam.gserviceaccount.com。 - 將 Proxy 服務帳戶新增至 AlloyDB 叢集,做為
IAM_BASED資料庫使用者,使用者名稱為db-proxy@PROJECT_ID.iam。 - 在 IAM 中,將 Proxy 服務帳戶的服務帳戶權杖建立者角色 (
roles/iam.serviceAccountTokenCreator) 授予工作負載的原始服務帳戶。 - 設定應用程式、AlloyDB 語言連接器或 AlloyDB Auth Proxy,使用 Proxy 身分連線。
舉例來說,您可以使用
gcloud beta alloydb connect指令搭配--impersonate-service-account旗標進行連線:gcloud beta alloydb connect INSTANCE_ID \ --cluster=CLUSTER_ID \ --region=REGION_ID \ --impersonate-service-account=PROXY_SERVICE_ACCOUNT_EMAIL \ --auto-iam-authn更改下列內容:
INSTANCE_ID:AlloyDB 執行個體的 ID。CLUSTER_ID:執行個體所在叢集的 ID。REGION_ID:叢集所在的區域。PROXY_SERVICE_ACCOUNT_EMAIL:Proxy 服務帳戶的完整電子郵件地址。
注意:原始服務帳戶不需要直接登入資料庫,只要有權限模擬 Proxy 帳戶即可。Proxy 服務帳戶具備資料庫權限。
- 建立 Proxy 服務帳戶,名稱的縮短主體 (不含
Request had insufficient scopes.- 存取權杖不含
alloydb.login範圍或cloud-platform範圍。至少須提供其中一個範圍。