使用 受控識別 (Managed Identity) 是最穩健的做法,因為它不需要處理密碼過期的問題。
以下是為你準備的 Azure CLI 快速設定指令,你可以直接在 Azure Cloud Shell 或本地終端機執行:
步驟 1:為 App Service 啟用系統指派識別
這會讓你的 App Service 在 Azure Active Directory 中擁有一個身分。
Bash
# 替換成你的資源群組與 App 名稱
az webapp identity assign --name you-app-name --resource-group <你的資源群組名稱>
執行後,你會得到一個 principalId,這就是該 App 的身分 ID。
另一個 power shell 範例:
$RESOURCE_GROUP = "your-policy-group-name"
$WEB_APP_NAME = "your-app-name"
az webapp identity assign --name $WEB_APP_NAME --resource-group $RESOURCE_GROUP
步驟 2:授權 App Service 讀取 ACR (AcrPull)
這步是解決 Unauthorized 錯誤的關鍵。
Bash
# 1. 取得 ACR 的 Resource ID
ACR_ID=$(az acr show --name youappacr1 --query id --output tsv)
# 2. 取得 App Service 的 Principal ID
APP_SERVICE_ID=$(az webapp identity show --name you-app-name --resource-group <你的資源群組名稱> --query principalId --output tsv)
# 3. 賦予 AcrPull 權限
az role assignment create --assignee $APP_SERVICE_ID --scope $ACR_ID --role acrpull
改用 power shell:
# 1. 取得 ACR 的 Resource ID
$ACR_ID = az acr show --name $ACR_NAME --query id --output tsv
# 2. 取得 App Service 的 Principal ID (身分識別 ID)
$APP_SERVICE_ID = az webapp identity show --name $WEB_APP_NAME --resource-group $RESOURCE_GROUP --query principalId --output tsv
# 3. 指派 AcrPull 角色給 App Service
az role assignment create --assignee $APP_SERVICE_ID --scope $ACR_ID --role acrpull
步驟 3:通知 App Service 使用受控識別抓取影像
即使有了權限,App Service 預設可能還在找舊的帳號密碼,我們需要切換它的拉取方式:
Bash
az webapp config container set --name you-app-name --resource-group <你的資源群組名稱> \
--docker-custom-image-name youappacr1 .azurecr.io/policy-app:v1 \
--docker-registry-server-url https://youappacr1.azurecr.io
告訴 App Service 不要再找密碼了,直接用剛才設定的身分去抓。
PowerShell
az webapp config container set --name $WEB_APP_NAME --resource-group $RESOURCE_GROUP `
--docker-custom-image-name "$ACR_NAME.azurecr.io/policy-app:v1" `
--docker-registry-server-url "https://$ACR_NAME.azurecr.io"
(註:PowerShell 的換行符號是 `)
上面指令, 回傳結果:
No credential was provided to access Azure Container Registry. Trying to look up...
Retrieving credentials failed with an exception:'Failed to retrieve container registry credentials. Please either provide the credentials or run 'az acr update -n policyrecommendacr1 --admin-enabled true' to enable admin first.'
看來 Azure CLI 在執行 az webapp config container set 時,預設行為是會去檢查 ACR 的 Admin User (管理使用者) 是否開啟。因為你目前可能還沒開啟 Admin User,所以它噴出了 Retrieving credentials failed 的錯誤。
別擔心,即便它噴出 Retrieving credentials failed 警告也沒關係,因為它還是會把設定寫進去,只是警告它目前抓不到密碼。
強制開啟「受控識別」拉取開關
這一步非常重要,它會直接修改 App Service 的底層配置,告訴它「不准找密碼,直接用 Managed Identity」:
PowerShell
az webapp config set --name $WEB_APP_NAME --resource-group $RESOURCE_GROUP `
--generic-configurations '{\"acrUseManagedIdentityCreds\": true}'
如何確認設定成功?
執行完畢後,請務必執行此指令確認屬性值:
PowerShell
az webapp config show --name $WEB_APP_NAME --resource-group $RESOURCE_GROUP --query "acrUseManagedIdentityCreds"
如果回傳 true,代表開關已經成功打開。
最後檢查
執行完後,請等待約 30 秒,然後重啟 Web App:
PowerShell
az webapp restart --name $WEB_APP_NAME --resource-group $RESOURCE_GROUP
下一步建議:
重啟後,請再次觀察 Log Stream。如果還是看到 ImagePullUnauthorizedFailure,請跟我說,我們檢查一下 RBAC 權限指派是否真的有成功寫入。
如果有看到 Container started successfully,那就代表我們成功越過權限大山了!需要我幫你看看怎麼設定「自動部署 (Webhook)」嗎?(這樣你以後 docker push 到 ACR,網頁就會自動更新)
驗證與重啟
完成上述設定後,請執行以下操作:
- 前往 Azure Portal 的 App Service > Deployment Center。
- 確認 Authentication 已顯示為 Managed Identity。
- 點擊頁面上方的 Save,然後到 Overview 點擊 Restart。
常見小提醒:
- 傳輸延遲:角色指派(RBAC)有時需要 1-2 分鐘才會生效,如果重啟後立刻失敗,請稍等片刻再試一次。
- 影像標籤:確認你的 ACR 中真的有一個名為
you-app-name且標籤為v1的影像。
設定完後,你想進一步確認如何查看重啟後的容器內部日誌嗎?