ACRTokenRetrievalFailure: Could not resolve the ACR token with the specified managed identity due to the following: Fetching Acr token failed — response status indicates failure. Status Code:Unauthorized

這個錯誤 ACRTokenRetrievalFailure 代表你的 Azure 資源(例如 App Service、AKS 或 Container App)雖然嘗試使用受控識別 (Managed Identity) 來登入,但被 Azure Container Registry (ACR) 拒絕了(401 Unauthorized)。

簡單來說:你的服務雖然有身份證,但這張卡片沒有進入倉庫搬貨的權限。

以下是解決此問題的排查與修復步驟:


1. 檢查角色指派 (RBAC) —— 最常見的原因

你必須確保該受控識別在 ACR 層級擁有 AcrPull 權限。

  • 操作流程:
    1. 登入 Azure Portal,進入你的 Container Registry (ACR)
    2. 點選左側選單的 存取控制 (IAM) -> 角色指派 (Role assignments)
    3. 確認列表中是否有你的受控識別(系統指派或使用者指派),且角色為 AcrPull
    4. 若無,點選 新增 (Add) -> 新增角色指派,選擇 AcrPull 並將其分配給對應的受控識別。

2. App Service 專屬設定

如果你使用的是 Azure App Service,除了 IAM 權限外,還需要確認環境變數是否正確開啟了受控識別功能:

  • 檢查「環境變數 (Environment variables)」:
    • DOCKER_REGISTRY_SERVER_URL: 應為 https://<你的名稱>.azurecr.io
    • acrUseManagedIdentityCreds: 必須設為 true
    • acrUserManagedIdentityID: 若你使用「使用者指派」識別,此處必須填入該識別的 Client ID

3. AKS (Kubernetes) 快速修復

如果你是在 AKS 部署時遇到此錯誤,通常是因為 Kubelet 身份沒有權限。最快的方法是透過 CLI 重新綁定:

Bash

az aks update -n <AKS叢集名稱> -g <資源群組名稱> --attach-acr <ACR名稱>

這條命令會自動幫你完成背後的 IAM 角色設定。


4. 常見陷阱與提示

  • 同步延遲: IAM 角色指派後,通常需要 5 到 15 分鐘 才會在全球 Entra ID 中生效。
  • 重啟服務: 權限設好後,建議重啟 (Restart) 你的應用程式(如 App Service),以強制它重新獲取最新的 Token。
  • 網路限制: 如果 ACR 開啟了防火牆(防火牆和虛擬網路),即使權限正確,連線也可能被擋下。請確認受控識別所在的資源是否在允許的存取清單中。

你需要我幫你檢查具體的 Azure CLI 指令,還是想針對特定的服務(如 Container Apps)了解更詳細的設定?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *