Implantar nas Instâncias de Contêiner do Azure por meio do Registro de Contêiner do Azure usando uma identidade gerenciada

O (ACR) Registro de Contêiner do Azure é um serviço de registro de contêiner gerenciado, baseado no Azure, usado para armazenar imagens de contêineres do Docker particulares. Este artigo descreve como efetuar pull de imagens de contêiner armazenadas em um registro de contêiner do Azure ao implantar em grupos de contêineres com as Instâncias de Contêiner do Azure. Uma forma 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 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 de SKU Premium com pelo menos uma imagem. Se você precisar criar um registro, confira Criar um registro de contêiner usando a CLI do Azure. Anote id e loginServer do Registro

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

Limitações

Configurar a autenticação do registro

Seu registro de contêiner precisa ter Serviços Confiáveis habilitados. Para encontrar instruções sobre como habilitar serviços confiáveis, confira Permitir que os 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 um registro de contêiner ou pode usar 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 a ID do recurso da entidade e a ID da entidade de serviço nas variáveis.

Para configurar corretamente a identidade em etapas futuras, use az identity show para obter e armazenar a ID do recurso da identidade e a 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á da ID do recurso da identidade para entrar na CLI usando sua máquina virtual. Para mostrar o valor:

echo $USERID

A ID do recurso está no 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 à identidade gerenciada acesso ao seu registro de contêiner. Para mostrar o valor:

echo $SPID

A ID da entidade de serviço está no formato:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

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

Para que sua identidade acesse o registro de contêiner, você precisa conceder a ela uma atribuição de função. Use o seguinte comando para conceder a função acrpull à identidade que você acabou de criar, fornecendo a ID do seu registro e a entidade de serviço obtida anteriormente:

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

Implantar usando um modelo do ARM (Azure Resource Manager)

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 do ARM incluindo a propriedade imageRegistryCredentials na definição de grupos de contêineres. Por exemplo, você pode especificar as credenciais de registro diretamente:

Observação

Esse não é um modelo do ARM abrangente, mas sim um exemplo de como seria a seção resources 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"
    }
  }

Implantar o modelo

Implante seu modelo do Resource Manager com o seguinte comando:

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

Implantar usando a CLI do Azure

Para implantar um grupo de contêineres usando identidade gerenciada para autenticar pulls de imagens por meio da CLI do Azure, use o seguinte comando para garantir que seu <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 com a CLI do Azure

Para implantar um grupo de contêineres em uma rede virtual usando a identidade gerenciada para autenticar pulls de imagem de um ACR executado 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 obter mais informações sobre como implantar em uma rede virtual, confira 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 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 pulls de imagem de um ACR executado atrás de um ponto de extremidade privado por meio da CLI do Azure, especifique 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 obter mais informações sobre como implantar em um grupo de vários contêineres, confira Implantar um grupo de vários contêineres.

Limpar recursos

Para remover todos os recursos da sua assinatura do Azure, exclua o grupo de recursos:

az group delete --name myResourceGroup

Próximas etapas