Déployer sur Azure Container Instances à partir d’Azure Container Registry à l’aide d’une identité managée

Azure Container Registry (ACR) est un service de registre de conteneurs managé, basé sur Azure, utilisé pour stocker des images conteneur Docker privées. Cet article explique comment extraire des images conteneur stockées dans un registre de conteneurs Azure lors d’un déploiement sur des groupes de conteneurs à l’aide d’Azure Container Instances. Une façon de configurer l’accès au Registre consiste à créer une identité managée Microsoft Entra.

Lorsque l’accès à un Azure Container Registry (ACR) est restreint à l’aide d’un point de terminaison privé, l’utilisation d’une identité managée permet aux Azure Container Instances déployées dans un réseau virtuel d’accéder au registre de conteneurs via le point de terminaison privé.

Prérequis

Registre de conteneurs Azure : Vous avez besoin d’un registre de conteneurs Azure Premium avec au moins une image. Si vous devez créer un registre, consultez Créer un registre de conteneurs à l’aide d’Azure CLI. Veillez à prendre note du id et du loginServer du registre.

Azure CLI : Les exemples de ligne de commande dans cet article utilisent Azure CLI et sont mis en forme pour le shell Bash. Vous pouvez installer Azure CLI localement, ou bien utilisez Azure Cloud Shell.

Limites

Configurer l’authentification du registre

Les services approuvés doivent être activés dans votre registre de conteneurs. Pour obtenir des instructions sur l’activation des services approuvés, consultez Permettre à des services de confiance d’accéder en toute sécurité à un registre de conteneurs ayant un accès réseau restreint.

Créer une identité

Créez une identité dans votre abonnement avec la commande az identity create. Vous pouvez utiliser le groupe de ressources qui vous a servi à créer le registre de conteneurs, ou vous pouvez utiliser un autre groupe.

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

Pour configurer l’identité aux étapes suivantes, utilisez la commande az identity show afin de stocker l’ID de ressource et l’ID de principal de service de l’identité dans des variables.

Pour configurer correctement l’identité dans les étapes suivantes, utilisez la commande az identity show pour obtenir et stocker l’ID de ressource et l’ID de principal de service de l’identité dans des variables.

# 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)

Vous aurez besoin de l’ID de ressource de l’identité pour vous connecter à l’interface CLI à partir de votre machine virtuelle. Pour afficher la valeur :

echo $USERID

L’ID de ressource se présente sous la forme suivante :

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

Vous aurez également besoin de l’ID du principal de service pour accorder à l’identité managée l’accès à votre registre de conteneurs. Pour afficher la valeur :

echo $SPID

L’ID du principal de service se présente sous la forme suivante :

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

Accorder une attribution de rôle à l’identité

Pour que votre identité puisse accéder à votre registre de conteneurs, vous devez lui accorder une attribution de rôle. Utilisez la commande suivante pour accorder le rôle acrpull à l’identité que vous venez de créer, en veillant à fournir l’ID de votre registre et le principal de service que nous avons obtenus précédemment :

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

Déployer à l’aide d’un modèle Azure Resource Manager (ARM)

Commencez par copier le JSON suivant dans un nouveau fichier nommé azuredeploy.json. Dans Azure Cloud Shell, vous pouvez utiliser Visual Studio Code pour créer le fichier dans votre répertoire de travail :

code azuredeploy.json

Vous pouvez spécifier les propriétés de votre registre de conteneurs Azure dans un modèle ARM en incluant la propriété imageRegistryCredentials dans la définition du groupe de conteneurs. Par exemple, vous pouvez spécifier les informations d’identification du registre directement :

Notes

Il ne s’agit pas d’un modèle ARM complet, mais plutôt d’un exemple de ce à quoi ressemblerait la section resources d’un modèle complet.

{
    "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"
    }
  }

Déployer le modèle

Déployez votre modèle Resource Manager à l’aide de la commande suivante :

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

Déployer à l’aide de l’interface de ligne de commande (CLI) Azure

Pour déployer un groupe de conteneurs en utilisant une identité managée pour authentifier les extractions d’images via Azure CLI, utilisez la commande suivante, en vous assurant que votre <dns-label> est unique au niveau mondial :

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>

Déployer dans un réseau virtuel à l’aide d’Azure CLI

Pour déployer un groupe de conteneurs sur un réseau virtuel à l’aide d’une identité managée pour authentifier les extractions d’images à partir d’un ACR qui s’exécute derrière un point de terminaison privé via Azure CLI, utilisez la commande suivante :

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

Pour plus d’informations sur le déploiement sur un réseau virtuel, consultez Déployer des instances de conteneur dans un réseau virtuel Azure.

Déployer un groupe à plusieurs conteneurs dans un réseau virtuel à l’aide de YAML et d’Azure CLI

Pour déployer un groupe à plusieurs conteneurs sur un réseau virtuel à l’aide d’une identité managée afin d’authentifier les extractions d’images à partir d’un ACR qui s’exécute derrière un point de terminaison privé via Azure CLI, vous pouvez spécifier la configuration du groupe de conteneurs dans un fichier YAML. Vous devez ensuite transmettre le fichier YAML à la commande en tant que paramètre.

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

Pour plus d’informations sur le déploiement sur un groupe à plusieurs conteneurs, consultez Déployer un groupe à plusieurs conteneurs.

Nettoyer les ressources

Pour supprimer toutes les ressources de votre abonnement Azure, supprimez le groupe de ressources :

az group delete --name myResourceGroup

Étapes suivantes