
這個錯誤 ACRTokenRetrievalFailure 代表你的 Azure 資源(例如 App Service、AKS 或 Container App)雖然嘗試使用受控識別 (Managed Identity) 來登入,但被 Azure Container Registry (ACR) 拒絕了(401 Unauthorized)。
簡單來說:你的服務雖然有身份證,但這張卡片沒有進入倉庫搬貨的權限。
以下是解決此問題的排查與修復步驟:
1. 檢查角色指派 (RBAC) —— 最常見的原因
你必須確保該受控識別在 ACR 層級擁有 AcrPull 權限。
- 操作流程:
- 登入 Azure Portal,進入你的 Container Registry (ACR)。
- 點選左側選單的 存取控制 (IAM) -> 角色指派 (Role assignments)。
- 確認列表中是否有你的受控識別(系統指派或使用者指派),且角色為 AcrPull。
- 若無,點選 新增 (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)了解更詳細的設定?