排解 IAM 驗證問題

如要診斷及解決 AlloyDB for PostgreSQL 的身分與存取權管理 (IAM) 驗證登入失敗問題,您可以在 Logs Explorer 中檢查驗證警告記錄。

如要判斷 IAM 驗證失敗的原因,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Logs Explorer」頁面:

    前往 Logs Explorer

  2. 在「All resources」(所有資源) 下拉式選單中,選取「AlloyDB Instance」(AlloyDB 執行個體)。

  3. 在「嚴重性」下方,按一下「警告」。

    如果沒有「快訊」選項,表示所選時間範圍內沒有驗證失敗記錄。您可能需要使用 Logs Explorer 控制項調整視窗。

  4. 在「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 權杖中完整、未截斷的主體與截斷的資料庫角色進行比較,導致字串不相符。

    解決方法:使用服務帳戶模擬功能

    如果無法縮短服務帳戶名稱,可以透過服務帳戶模擬來規避這項限制。這樣一來,執行工作負載的身分與登入資料庫的身分就會分開:

    1. 建立 Proxy 服務帳戶,名稱的縮短主體 (不含 .gserviceaccount.com 尾碼) 不得超過 63 個字元,例如 db-proxy@PROJECT_ID.iam.gserviceaccount.com。
    2. 將 Proxy 服務帳戶新增至 AlloyDB 叢集,做為 IAM_BASED 資料庫使用者,使用者名稱為 db-proxy@PROJECT_ID.iam。
    3. 在 IAM 中,將 Proxy 服務帳戶的服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator) 授予工作負載的原始服務帳戶。
    4. 設定應用程式、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 服務帳戶具備資料庫權限。

    Request had insufficient scopes.
    存取權杖不含 alloydb.login 範圍或 cloud-platform 範圍。至少須提供其中一個範圍。