将图像从 Azure 容器注册表拉入 Azure 容器实例时,如何使用 SystemAssigned 标识?

How can I use a SystemAssigned identity when pulling an image from Azure Container Registry into Azure Container Instances?

我想在 Azure 容器实例 中创建一个容器(或容器组),从 Azure 容器注册表[=27= 中提取图像] - 但使用 SystemAssigned 身份。因此,我想避免使用 ACR 登录凭据、服务主体或 UserAssigned 身份。

当我 运行 这个脚本 (PowerShell 中的 Azure CLI) ...

$LOC = "westeurope"
$RG = "myresourcegroup"
$ACRNAME = "myacr"

az configure --defaults location=$LOC group=$RG

$acr = az acr show -n $ACRNAME -o json | ConvertFrom-Json -Depth 10

az container create --name app1 --image $($acr.loginServer+"/app1") `
    --assign-identity --role acrpull --scope $acr.id `
    --debug

... ACI 似乎没有意识到它应该已经获得 ACR 授权并显示此提示:

Image registry username:

Azure CLI 版本:2.14.0

这有意义吗? ACR 是否支持 ACI 托管身份?

在您的代码中,当您使用在 ACI 创建时创建的托管标识创建 Azure 容器以向 ACR 进行身份验证时。恐怕你不能那样做,因为有 limitations

You can't use a managed identity to pull an image from Azure Container Registry when creating a container group. The identity is only available within a running container.

此解决方案将不使用托管身份,重要的是要注意我们至少在资源组级别需要所有者角色。

主要思想是使用服务主体使用 acrpull 角色获取访问权限。请参阅以下 PowerShell 脚本:


$resourceGroup = (az group show --name $resourceGroupName | ConvertFrom-Json )

$containerRegistry = (az acr show --name $containerRegistryName | ConvertFrom-Json)

$servicePrincipal = (az ad sp create-for-rbac `
    --name "${containerRegistryName}.azurecr.io" `
    --scopes $containerRegistry.id `
    --role acrpull `
    | ConvertFrom-Json )

az container create `
    --name $containerInstanceName `
    --resource-group $resourceGroupName `
    --image $containerImage `
    --command-line "tail -f /dev/null" `
    --registry-login-server "${containerRegistryName}.azurecr.io" `
    --registry-username $servicePrincipal.appId `
    --registry-password $servicePrincipal.password    


请注意,我们已经创建了一个服务主体,因此我们还需要删除它:


az ad sp delete --id $servicePrincipal.appId

有关于如何做到这一点的文档:

Deploy to Azure Container Instances from Azure Container Registry

更新:

我认为缺少 --registry-login-server ${containerRegistryName}.azurecr.io" 选项。

@minus_one - 解决方案不适用于我的情况。用于制作容器注册表的操作手册。它确实需要比此处所述更多的特权...... https://github.com/Azure/azure-powershell/issues/3215

从 2022 年 1 月开始,Azure 容器实例支持托管标识以访问 Azure 容器注册表:https://docs.microsoft.com/en-us/azure/container-instances/using-azure-container-registry-mi