Azure 如何設定 Managed Identity 的具體 CLI 指令

使用 受控識別 (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,網頁就會自動更新)


驗證與重啟

完成上述設定後,請執行以下操作:

  1. 前往 Azure Portal 的 App Service > Deployment Center
  2. 確認 Authentication 已顯示為 Managed Identity
  3. 點擊頁面上方的 Save,然後到 Overview 點擊 Restart

常見小提醒:

  • 傳輸延遲:角色指派(RBAC)有時需要 1-2 分鐘才會生效,如果重啟後立刻失敗,請稍等片刻再試一次。
  • 影像標籤:確認你的 ACR 中真的有一個名為 you-app-name 且標籤為 v1 的影像。

設定完後,你想進一步確認如何查看重啟後的容器內部日誌嗎?

發佈留言

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