【问题标题】:How can I use a SystemAssigned identity when pulling an image from Azure Container Registry into Azure Container Instances?将映像从 Azure 容器注册表拉入 Azure 容器实例时,如何使用 SystemAssigned 标识?
【发布时间】:2024-01-15 19:13:02
【问题描述】:

我想在 Azure Container Instances 中创建一个容器(或容器组),从 Azure Container Registry 中提取图像 - 但使用 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 托管标识?

【问题讨论】:

    标签: azure-container-instances azure-managed-identity azure-container-registry azure-acr


    【解决方案1】:

    此解决方案将不使用托管标识,请务必注意,我们至少在资源组级别需要所有者角色。

    主要思想是使用服务主体通过 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-username $servicePrincipal.appId `
        --registry-password $servicePrincipal.password    
    
    
    

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

    
    az ad sp delete --id $servicePrincipal.appId
    
    

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

    Deploy to Azure Container Instances from Azure Container Registry

    【讨论】:

    • 感谢@minus-one - 有趣的方法。
    【解决方案2】:

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

    您不能使用托管标识从 Azure 容器中提取图像 创建容器组时的注册表。身份只是 在正在运行的容器中可用。

    【讨论】: