Implantar em Instâncias de Contêiner do Azure a partir do Registro de Contêiner do Azure usando uma identidade gerenciada

O Azure Container Registry (ACR) é um serviço de registro de contêiner gerenciado baseado no Azure usado para armazenar imagens de contêiner privadas do Docker. Este artigo descreve como extrair imagens de contêiner armazenadas em um registro de contêiner do Azure ao implantar em grupos de contêineres com Instâncias de Contêiner do Azure. Uma maneira de configurar o acesso ao Registro é criar uma identidade gerenciada do Microsoft Entra.

Quando o acesso a um Registro de Contêiner do Azure (ACR) é restrito usando um ponto de extremidade privado, o uso de uma identidade gerenciada permite que as Instâncias de Contêiner do Azure implantadas em uma rede virtual acessem o registro de contêiner por meio do ponto de extremidade privado.

Pré-requisitos

Registro de contêiner do Azure: você precisa de um registro de contêiner do Azure SKU premium com pelo menos uma imagem. Se você precisar criar um registro, consulte Criar um registro de contêiner usando a CLI do Azure. Certifique-se de que toma nota do registo id e loginServer

CLI do Azure: Os exemplos de linha de comando neste artigo usam a CLI do Azure e são formatados para o shell Bash. Você pode instalar a CLI do Azure localmente ou usar o Azure Cloud Shell.

Limitações

Configurar a autenticação do registo

Seu registro de contêiner deve ter os Serviços Confiáveis habilitados. Para encontrar instruções sobre como habilitar serviços confiáveis, consulte Permitir que serviços confiáveis acessem com segurança um registro de contêiner restrito à rede.

Criar uma identidade

Crie uma identidade em sua assinatura usando o comando az identity create . Você pode usar o mesmo grupo de recursos usado anteriormente para criar o registro de contêiner ou um diferente.

az identity create --resource-group myResourceGroup --name myACRId

Para configurar a identidade nas etapas a seguir, use o comando az identity show para armazenar o ID de recurso da identidade e o ID da entidade de serviço em variáveis.

Para configurar corretamente a identidade em etapas futuras, use az identity show para obter e armazenar o ID de recurso da identidade e o ID da entidade de serviço em variáveis.

# Get resource ID of the user-assigned identity
USERID=$(az identity show --resource-group myResourceGroup --name myACRId --query id --output tsv)
# Get service principal ID of the user-assigned identity
SPID=$(az identity show --resource-group myResourceGroup --name myACRId --query principalId --output tsv)

Você precisará do ID de recurso da identidade para entrar na CLI a partir de sua máquina virtual. Para mostrar o valor:

echo $USERID

O ID do recurso é do formato:

/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId

Você também precisará da ID da entidade de serviço para conceder acesso à identidade gerenciada ao seu registro de contêiner. Para mostrar o valor:

echo $SPID

O ID da entidade de serviço tem o seguinte formato:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

Conceder à identidade uma atribuição de função

Para que sua identidade acesse seu registro de contêiner, você deve conceder-lhe uma atribuição de função. Use o comando a seguir para conceder a função à identidade que você acabou de criar, certificando-se de fornecer a ID do seu registro e a acrpull entidade de serviço que obtivemos anteriormente:

az role assignment create --assignee $SPID --scope <registry-id> --role acrpull

Implantar usando um modelo do Azure Resource Manager (ARM)

Comece copiando o JSON a seguir em um novo arquivo chamado azuredeploy.json. No Azure Cloud Shell, você pode usar o Visual Studio Code para criar o arquivo em seu diretório de trabalho:

code azuredeploy.json

Você pode especificar as propriedades do seu registro de contêiner do Azure em um modelo ARM incluindo a imageRegistryCredentials propriedade na definição de grupo de contêineres. Por exemplo, você pode especificar as credenciais do Registro diretamente:

Nota

Este não é um modelo ARM abrangente, mas sim um exemplo de como seria a resources seção de um modelo completo.

{
    "type": "Microsoft.ContainerInstance/containerGroups",
    "apiVersion": "2021-09-01",
    "name": "myContainerGroup",
    "location": "norwayeast",
    "identity": {
      "type": "UserAssigned",
      "userAssignedIdentities": {
        "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId": {}
        }
    },
    "properties": {
      "containers": [
        {
          "name": "mycontainer",
          "properties": {
            "image": "myacr.azurecr.io/hello-world:latest",
            "ports": [
              {
                "port": 80,
                "protocol": "TCP"
              }
            ],
            "resources": {
              "requests": {
                "cpu": 1,
                "memoryInGB": 1
              }
            }
        }
        }
      ],
      "imageRegistryCredentials": [
        {
            "server":"myacr.azurecr.io",
            "identity":"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId"
        }
      ],
      "ipAddress": {
        "ports": [
          {
            "port": 80,
            "protocol": "TCP"
          }
        ],
        "type": "public"
      },
      "osType": "Linux"
    }
  }

Implementar o modelo

Implante seu modelo do Resource Manager com o seguinte comando:

az deployment group create --resource-group myResourceGroup --template-file azuredeploy.json

Implementar com a CLI do Azure

Para implantar um grupo de contêineres usando a identidade gerenciada para autenticar extrações de imagem por meio da CLI do Azure, use o seguinte comando, certificando-se de que você <dns-label> seja globalmente exclusivo:

az container create --name my-containergroup --resource-group myResourceGroup --image <loginServer>/hello-world:v1 --acr-identity $USERID --assign-identity $USERID --ports 80 --dns-name-label <dns-label>

Implantar em uma rede virtual usando a CLI do Azure

Para implantar um grupo de contêineres em uma rede virtual usando a identidade gerenciada para autenticar imagens extraídas de uma ACR que é executada atrás de um ponto de extremidade privado por meio da CLI do Azure, use o seguinte comando:

az container create --name my-containergroup --resource-group myResourceGroup --image <loginServer>/hello-world:v1 --acr-identity $USERID --assign-identity $USERID --vnet "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myVNetResourceGroup/providers/ --subnet mySubnetName

Para saber mais sobre como implantar em uma rede virtual, veja Implantar instâncias de contêiner em uma rede virtual do Azure.

Implantar um grupo de vários contêineres em uma rede virtual usando o YAML e a CLI do Azure

Para implantar um grupo de vários contêineres em uma rede virtual usando a identidade gerenciada para autenticar imagens extraídas de um ACR que é executado atrás de um ponto de extremidade privado por meio da CLI do Azure, você pode especificar a configuração do grupo de contêineres em um arquivo YAML. Em seguida, passe o arquivo YAML como um parâmetro para o comando.

apiVersion: '2021-10-01'
location: eastus
type: Microsoft.ContainerInstance/containerGroups
identity: 
  type: UserAssigned
  userAssignedIdentities: {
    '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId': {}
    }
properties:
  osType: Linux
  imageRegistryCredentials:
  - server: myacr.azurecr.io
    identity: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId'
  subnetIds:
  - id: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myVNetResourceGroup/providers/Microsoft.Network/virtualNetworks/myVNetName/subnets/mySubnetName'
    name: mySubnetName
  containers:
  - name: myContainer-1
    properties:
      resources:
        requests:
          cpu: '.4'
          memoryInGb: '1'
      environmentVariables:
        - name: CONTAINER
          value: 1
      image: 'myacr.azurecr.io/myimage:latest'
  - name: myContainer-2
    properties:
      resources:
        requests:
          cpu: '.4'
          memoryInGb: '1'
      environmentVariables:
        - name: CONTAINER
          value: 2
      image: 'myacr.azurecr.io/myimage:latest'
az container create --name my-containergroup --resource-group myResourceGroup --file my-YAML-file.yaml

Para saber mais sobre como implantar em um grupo de vários contêineres, veja Implantar um grupo de vários contêineres.

Clean up resources (Limpar recursos)

Para remover todos os recursos da sua subscrição do Azure, elimine o grupo de recursos:

az group delete --name myResourceGroup

Passos Seguintes