Rendszer által hozzárendelt felügyelt identitások használata az Azure Cosmos DB-adatok eléréséhez

A KÖVETKEZŐRE VONATKOZIK: NoSQL

Ebben a cikkben egy robusztus, kulcsforgatásos agnosztikus megoldást fog beállítani az Azure Cosmos DB-kulcsok eléréséhez felügyelt identitások és adatsík szerepköralapú hozzáférés-vezérlés használatával. A cikkben szereplő példa az Azure Functionst használja, de bármely olyan szolgáltatást használhat, amely támogatja a felügyelt identitásokat.

Megtudhatja, hogyan hozhat létre olyan függvényalkalmazást, amely anélkül férhet hozzá az Azure Cosmos DB-adatokhoz, hogy bármilyen Azure Cosmos DB-kulcsot kellene másolnia. A függvényalkalmazás HTTP-kérések esetén aktiválódik, majd felsorolja az összes meglévő adatbázist.

Előfeltételek

  • Egy Azure-fiók, aktív előfizetéssel. Fiók ingyenes létrehozása.

  • Meglévő Azure Cosmos DB API for NoSQL-fiók. Azure Cosmos DB API létrehozása NoSQL-fiókhoz

  • Egy meglévő Azure Functions-függvényalkalmazás. Az első függvény létrehozása az Azure Portalon

  • Azure Functions Core Tools

  • A cikkben ismertetett lépések végrehajtásához telepítse az Azure CLI-t , és jelentkezzen be az Azure-ba.

    Előfeltételek ellenőrzése

    1. Egy terminálban vagy parancsablakban tárolja az Azure Functions-függvényalkalmazás, az Azure Cosmos DB-fiók és az erőforráscsoport nevét a rendszerhéjváltozók neveként functionName, cosmosNameés 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"
      

      Feljegyzés

      Ezeket a változókat a rendszer a későbbi lépésekben újra felhasználja. Ez a példa feltételezi, hogy az Azure Cosmos DB-fiók neve msdocs-cosmos-app, a függvényalkalmazás neve msdocs-function-app és az erőforráscsoport neve msdocs-cosmos-functions-dotnet-identity.

    2. A parancs használatával az functionapp show megtekintheti a függvényalkalmazás tulajdonságait.

      az functionapp show \
          --resource-group $resourceGroupName \
          --name $functionName
      
    3. A függvényalkalmazás rendszer által hozzárendelt felügyelt identitásának tulajdonságainak megtekintése a függvényalkalmazás használatával az webapp identity show.

      az webapp identity show \
          --resource-group $resourceGroupName \
          --name $functionName
      
    4. Az Azure Cosmos DB-fiók tulajdonságainak megtekintése a következő használatával az cosmosdb show: .

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

Azure Cosmos DB API létrehozása NoSQL-adatbázisokhoz

Ebben a lépésben két adatbázist fog létrehozni.

  1. Terminál vagy parancsablakban hozzon létre egy új products adatbázist a következő használatával az cosmosdb sql database create: .

    az cosmosdb sql database create \
        --resource-group $resourceGroupName \
        --name products \
        --account-name $cosmosName
    
  2. Hozzon létre egy új customers adatbázist.

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

Az Azure Cosmos DB API for NoSQL-végpont lekérése

Ebben a lépésben lekérdezi a NoSQL-fiók API-hoz tartozó dokumentumvégpontot.

  1. Használja az cosmosdb show a lekérdezési paramétert a következőre documentEndpoint: . Rögzítse az eredményt. Ezt az értéket egy későbbi lépésben fogja használni.

    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
    

    Feljegyzés

    Ez a változó egy későbbi lépésben lesz újra felhasználva.

Hozzáférés biztosítása az Azure Cosmos DB-fiókhoz

Ebben a lépésben hozzárendel egy szerepkört a függvényalkalmazás rendszer által hozzárendelt felügyelt identitásához. Az Azure Cosmos DB több beépített szerepkört is biztosít, amelyeket hozzárendelhet a felügyelt identitáshoz a vezérlősík-hozzáféréshez. Az adatsík-hozzáféréshez új egyéni szerepkört fog létrehozni az olvasási metaadatokhoz való hozzáféréssel.

Tipp.

A minimális jogosultsági hozzáférés fontosságáról további információt a kiemelt fiókok alacsonyabb szintű kitettségéről szóló cikkben talál.

  1. Használja az cosmosdb show a lekérdezési paramétert a következőre id: . Az eredményt egy névvel ellátott scoperendszerhéjváltozóban tárolja.

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

    Feljegyzés

    Ez a változó egy későbbi lépésben lesz újra felhasználva.

  2. Használja az webapp identity show a lekérdezési paramétert a következőre principalId: . Az eredményt egy névvel ellátott principalrendszerhéjváltozóban tárolja.

    principal=$(
        az webapp identity show \
            --resource-group $resourceGroupName \
            --name $functionName \
            --query principalId \
            --output tsv
    )
    
    echo $principal
    
  3. Hozzon létre egy új JSON-fájlt az új egyéni szerepkör konfigurációjával.

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

    Tipp.

    Létrehozhat egy fájlt az Azure Cloud Shellben vagy touch <filename> a beépített szerkesztővel (code .). További információ: Azure Cloud Shell-szerkesztő

  4. Az egyéni JSON-objektummal elnevezett Read Azure Cosmos DB Metadata új szerepkördefiníció létrehozásához használhatóaz cosmosdb sql role definition create.

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

    Feljegyzés

    Ebben a példában a szerepkördefiníció egy definition.json nevű fájlban van definiálva.

  5. A az role assignment create szerepkör hozzárendelése a Read Azure Cosmos DB Metadata rendszer által hozzárendelt felügyelt identitáshoz.

    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
    

Programozott hozzáférés az Azure Cosmos DB-kulcsokhoz

Most már van egy függvényalkalmazásunk, amely rendszer által hozzárendelt felügyelt identitással rendelkezik az egyéni szerepkörrel. Az alábbi függvényalkalmazás lekérdezi az Azure Cosmos DB-fiókot az adatbázisok listájához.

  1. Hozzon létre egy helyi függvényprojektet a --dotnet paraméterrel egy nevű csmsfuncmappában. A rendszerhéj könyvtárának módosítása

    func init csmsfunc --dotnet
    
    cd csmsfunc
    
  2. Hozzon létre egy új függvényt a sablonparaméter beállításával httptrigger és a név beállításával readdatabases.

    func new --template httptrigger --name readdatabases
    
  3. Adja hozzá a Azure.Identity NuGet-csomagot Microsoft.Azure.Cosmos a .NET-projekthez. A projekt létrehozása a következővel dotnet build: .

    dotnet add package Azure.Identity
    
    dotnet add package Microsoft.Azure.Cosmos
    
    dotnet build
    
  4. Nyissa meg a függvénykódot egy integrált fejlesztői környezetben (IDE).

    Tipp.

    Ha az Azure CLI-t helyileg vagy az Azure Cloud Shellben használja, megnyithatja a Visual Studio Code-ot.

    code .
    
  5. Cserélje le a readdatabases.cs fájlban lévő kódot erre a mintafüggvény-implementációra. Mentse a módosított fájlt.

    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);
            }
        }
    }
    

(Nem kötelező) A függvény helyi futtatása

Helyi környezetben az DefaultAzureCredential osztály különböző helyi hitelesítő adatokkal határozza meg az aktuális identitást. A helyi futtatás nem szükséges az útmutatóhoz, de helyileg is fejleszthet saját identitással vagy szolgáltatásnévvel.

  1. A local.settings.json fájlban adjon hozzá egy új beállítást COSMOS_ENDPOINT az Értékek objektumban. A beállítás értékének a jelen útmutatóban korábban rögzített dokumentumvégpontnak kell lennie.

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

    Feljegyzés

    Ez a JSON-objektum rövidítve lett a rövidítés kedvéért. Ez a JSON-objektum egy mintaértéket is tartalmaz, amely feltételezi, hogy a fiók neve .msdocs-cosmos-app

  2. A függvényalkalmazás futtatása

    func start
    

Üzembe helyezés az Azure-ban

A közzétételt követően az osztály a DefaultAzureCredential környezetből származó hitelesítő adatokat vagy egy felügyelt identitást fog használni. Ebben az útmutatóban a rendszer által hozzárendelt felügyelt identitást fogja használni a CosmosClient konstruktor hitelesítő adataiként.

  1. Állítsa be a beállítást az COSMOS_ENDPOINT Azure-ban már üzembe helyezett függvényalkalmazáson.

    az functionapp config appsettings set \
        --resource-group $resourceGroupName \
        --name $functionName \
        --settings "COSMOS_ENDPOINT=$cosmosEndpoint"
    
  2. A függvényalkalmazás üzembe helyezése az Azure-ban a functionName rendszerhéjváltozó újbóli használatával:

    func azure functionapp publish $functionName
    
  3. Tesztelje a függvényt az Azure Portalon.