Comment utiliser des identités managées pour se connecter à Azure Cosmos DB à partir d’une machine virtuelle Azure

Dans cet article, nous allons configurer une machine virtuelle afin d’utiliser des identités managées pour se connecter à Azure Cosmos DB. Azure Cosmos DB est une base de données NoSQL complètement managée pour développer des applications modernes. Les identités managées pour les ressources Azure permettent à vos applications de s’authentifier lorsqu’elles accèdent à des services qui prennent en charge l’authentification Microsoft Entra à l’aide d’une identité managée par Azure.

Prérequis

Créer un groupe de ressources

Créez un groupe de ressources appelé mi-test. Nous utilisons ce groupe de ressources pour toutes les ressources dans ce tutoriel.

Créer une machine virtuelle Azure avec une identité managée

Pour ce tutoriel, vous avez besoin d’une machine virtuelle Azure. Créez une machine virtuelle avec une identité managée affectée par le système activée et appelez-la mi-vm-01. Vous pouvez aussi créer une identité managée affectée par l’utilisateur appelée mi-ua-01 dans le groupe de ressources que nous avons créé plus tôt (mi-test). Si vous utilisez une identité managée affectée par l’utilisateur, vous pouvez l’affecter à une machine virtuelle lors de la création.

Créer une machine virtuelle avec une identité managée affectée par le système

Pour créer une machine virtuelle Azure avec l’identité managée affectée par le système sur une machine virtuelle, votre compte a besoin de l’affectation de rôle Contributeur de machine virtuelle. Aucune autre attribution de rôle Microsoft Entra n’est requise.

  • Dans le portail Azure, recherchez machines virtuelles.
  • Choisissez Créer.
  • Sous l’onglet Informations de base, fournissez les informations requises.
  • Choisissez Suivant : Disques >.
  • Continuez à renseigner les informations selon les besoins, puis sous l’onglet Gestion, recherchez la section Identité et cochez la case à côté de Identité managée affectée par le système.

Image illustrant comment activer les identités managées affectées par le système lors de la création d’une machine virtuelle.

Pour plus d’informations, consultez la documentation sur les machines virtuelles Azure :

Créer une machine virtuelle avec une identité managée affectée par l’utilisateur

Les étapes ci-dessous vous montrent comment créer une machine virtuelle avec une identité managée affectée par l’utilisateur configurée.

Aujourd’hui, le portail Azure ne prend pas en charge l’attribution d’une identité managée affectée par l’utilisateur lors de la création d’une machine virtuelle. Vous devez créer une machine virtuelle, puis lui attribuer une identité managée affectée par l’utilisateur.

Configurer des identités managées pour ressources Azure sur une machine virtuelle en utilisant le portail Azure

Créer un compte Azure Cosmos DB

Maintenant que nous avons une machine virtuelle avec une identité managée affectée par l’utilisateur ou une identité managée affectée par le système, il nous faut un compte Azure Cosmos DB pour lequel vous disposez de droits d’administration. Si, dans le cadre de ce tutoriel, vous devez créer un compte Azure Cosmos DB, le Guide de démarrage rapide d’Azure Cosmos DB présente en détail les étapes à suivre.

Remarque

Les identités managées peuvent être utilisées pour accéder à toute ressource Azure prenant en charge l’authentification Microsoft Entra. Ce tutoriel part du principe que votre compte Azure Cosmos DB sera configuré comme indiqué ci-dessous.

Paramètre valeur Description
Abonnement Nom d’abonnement Sélectionnez l’abonnement Azure que vous souhaitez utiliser pour ce compte Azure Cosmos DB.
Groupe de ressources Nom de groupe ressources Sélectionnez mi-test ou Créer, puis entrez un nom unique pour le nouveau groupe de ressources.
Nom du compte Un nom unique Entrez un nom pour identifier votre compte Azure Cosmos DB. Étant donné que documents.azure.com est ajouté au nom que vous fournissez pour créer votre URI, utilisez un nom unique.

Le nom peut uniquement contenir des lettres minuscules, des chiffres et le caractère de trait d’union (-). Sa longueur doit être comprise entre 3 et 44 caractères.
API Type de compte à créer Sélectionnez Azure Cosmos DB for NoSQL pour créer une base de données orientée document et interrogez-la à l’aide de la syntaxe SQL.

En savoir plus sur l’API SQL.
Emplacement La région la plus proche de vos utilisateurs Sélectionnez la zone géographique dans laquelle héberger votre compte Azure Cosmos DB. Utilisez l’emplacement le plus proche de vos utilisateurs pour leur donner l’accès le plus rapide possible aux données.

Notes

Si vous faites des tests, vous souhaiterez peut-être appliquer une remise de niveau gratuit Azure Cosmos DB. Le niveau gratuit d’Azure Cosmos DB vous permet de bénéficier gratuitement de 1 000 RU/s et d’un compte de stockage de 25 Go. Découvrez-en plus sur le niveau gratuit. Sachez que, dans le cadre de ce tutoriel, ce choix ne fait aucune différence.

Accorder l'accès

À ce stade, nous devons avoir une machine virtuelle configurée avec une identité managée et un compte Azure Cosmos DB. Avant de continuer, nous devons accorder à l’identité managée deux ou trois rôles différents.

  • Accordez d’abord l’accès au plan de gestion Azure Cosmos DB en utilisant le contrôle RBAC Azure. L’identité managée doit avoir le rôle Contributeur de comptes DocumentDB attribué pour créer des bases de données et des conteneurs.

  • Vous devez également accorder un rôle de contributeur à l’identité managée en utilisant le contrôle RBAC Azure Cosmos DB. Vous pouvez voir les étapes spécifiques ci-dessous.

Notes

Nous allons utiliser le rôle Contributeur aux données intégrées Cosmos DB. Pour accorder l’accès, vous devez associer la définition de rôle à l’identité. Dans notre cas, il s’agit de l’identité managée associée à notre machine virtuelle.

À ce stade, aucune option d’attribution de rôle n’est disponible dans le portail Azure.

Accéder aux données

Pour obtenir l’accès à Azure Cosmos DB avec des identités managées, la bibliothèque Azure.identity doit être utilisée afin d’activer l’authentification dans votre application. Vous pouvez appeler ManagedIdentityCredential directement ou utiliser DefaultAzureCredential.

La classe ManagedIdentityCredential tente une authentification à l’aide d’une identité managée affectée à l’environnement de déploiement. La classe DefaultAzureCredential passe par différentes options d’authentification dans l’ordre. La deuxième option d’authentification que tente DefaultAzureCredential est les identités managées.

Dans l’exemple ci-dessous, vous allez créer une base de données, un conteneur et un élément dans le conteneur, puis lire l’élément qui vient d’être créé avec l’identité managée affectée par le système de la machine virtuelle. Si vous souhaitez utiliser une identité managée affectée par l’utilisateur, vous devez en spécifier une en indiquant l’ID client de l’identité managée.

string userAssignedClientId = "<your managed identity client Id>";
var tokenCredential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = userAssignedClientId });

Pour utiliser l’exemple ci-dessous, vous devez disposer des packages NuGet suivants :

  • Azure.Identity
  • Microsoft.Azure.Cosmos
  • Microsoft.Azure.Management.CosmosDB

En plus des packages NuGet ci-dessus, vous devez également activer Inclure la préversion, puis ajouter Azure.ResourceManager.CosmosDB.

using Azure.Identity;
using Azure.ResourceManager.CosmosDB;
using Azure.ResourceManager.CosmosDB.Models;
using Microsoft.Azure.Cosmos;
using System;
using System.Threading.Tasks;

namespace MITest
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // Replace the placeholders with your own values
            var subscriptionId = "Your subscription ID";
            var resourceGroupName = "You resource group";
            var accountName = "Cosmos DB Account name";
            var databaseName = "mi-test";
            var containerName = "container01";

            // Authenticate to Azure using Managed Identity (system-assigned or user-assigned)
            var tokenCredential = new DefaultAzureCredential();

            // Create the Cosmos DB management client using the subscription ID and token credential
            var managementClient = new CosmosDBManagementClient(tokenCredential)
            {
                SubscriptionId = subscriptionId
            };

            // Create the Cosmos DB data client using the account URL and token credential
            var dataClient = new CosmosClient($"https://{accountName}.documents.azure.com:443/", tokenCredential);

            // Create a new database using the management client
            var createDatabaseOperation = await managementClient.SqlResources.StartCreateUpdateSqlDatabaseAsync(
                resourceGroupName,
                accountName,
                databaseName,
                new SqlDatabaseCreateUpdateParameters(new SqlDatabaseResource(databaseName), new CreateUpdateOptions()));
            await createDatabaseOperation.WaitForCompletionAsync();

            // Create a new container using the management client
            var createContainerOperation = await managementClient.SqlResources.StartCreateUpdateSqlContainerAsync(
                resourceGroupName,
                accountName,
                databaseName,
                containerName,
                new SqlContainerCreateUpdateParameters(new SqlContainerResource(containerName), new CreateUpdateOptions()));
            await createContainerOperation.WaitForCompletionAsync();

            // Create a new item in the container using the data client
            var partitionKey = "pkey";
            var id = Guid.NewGuid().ToString();
            await dataClient.GetContainer(databaseName, containerName)
                .CreateItemAsync(new { id = id, _partitionKey = partitionKey }, new PartitionKey(partitionKey));

            // Read back the item from the container using the data client
            var pointReadResult = await dataClient.GetContainer(databaseName, containerName)
                .ReadItemAsync<dynamic>(id, new PartitionKey(partitionKey));

            // Run a query to get all items from the container using the data client
            await dataClient.GetContainer(databaseName, containerName)
                .GetItemQueryIterator<dynamic>("SELECT * FROM c")
                .ReadNextAsync();
        }
    }
}

Exemples par langage qui utilisent ManagedIdentityCredential :

.NET

Initialisez votre client Azure Cosmos DB :

CosmosClient client = new CosmosClient("<account-endpoint>", new ManagedIdentityCredential());

Puis, lisez et écrivez des données.

Java

Initialisez votre client Azure Cosmos DB :

CosmosAsyncClient Client = new CosmosClientBuilder().endpoint("<account-endpoint>") .credential(new ManagedIdentityCredential()) .build();

Puis, lisez et écrivez les données comme décrit dans ces exemples.

JavaScript

Initialisez votre client Azure Cosmos DB :

const client = new CosmosClient({ "<account-endpoint>", aadCredentials: new ManagedIdentityCredential() });

Puis, lisez et écrivez les données comme décrit dans ces exemples.

Étapes de nettoyage

Conseil

Les étapes décrites dans cet article peuvent varier légèrement en fonction du portail de départ.

  1. Connectez-vous au portail Azure.

  2. Recherchez la ressource à supprimer.

  3. Sélectionnez Supprimer.

  4. Quand vous y êtes invité, confirmez la suppression.

Étapes suivantes

En savoir plus sur les identités managées pour les ressources Azure :

En savoir plus sur Azure Cosmos DB :