共用方式為


使用受控識別提取 Azure 容器應用程式映像

您可以從 Microsoft Azure Container Registry 的私人存放庫提取映像,並使用受控識別進行驗證,而不使用系統管理認證。

您可以使用系統指派或使用者指派的受控識別,向 Azure Container Registry 進行驗證。

  • 若選擇使用者指派的受控識別,您會在 Azure 容器應用程式之外建立和管理身分識別。 身分識別可以指派給多個 Azure 資源,包括 Azure 容器應用程式。
  • 若使用系統指派的受控識別,將會由 Azure 容器應用程式建立及管理身分識別。 它會繫結至您的容器應用程式,並在刪除應用程式時跟著刪除。
  • 可能的話,您應該使用「使用者指派的受控識別」來提取映像。

每當啟動容器時,容器應用程式便會檢查新版本的映像。 在 Docker 或 Kubernetes 術語中,容器應用程式會將每個容器的映像提取原則設定為 always

本文說明如何在 Azure 入口網站中,透過使用者指派和系統指派的受控識別設定容器應用程式,以從私人 Azure Container Registry 存放庫提取映像。

使用者指派的受控識別

下列步驟說明如何將容器應用程式設定透過使用者指派的受控識別,提取私人 Azure Container Registry 存放庫的映像。

  1. 使用公用映像建立容器應用程式。
  2. 將使用者指派的受控識別新增至容器應用程式。
  3. 使用私人映像和使用者指派的受控識別建立容器應用程式修訂。

必要條件

  • 具有有效訂用帳戶的 Azure 帳戶。

  • 私人 Azure Container Registry,其中包含您要提取的映像。

  • 您的 Azure Container Registry 必須允許 ARM 對象權杖進行驗證,才能使用受控識別來提取映像。 使用下列命令來檢查是否允許 ARM 權杖存取您的 ACR:

    az acr config authentication-as-arm show -r <REGISTRY>
    

    如果不允許 ARM 權杖,您可以使用下列命令來允許這些權杖:

    az acr config authentication-as-arm update -r <REGISTRY> --status enabled
    
  • 建立使用者指派的受控識別。 如需詳細資訊,請參閱建立使用者指派的受控識別

建立容器應用程式

遵循下列步驟,使用預設快速入門映像建立容器應用程式。

  1. 瀏覽至入口網站首頁

  2. 在頂端搜尋列中搜尋容器應用程式

  3. 在搜尋結果中選取容器應用程式

  4. 選取建立按鈕。

  5. 在 [基本] 索引標籤中,執行下列動作。

    設定 動作
    訂用帳戶 選取 Azure 訂閱。
    資源群組 選取現有的資源群組或建立新群組。
    容器應用程式名稱 輸入容器應用程式名稱。
    地點 選取位置。
    建立容器應用程式環境 新建或選取現有的環境。
  6. 選取 [建立容器應用程式] 頁面底部的 [檢閱與建立] 按鈕。

  7. 選取 [建立容器應用程式] 視窗底部的 [建立] 按鈕。

請稍候幾分鐘以等待部署完成。 當部署完成時,請選取 [前往資源]

新增使用者指派的受控識別

  1. 從左側功能表中選取 [身分識別]
  2. 選取 [使用者指派] 索引標籤。
  3. 選取 [新增使用者指派的受控識別] 按鈕。
  4. 選取您的訂用帳戶。
  5. 選取您建立的身分識別。
  6. 選取 [新增]。

建立容器應用程式修訂

使用私人映像和系統指派的受控識別建立容器應用程式修訂。

  1. 從左側功能表中選取 [修訂管理]

  2. 選取 [建立新修訂]

  3. 從 [容器映像] 資料表中選取容器映像。

  4. 在 [編輯容器] 對話方塊中輸入資訊。

    欄位 動作
    名稱 輸入容器的名稱。
    影像來源 選取 [Azure Container Registry]
    驗證 選取 [受控識別]。
    身分識別 從下拉式功能表中選取您建立的身分識別。
    登錄 從下拉式功能表中選取您想要使用的登錄。
    映像 輸入要使用的映像名稱。
    映像標籤 輸入您要提取映像的名稱和標籤。

    [編輯容器] 對話方塊的螢幕擷取畫面,其中顯示正在輸入使用者指派的受控識別。

    注意

    如果您的 Azure Container Registry 登錄上未啟用系統管理認證,您會看到顯示警告訊息,而且必須手動輸入映像名稱和標籤資訊。

  5. 選取 [儲存]。

  6. 在 [建立並部署新修訂版本] 頁面中選取 [建立]

隨即會建立並部署新的修訂版本。 入口網站會自動嘗試將 acrpull 角色新增至使用者指派的受控識別。 如果角色未新增,您可以手動新增。

您可以從容器應用程式頁面的 [身分識別] 窗格檢查身分識別,以確認角色已新增。

  1. 從左側功能表中選取 [身分識別]
  2. 選取 [使用者指派] 索引標籤。
  3. 選取使用者指派的受控識別。
  4. 在受控識別資源頁面上的功能表中,選取 [Azure 角色指派]
  5. 確認 acrpull 角色已指派給使用者指派的受控識別。

使用私人映像建立容器應用程式

如果您不打算透過使用公開映像建立容器應用程式啟動,則也可執行下列步驟。

  1. 建立使用者指派的受控識別。
  2. acrpull 角色新增至使用者指派的受控識別。
  3. 使用私人映像和系統指派的受控識別建立容器應用程式。

這個方法在基礎結構即程式碼 (IaC) 是常見案例。

清除資源

如果您不打算繼續使用此應用程式,可以移除資源群組來刪除 Azure 容器應用程式執行個體和所有相關聯的服務。

警告

若刪除資源群組,將一併刪除群組中的所有資源。 如果您的群組中有其他資源,則這些資源也會遭到刪除。 如果您想要保留這些資源,可以刪除容器應用程式執行個體,以及容器應用程式環境。

  1. 從 [概觀] 區段中選取您的資源群組。
  2. 選取資源群組 [概觀] 頂端的 [刪除資源群組] 按鈕。
  3. 在確認對話方塊中輸入資源群組名稱。
  4. 選取 [刪除]。 刪除資源群組的流程可能需要幾分鐘的時間才能完成。

系統指派的受控識別

若要在 Azure 入口網站中設定系統指派的受控識別,其方法與設定使用者指派的受控識別相同。 唯一的差異在於,您不需要建立使用者指派的受控識別。 作為替代,當您建立容器應用程式時,將會建立系統指派的受控識別。

若要在 Azure 入口網站中設定系統指派的受控識別,方法如下:

  1. 使用公用映像建立容器應用程式。
  2. 使用私人映像和系統指派的受控識別建立容器應用程式修訂。

必要條件

建立容器應用程式

遵循下列步驟,使用預設快速入門映像建立容器應用程式。

  1. 瀏覽至入口網站首頁

  2. 在頂端搜尋列中搜尋容器應用程式

  3. 在搜尋結果中選取容器應用程式

  4. 選取建立按鈕。

  5. 在 [基本] 索引標籤中,執行下列動作。

    設定 動作
    訂用帳戶 選取 Azure 訂閱。
    資源群組 選取現有的資源群組或建立新群組。
    容器應用程式名稱 輸入容器應用程式名稱。
    部署來源 將此設定保留為 [容器映射]。
    區域 選取區域。
    Container Apps 環境 選取現有的環境,或選取 [ 新建]。 如需詳細資訊,請參閱 Azure Container Apps 環境
  6. 選取 [下一步:容器 >]。

  7. 在 [容器] 索引標籤中,啟用 [使用快速入門映射]。快速入門映像 設定為 Simple hello world 容器

  8. 選取 [建立容器應用程式] 頁面底部的 [檢閱與建立] 按鈕。

  9. 選取 [建立容器應用程式] 頁面底部的 [建立] 按鈕。

請稍候幾分鐘以等待部署完成。 當部署完成時,請選取 [前往資源]

編輯和部署修訂版本

編輯容器以使用私人 Azure Container Registry 中的映像,並將驗證設定為使用系統指派的身分識別。

  1. 在 [ 應用程式] 中,選取 [ 容器]。

  2. 在 [ 容器] 頁面中,選取 [ 編輯和部署]。

  3. 從清單中選取 simple-hello-world-container 容器。

  4. 在 [ 編輯容器 ] 頁面中,執行下列動作。

    設定 動作
    名稱 輸入容器應用程式名稱。
    影像來源 選取 [Azure Container Registry]
    訂用帳戶 選取 Azure 訂閱。
    登錄 選取您的容器登錄。
    映像 輸入映像名稱。
    映像標籤 輸入影像標籤。
    驗證類型 選取 [受控身分識別]
    受控識別 選取 [系統指派]
  5. 選取頁面底部的「儲存」。

  6. 選取 [建立並部署新修訂版本] 頁面底部的 [建立]

  7. 幾分鐘後,選取 [修訂管理] 頁面上的 [重新整理],以查看新的修訂版本。

隨即會建立並部署新的修訂版本。 入口網站會自動嘗試將 acrpull 角色新增至系統指派的受控識別。 如果角色未新增,您可以手動新增。

您可以在容器應用程式頁面的 [身分識別] 窗格中檢查身分識別,以確認角色已新增。

  1. 從左側功能表中選取 [身分識別]
  2. 選取 [系統指派] 索引標籤。
  3. 選取 [Azure 角色指派]
  4. 確認 acrpull 角色已指派給系統指派的受控識別。

清除資源

如果您不打算繼續使用此應用程式,可以移除資源群組來刪除 Azure 容器應用程式執行個體和所有相關聯的服務。

警告

若刪除資源群組,將一併刪除群組中的所有資源。 如果您的群組中有其他資源,則這些資源也會遭到刪除。 如果您想要保留這些資源,可以刪除容器應用程式執行個體,以及容器應用程式環境。

  1. 從 [概觀] 區段中選取您的資源群組。
  2. 選取資源群組 [概觀] 頂端的 [刪除資源群組] 按鈕。
  3. 在確認對話方塊中輸入資源群組名稱。
  4. 選取 [刪除]。 刪除資源群組的流程可能需要幾分鐘的時間才能完成。

本文說明如何使用 Azure CLI 和 Azure PowerShell 設定容器應用程式,以使用受控識別從私人 Azure Container Registry 存放庫提取映像。

必要條件

必要條件 描述
Azure 帳戶 具有有效訂用帳戶的 Azure 帳戶。 如果您沒有,可以免費建立一個
Azure CLI 如果要使用 Azure CLI,請在本機電腦上安裝 Azure CLI
Azure PowerShell 如果要使用 PowerShell,請在本機電腦上安裝 Azure PowerShell。 執行命令 Install-Module -Name Az.App 以確定已安裝最新版本的 Az.App 模組。
Azure Container Registry 私人 Azure Container Registry,其中包含您要提取的映像。 快速入門:使用 Azure CLI 建立私人容器登錄快速入門:使用 Azure PowerShell 建立私人容器登錄

設定

若要從 CLI 登入 Azure,請執行下列命令,並遵循提示來完成驗證流程。

az login

若要確定您執行的是最新版本 CLI,請執行升級命令。

az upgrade

接下來,安裝或更新 CLI 的 Azure 容器應用程式延伸模組。

如果您在 Azure CLI 中執行 az containerapp 命令或 Azure PowerShell 模組中的 Cmdlet Az.App 時收到遺漏參數的錯誤,請確定您已安裝最新版的 Azure 容器應用程式延伸模組。

az extension add --name containerapp --upgrade

注意

從 2024 年 5 月開始,Azure CLI 延伸模組預設不會再啟用預覽功能。 若要存取容器應用程式預覽功能,請使用 --allow-preview true 安裝容器應用程式延伸模組。

az extension add --name containerapp --upgrade --allow-preview true

現在已安裝目前的延伸模組或模組,請註冊 Microsoft.AppMicrosoft.OperationalInsights 命名空間。

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

接下來,請設定下列環境變數。 請使用您的值取代以 <> 括住的預留位置。

RESOURCE_GROUP="<YOUR_RESOURCE_GROUP_NAME>"
LOCATION="<YOUR_LOCATION>"
CONTAINERAPPS_ENVIRONMENT="<YOUR_ENVIRONMENT_NAME>"
REGISTRY_NAME="<YOUR_REGISTRY_NAME>"
CONTAINERAPP_NAME="<YOUR_CONTAINERAPP_NAME>"
IMAGE_NAME="<YOUR_IMAGE_NAME>"

如果您已有資源群組,可跳過此步驟。 否則,請建立資源群組。

az group create \
  --name $RESOURCE_GROUP \
  --location $LOCATION

建立容器應用程式環境

如果環境不存在,請執行下列命令:

若要建立環境,請執行下列命令:

az containerapp env create \
  --name $CONTAINERAPPS_ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION

請繼續進行下一節以設定使用者指派的受控識別,或跳至系統指派的受控識別一節。

使用者指派的受控識別

遵循此流程以設定使用者指派的受控識別:

  1. 建立使用者指派的受控識別。
  2. 如果您使用 PowerShell,請將登錄的 acrpull 角色指派給受控識別。 Azure CLI 會自動進行此指派。
  3. 使用來自私人登錄,並透過使用者指派的受控識別進行驗證的映像建立容器應用程式。

建立使用者指派的受控識別

建立使用者指派的受控識別。 執行下列命令之前,請以受控識別的名稱取代 <預留位置>

IDENTITY="<YOUR_IDENTITY_NAME>"
az identity create \
  --name $IDENTITY \
  --resource-group $RESOURCE_GROUP

取得身分識別的資源標識碼。

IDENTITY_ID=$(az identity show \
  --name $IDENTITY \
  --resource-group $RESOURCE_GROUP \
  --query id \
  --output tsv)

建立容器應用程式

透過來自私人登錄、使用身分識別驗證的映像建立容器應用程式。

複製身分識別的資源識別碼,並貼到下列命令中的 <IDENTITY_ID> 預留位置。 如果您的映像標籤不是 latest,請將「latest」取代為您的標記。

echo $IDENTITY_ID
az containerapp create \
  --name $CONTAINERAPP_NAME \
  --resource-group $RESOURCE_GROUP \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --user-assigned <IDENTITY_ID> \
  --registry-identity <IDENTITY_ID> \
  --registry-server "${REGISTRY_NAME}.azurecr.io" \
  --image "${REGISTRY_NAME}.azurecr.io/${IMAGE_NAME}:latest"

清理

警告

下列命令會刪除指定的資源群組和其中包含的所有資源。 如果本快速入門範圍以外的資源存在於指定的資源群組中,則也會一併刪除。

az group delete --name $RESOURCE_GROUP

系統指派的受控識別

若要設定系統指派的身分識別,必須執行下列動作:

  1. 使用公用映像建立容器應用程式。
  2. 將系統指派的受控識別指派給容器應用程式。
  3. 使用私人映射更新容器應用程式。

建立容器應用程式

使用公用映像建立容器。

az containerapp create \
  --name $CONTAINERAPP_NAME \
  --resource-group $RESOURCE_GROUP \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image mcr.microsoft.com/k8se/quickstart:latest \
  --target-port 80 \
  --ingress external

更新容器應用程式

使用私人容器登錄中的映像更新容器應用程式,並新增系統指派的身分識別來驗證 Azure Container Registry 提取。 您也可以包含容器應用程式所需的其他設定,例如輸入、調整和 Dapr 設定。

設定登錄伺服器,並在容器應用程式中開啟系統指派的受控識別。

az containerapp registry set \
  --name $CONTAINERAPP_NAME \
  --resource-group $RESOURCE_GROUP \
  --identity system \
  --server "${REGISTRY_NAME}.azurecr.io"
az containerapp update \
  --name $CONTAINERAPP_NAME \
  --resource-group $RESOURCE_GROUP \
  --image "${REGISTRY_NAME}.azurecr.io/${IMAGE_NAME}:latest"

清理

警告

下列命令會刪除指定的資源群組和其中包含的所有資源。 如果本快速入門範圍以外的資源存在於指定的資源群組中,則也會一併刪除。

az group delete --name $RESOURCE_GROUP

本文說明如何使用 Bicep 範本設定容器應用程式,以使用「使用者指派的受控識別」從私人 Azure Container Registry 存放庫提取映像。

必要條件

設定

若要從 CLI 登入 Azure,請執行下列命令,並遵循提示來完成驗證流程。

az login

若要確定您執行的是最新版本 CLI,請執行升級命令。

az upgrade

接下來,安裝或更新 CLI 的 Azure 容器應用程式延伸模組。

如果您在 Azure CLI 中執行 az containerapp 命令或 Azure PowerShell 模組中的 Cmdlet Az.App 時收到遺漏參數的錯誤,請確定您已安裝最新版的 Azure 容器應用程式延伸模組。

az extension add --name containerapp --upgrade

注意

從 2024 年 5 月開始,Azure CLI 延伸模組預設不會再啟用預覽功能。 若要存取容器應用程式預覽功能,請使用 --allow-preview true 安裝容器應用程式延伸模組。

az extension add --name containerapp --upgrade --allow-preview true

現在已安裝目前的延伸模組或模組,請註冊 Microsoft.AppMicrosoft.OperationalInsights 命名空間。

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

安裝 Bicep

如果您尚未安裝 Bicep,可以依照下列方式來安裝。

az bicep install

如果您已安裝 Bicep,請確定您擁有最新版本。

az bicep upgrade

如需詳細資訊,請參閱安裝 Bicep (部分機器翻譯)。

設定環境變數

接下來,請設定下列環境變數。 請使用您的值取代以 <> 括住的預留位置。

RESOURCE_GROUP="<RESOURCE_GROUP_NAME>"
LOCATION="<LOCATION>"
REGISTRY_NAME="<REGISTRY_NAME>"
IMAGE_NAME="<IMAGE_NAME>"
IMAGE_TAG="<IMAGE_TAG>"
BICEP_TEMPLATE="<BICEP_TEMPLATE>"
CONTAINERAPPS_ENVIRONMENT="<ENVIRONMENT_NAME>"
CONTAINER_NAME="<CONTAINER_NAME>"
CONTAINERAPP_NAME="<CONTAINERAPP_NAME>"
USER_ASSIGNED_IDENTITY_NAME="<USER_ASSIGNED_IDENTITY_NAME>"
LOG_ANALYTICS_WORKSPACE_NAME="<LOG_ANALYTICS_WORKSPACE_NAME>"
APP_INSIGHTS_NAME="<APP_INSIGHTS_NAME>"
ACR_PULL_DEFINITION_ID="7f951dda-4ed3-4680-a7ca-43fe172d538d"

AcrPull 角色會授予「使用者指派的受控識別」權限,以從登錄提取映像。

Bicep 範本

複製下列 Bicep 範本,並將它儲存為副檔名為 .bicep 的檔案。

param environmentName string 
param logAnalyticsWorkspaceName string
param appInsightsName string
param containerAppName string 
param azureContainerRegistry string
param azureContainerRegistryImage string 
param azureContainerRegistryImageTag string
param acrPullDefinitionId string
param userAssignedIdentityName string
param location string = resourceGroup().location

resource identity 'Microsoft.ManagedIdentity/userAssignedIdentities@2022-01-31-preview' = {
  name: userAssignedIdentityName
  location: location 
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(resourceGroup().id, azureContainerRegistry, 'AcrPullTestUserAssigned')
  properties: {
    principalId: identity.properties.principalId  
    principalType: 'ServicePrincipal'
    // acrPullDefinitionId has a value of 7f951dda-4ed3-4680-a7ca-43fe172d538d
    roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', acrPullDefinitionId)
  }
}

resource logAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
  name: logAnalyticsWorkspaceName
  location: location
  properties: any({
    retentionInDays: 30
    features: {
      searchVersion: 1
    }
    sku: {
      name: 'PerGB2018'
    }
  })
}

resource appInsights 'Microsoft.Insights/components@2020-02-02' = {
  name: appInsightsName
  location: location
  kind: 'web'
  properties: {
    Application_Type: 'web'
    WorkspaceResourceId: logAnalyticsWorkspace.id
  }
}

resource appEnvironment 'Microsoft.App/managedEnvironments@2022-06-01-preview' = {
  name: environmentName
  location: location
  properties: {
    daprAIInstrumentationKey: appInsights.properties.InstrumentationKey
    appLogsConfiguration: {
      destination: 'log-analytics'
      logAnalyticsConfiguration: {
        customerId: logAnalyticsWorkspace.properties.customerId
        sharedKey: logAnalyticsWorkspace.listKeys().primarySharedKey
      }
    }
  }
}

resource containerApp 'Microsoft.App/containerApps@2022-06-01-preview' = {
  name: containerAppName
  location: location
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${identity.id}': {}
    }
  }
  properties: {
    environmentId: appEnvironment.id
    configuration: {
      ingress: {
        targetPort: 8080
        external: true
      }
      registries: [
        {
          server: '${azureContainerRegistry}.azurecr.io'
          identity: identity.id
        }
      ]
    }
    template: {
      containers: [
        {
          image: '${azureContainerRegistry}.azurecr.io/${azureContainerRegistryImage}:${azureContainerRegistryImageTag}'
          name: '${azureContainerName}'
          resources: {
            cpu: 1
            memory: '2Gi'
          }
        }
      ]
      scale: {
        minReplicas: 1
        maxReplicas: 1
      }
    }
  }
}

output location string = location
output environmentId string = appEnvironment.id

部署容器應用程式

使用下列命令部署您的容器應用程式。

az deployment group create \
  --resource-group $RESOURCE_GROUP \
  --template-file $BICEP_TEMPLATE \
  --parameters environmentName="${CONTAINERAPPS_ENVIRONMENT}" \
  logAnalyticsWorkspaceName="${LOG_ANALYTICS_WORKSPACE_NAME}" \
  appInsightsName="${APP_INSIGHTS_NAME}" \
  containerAppName="${CONTAINERAPP_NAME}" \
  azureContainerRegistry="${REGISTRY_NAME}" \
  azureContainerRegistryImage="${IMAGE_NAME}" \
  azureContainerRegistryImageTag="${IMAGE_TAG}" \
  azureContainerName="${CONTAINER_NAME}" \
  acrPullDefinitionId="${ACR_PULL_DEFINITION_ID}" \
  userAssignedIdentityName="${USER_ASSIGNED_IDENTITY_NAME}" \
  location="${LOCATION}"

此命令會部署下列項目。

  • Azure 資源群組。
  • 容器應用程式環境。
  • 與容器應用程式環境相關聯的 Log Analytics 工作區。
  • 用於分散式追蹤的 Application Insights 資源。
  • 使用者指派的受控識別。
  • 用來儲存映像的容器。
  • 以映像為基礎的容器應用程式。

如果您收到錯誤 Failed to parse '<YOUR_BICEP_FILE_NAME>', please check whether it is a valid JSON format,請確定 Bicep 範本檔案具有副檔名 .bicep

其他資源

如需詳細資訊,請參閱下列內容。

下一步