使用 受控識別 (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
驗證與重啟
完成上述設定後,請執行以下操作:
- 前往 Azure Portal 的 App Service > Deployment Center。
- 確認 Authentication 已顯示為 Managed Identity。
- 點擊頁面上方的 Save,然後到 Overview 點擊 Restart。
常見小提醒:
- 傳輸延遲:角色指派(RBAC)有時需要 1-2 分鐘才會生效,如果重啟後立刻失敗,請稍等片刻再試一次。
- 影像標籤:確認你的 ACR 中真的有一個名為
you-app-name且標籤為v1的影像。
設定完後,你想進一步確認如何查看重啟後的容器內部日誌嗎?