Uzyskiwanie dostępu do danych usługi Azure Cosmos DB przy użyciu tożsamości zarządzanych przypisanych przez system

DOTYCZY: NoSQL

W tym artykule skonfigurujesz niezawodne, niezależne od rotacji kluczy rozwiązanie dostępu do kluczy usługi Azure Cosmos DB przy użyciu tożsamości zarządzanych i kontroli dostępu opartej na rolach płaszczyzny danych. W przykładzie w tym artykule użyto usługi Azure Functions, ale możesz użyć dowolnej usługi obsługującej tożsamości zarządzane.

Dowiesz się, jak utworzyć aplikację funkcji, która może uzyskiwać dostęp do danych usługi Azure Cosmos DB bez konieczności kopiowania jakichkolwiek kluczy usługi Azure Cosmos DB. Aplikacja funkcji zostanie wyzwolona po wysłaniu żądania HTTP, a następnie wyświetli listę wszystkich istniejących baz danych.

Wymagania wstępne

  • Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.

  • Istniejący interfejs API usługi Azure Cosmos DB dla konta NoSQL. Tworzenie interfejsu API usługi Azure Cosmos DB dla konta NoSQL

  • Istniejąca aplikacja funkcji usługi Azure Functions. Tworzenie pierwszej funkcji w witrynie Azure Portal

  • Azure Functions Core Tools

  • Aby wykonać kroki opisane w tym artykule, zainstaluj interfejs wiersza polecenia platformy Azure i zaloguj się na platformie Azure.

    Sprawdzanie wymagań wstępnych

    1. W terminalu lub oknie polecenia zapisz nazwy aplikacji funkcji usługi Azure Functions, konta usługi Azure Cosmos DB i grupy zasobów jako zmienne powłoki o nazwach functionName, cosmosNamei resourceGroupName.

      # Variable for function app name
      functionName="msdocs-function-app"
      
      # Variable for Azure Cosmos DB account name
      cosmosName="msdocs-cosmos-app"
      
      # Variable for resource group name
      resourceGroupName="msdocs-cosmos-functions-dotnet-identity"
      

      Uwaga

      Te zmienne są ponownie używane w kolejnych krokach. W tym przykładzie przyjęto założenie, że nazwa konta usługi Azure Cosmos DB to , nazwa aplikacji funkcji to msdocs-cosmos-appmsdocs-function-app , a nazwa grupy zasobów to msdocs-cosmos-functions-dotnet-identity.

    2. Wyświetl właściwości aplikacji funkcji przy użyciu az functionapp show polecenia .

      az functionapp show \
          --resource-group $resourceGroupName \
          --name $functionName
      
    3. Wyświetl właściwości tożsamości zarządzanej przypisanej przez system dla aplikacji funkcji przy użyciu polecenia az webapp identity show.

      az webapp identity show \
          --resource-group $resourceGroupName \
          --name $functionName
      
    4. Wyświetl właściwości konta usługi Azure Cosmos DB przy użyciu polecenia az cosmosdb show.

      az cosmosdb show \
          --resource-group $resourceGroupName \
          --name $cosmosName
      

Tworzenie interfejsu API usługi Azure Cosmos DB dla baz danych NoSQL

W tym kroku utworzysz dwie bazy danych.

  1. W terminalu lub oknie polecenia utwórz nową products bazę danych przy użyciu polecenia az cosmosdb sql database create.

    az cosmosdb sql database create \
        --resource-group $resourceGroupName \
        --name products \
        --account-name $cosmosName
    
  2. Utwórz nową customers bazę danych.

    az cosmosdb sql database create \
        --resource-group $resourceGroupName \
        --name customers \
        --account-name $cosmosName
    

Uzyskiwanie interfejsu API usługi Azure Cosmos DB dla punktu końcowego NoSQL

W tym kroku wykonasz zapytanie dotyczące punktu końcowego dokumentu dla konta interfejsu API dla noSQL.

  1. Użyj polecenia az cosmosdb show z parametrem zapytania ustawionym na documentEndpointwartość . Zarejestruj wynik. Użyjesz tej wartości w późniejszym kroku.

    az cosmosdb show \
        --resource-group $resourceGroupName \
        --name $cosmosName \
        --query documentEndpoint
    
    cosmosEndpoint=$(
        az cosmosdb show \
            --resource-group $resourceGroupName \
            --name $cosmosName \
            --query documentEndpoint \
            --output tsv
    )
    
    echo $cosmosEndpoint
    

    Uwaga

    Ta zmienna jest ponownie wykorzystywana w późniejszym kroku.

Udzielanie dostępu do konta usługi Azure Cosmos DB

W tym kroku przypiszesz rolę do przypisanej przez system tożsamości zarządzanej aplikacji funkcji. Usługa Azure Cosmos DB ma wiele wbudowanych ról, które można przypisać do tożsamości zarządzanej na potrzeby dostępu do płaszczyzny sterowania. W przypadku dostępu do płaszczyzny danych należy utworzyć nową rolę niestandardową z dostępem do metadanych odczytu.

Napiwek

Aby uzyskać więcej informacji na temat znaczenia dostępu do najniższych uprawnień, zobacz artykuł Niższe narażenie na uprzywilejowane konta .

  1. Użyj polecenia az cosmosdb show z parametrem zapytania ustawionym na idwartość . Zapisz wynik w zmiennej powłoki o nazwie scope.

    scope=$(
        az cosmosdb show \
            --resource-group $resourceGroupName \
            --name $cosmosName \
            --query id \
            --output tsv
    )
    
    echo $scope
    

    Uwaga

    Ta zmienna jest ponownie wykorzystywana w późniejszym kroku.

  2. Użyj polecenia az webapp identity show z parametrem zapytania ustawionym na principalIdwartość . Zapisz wynik w zmiennej powłoki o nazwie principal.

    principal=$(
        az webapp identity show \
            --resource-group $resourceGroupName \
            --name $functionName \
            --query principalId \
            --output tsv
    )
    
    echo $principal
    
  3. Utwórz nowy plik JSON z konfiguracją nowej roli niestandardowej.

    {
        "RoleName": "Read Azure Cosmos DB Metadata",
        "Type": "CustomRole",
        "AssignableScopes": ["/"],
        "Permissions": [{
            "DataActions": [
                "Microsoft.DocumentDB/databaseAccounts/readMetadata"
            ]
        }]
    }
    

    Napiwek

    Plik można utworzyć w usłudze Azure Cloud Shell przy użyciu touch <filename> wbudowanego edytora (code .). Aby uzyskać więcej informacji, zobacz Edytor usługi Azure Cloud Shell

  4. Użyj az cosmosdb sql role definition create polecenia , aby utworzyć nową definicję roli o nazwie Read Azure Cosmos DB Metadata przy użyciu niestandardowego obiektu JSON.

    az cosmosdb sql role definition create \
        --resource-group $resourceGroupName \
        --account-name $cosmosName \
        --body @definition.json
    

    Uwaga

    W tym przykładzie definicja roli jest definiowana w pliku o nazwie definition.json.

  5. Służy az role assignment create do przypisywania Read Azure Cosmos DB Metadata roli do tożsamości zarządzanej przypisanej przez system.

    az cosmosdb sql role assignment create \
        --resource-group $resourceGroupName \
        --account-name $cosmosName \
        --role-definition-name "Read Azure Cosmos DB Metadata" \
        --principal-id $principal \
        --scope $scope
    

Programowy dostęp do kluczy usługi Azure Cosmos DB

Mamy teraz aplikację funkcji z przypisaną przez system tożsamością zarządzaną z rolą niestandardową. Następująca aplikacja funkcji wyśle zapytanie do konta usługi Azure Cosmos DB, aby uzyskać listę baz danych.

  1. Utwórz projekt funkcji lokalnej za pomocą parametru --dotnet w folderze o nazwie csmsfunc. Zmienianie katalogu powłoki

    func init csmsfunc --dotnet
    
    cd csmsfunc
    
  2. Utwórz nową funkcję z parametrem szablonu ustawionym na httptrigger , a nazwa ustawiona na readdatabases.

    func new --template httptrigger --name readdatabases
    
  3. Azure.Identity Dodaj pakiet i Microsoft.Azure.Cosmos NuGet do projektu .NET. Skompiluj projekt przy użyciu polecenia dotnet build.

    dotnet add package Azure.Identity
    
    dotnet add package Microsoft.Azure.Cosmos
    
    dotnet build
    
  4. Otwórz kod funkcji w zintegrowanym środowisku dewelopera (IDE).

    Napiwek

    Jeśli używasz interfejsu wiersza polecenia platformy Azure lokalnie lub w usłudze Azure Cloud Shell, możesz otworzyć program Visual Studio Code.

    code .
    
  5. Zastąp kod w pliku readdatabases.cs tą przykładową implementacją funkcji. Zapisz zaktualizowany plik.

    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    using Azure.Identity;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Azure.Cosmos;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.Http;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.Logging;
    
    namespace csmsfunc
    {
        public static class readdatabases
        {
            [FunctionName("readdatabases")]
            public static async Task<IActionResult> Run(
                [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req,
                ILogger log)
            {
                log.LogTrace("Start function");
    
                CosmosClient client = new CosmosClient(
                    accountEndpoint: Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
                    new DefaultAzureCredential()
                );
    
                using FeedIterator<DatabaseProperties> iterator = client.GetDatabaseQueryIterator<DatabaseProperties>();
    
                List<(string name, string uri)> databases = new();
                while(iterator.HasMoreResults)
                {
                    foreach(DatabaseProperties database in await iterator.ReadNextAsync())
                    {
                        log.LogTrace($"[Database Found]\t{database.Id}");
                        databases.Add((database.Id, database.SelfLink));
                    }
                }
    
                return new OkObjectResult(databases);
            }
        }
    }
    

(Opcjonalnie) Uruchamianie funkcji lokalnie

W środowisku DefaultAzureCredential lokalnym klasa używa różnych poświadczeń lokalnych do określenia bieżącej tożsamości. Podczas uruchamiania lokalnego nie jest wymagane w przypadku instrukcji, możesz opracowywać lokalnie przy użyciu własnej tożsamości lub jednostki usługi.

  1. Pobierz identyfikator podmiotu zabezpieczeń konta lokalnego przy użyciu polecenia az ad signed-in-user show.

    az ad signed-in-user show --query "id"
    
  2. Przypisz dostęp do konta lokalnego kontroli dostępu opartej na rolach do konta usługi Azure Cosmos DB przy użyciu az cosmosdb sql role assignment create polecenia . Użyj wbudowanej roli "Współautor danych usługi Cosmos DB" o identyfikatorze 00000000-0000-0000-0000-000000000002.

    az cosmosdb sql role assignment create \
        --resource-group $resourceGroupName \
        --account-name $cosmosName \
        --role-definition-id "00000000-0000-0000-0000-000000000002" \
        --principal-id "<your-principal-id>" \
        --scope "/"
    
  3. W pliku local.settings.json dodaj nowe ustawienie o nazwie COSMOS_ENDPOINT w obiekcie Values. Wartość ustawienia powinna być punktem końcowym dokumentu zarejestrowanym wcześniej w tym przewodniku z instrukcjami.

    ...
    "Values": {
        ...
        "COSMOS_ENDPOINT": "https://msdocs-cosmos-app.documents.azure.com:443/",
        ...
    }
    ...
    

    Uwaga

    Ten obiekt JSON został skrócony w celu zwięzłości. Ten obiekt JSON zawiera również przykładową wartość, która zakłada, że nazwa konta to msdocs-cosmos-app.

  4. Uruchamianie aplikacji funkcji

    func start
    

Wdrażanie na platformie Azure

Po opublikowaniu DefaultAzureCredential klasa używa poświadczeń ze środowiska lub tożsamości zarządzanej. W tym przewodniku tożsamość zarządzana przypisana przez system będzie używana jako poświadczenia konstruktora CosmosClient .

  1. COSMOS_ENDPOINT Ustaw ustawienie w aplikacji funkcji już wdrożonej na platformie Azure.

    az functionapp config appsettings set \
        --resource-group $resourceGroupName \
        --name $functionName \
        --settings "COSMOS_ENDPOINT=$cosmosEndpoint"
    
  2. Wdróż aplikację funkcji na platformie Azure, ponownie używając zmiennej functionName powłoki:

    func azure functionapp publish $functionName
    
  3. Przetestuj funkcję w witrynie Azure Portal.