次の方法で共有


データ プレーンのロールベースのアクセス制御と Azure Cosmos DB for NoSQL を使用する

適用対象: NoSQL

デプロイ ガイドのシーケンス内の現在の場所 (

次の場所を含むデプロイ ガイドのシーケンスの図: 概要、概念、準備、ロールベースのアクセス制御、ネットワーク、リファレンス。 現在、"ロールベースのアクセス制御" の場所が強調表示されています。

ヒント

新しいアプリの構築に関する最新のサンプルについては、新しいサンプル ギャラリーを参照してください

この記事では、Azure Cosmos DB for NoSQL アカウントのデータを管理するアクセス権を ID に付与する手順について説明します。

重要

この記事の手順では、個々の項目に対して操作を実行し、クエリを実行するためのデータ プレーン アクセスのみについて説明します。 コントロール プレーンのデータベースとコンテナーを管理する方法については、コントロール プレーンにロールベースのアクセスを許可するに関するページを参照してください。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます
  • 既存の Azure Cosmos DB for NoSQL アカウント。
  • Microsoft Entra ID 内の 1 つ以上の既存の ID。
  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

ロールの定義を準備する

まず、Azure Cosmos DB for NoSQL のデータの読み取り、クエリ、管理を実行できるアクセス権を付与するために、dataActions の一覧を含むロールの定義を準備する必要があります。

重要

既存のデータ プレーン ロールの定義を取得するには、コントロール プレーンの次のアクセス許可が必要です。

  • Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read

詳しくは、コントロール プレーンのロールベースのアクセスの許可に関する記事をご覧ください。

az cosmosdb sql role definition list を使用して、Azure Cosmos DB for NoSQL アカウントに関連付けられているすべてのロールの定義を一覧表示します。 出力を確認し、Cosmos DB 組み込みデータ共同作成者というロールの定義を見つけます。 出力には、id プロパティ内のロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値をメモしておきます。

az cosmosdb sql role definition list \
    --resource-group "<name-of-existing-resource-group>" \
    --account-name "<name-of-existing-nosql-account>"
[
  ...,
  {
    "assignableScopes": [
      "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    ],
    "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002",
    "name": "00000000-0000-0000-0000-000000000002",
    "permissions": [
      {
        "dataActions": [
          "Microsoft.DocumentDB/databaseAccounts/readMetadata",
          "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*",
          "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*"
        ],
        "notDataActions": []
      }
    ],
    "resourceGroup": "msdocs-identity-example",
    "roleName": "Cosmos DB Built-in Data Contributor",
    "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions",
    "typePropertiesType": "BuiltInRole"
  }
  ...
]

Note

この例では、id の値は /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002 になります。 この例では架空のデータを使用します。実際の識別子はこの例とは異なります。

Get-AzCosmosDBSqlRoleDefinition を使用して、Azure Cosmos DB for NoSQL アカウントに関連付けられているすべてのロールの定義を一覧表示します。 出力を確認し、Cosmos DB 組み込みデータ共同作成者というロールの定義を見つけます。 出力には、Id プロパティ内のロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値をメモしておきます。

$parameters = @{
    ResourceGroupName = "<name-of-existing-resource-group>"
    AccountName = "<name-of-existing-nosql-account>"
}
Get-AzCosmosDBSqlRoleDefinition @parameters
Id                         : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002
RoleName                   : Cosmos DB Built-in Data Contributor
Type                       : BuiltInRole
AssignableScopes           : {/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccountsmsdocs-identity-example-nosql}
Permissions.DataActions    : {Microsoft.DocumentDB/databaseAccounts/readMetadata, Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*, Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*}
Permissions.NotDataActions : 

Note

この例では、Id の値は /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002 になります。 この例では架空のデータを使用します。実際の識別子はこの例とは異なります。 ただし、識別子 (00000000-0000-0000-0000-000000000002) は、アカウント内のすべてのロールの定義にわたって一意です。

ID にロールを割り当てる

次は、新しく定義したロールを ID に割り当てて、アプリケーションから Azure Cosmos DB for NoSQL のデータにアクセスできるようにします。

重要

新しいデータ プレーン ロールの割り当てを作成するには、コントロール プレーンの次のアクセス許可が必要です。

  • Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read
  • Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/read
  • Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/write

詳しくは、コントロール プレーンのロールベースのアクセスの許可に関する記事をご覧ください。

  1. az cosmosdb show を使用して、現在のアカウントの一意識別子を取得します。

    az cosmosdb show \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-existing-nosql-account>" \
        --query "{id:id}"
    
  2. 前のコマンドの出力を確認します。 次の手順で使用する必要があるため、このアカウントの id プロパティの値をメモしておきます。

    {
      "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    }
    

    Note

    この例では、id の値は /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql になります。 この例では架空のデータを使用します。実際の識別子はこの例とは異なります。

  3. az cosmosdb sql role assignment create を使用して新しいロールを割り当てます。 先ほどメモしたロールの定義識別子を --role-definition-id 引数に使用し、自分の ID の一意識別子を --principal-id 引数に使用します。 最後に、--scope 引数に自分のアカウントの識別子を使用します。

    az cosmosdb sql role assignment create \
        --resource-group "<name-of-existing-resource-group>" \
        --account-name "<name-of-existing-nosql-account>" \
        --role-definition-id "<id-of-new-role-definition>" \
        --principal-id "<id-of-existing-identity>" \
        --scope "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    
  4. az cosmosdb sql role assignment list を使用して、Azure Cosmos DB for NoSQL アカウントのすべてのロールの割り当てを一覧表示します。 出力に目を通して、ロールの割り当てが作成されたことを確認します。

    az cosmosdb sql role assignment list \
        --resource-group "<name-of-existing-resource-group>" \
        --account-name "<name-of-existing-nosql-account>"
    
  1. 新しい Bicep ファイルを作成して、ロールの割り当てを定義します。 ファイルに data-plane-role-assignment.bicep という名前を付けます。

    metadata description = 'Assign RBAC role for data plane access to Azure Cosmos DB for NoSQL.'
    
    @description('Name of the Azure Cosmos DB for NoSQL account.')
    param accountName string
    
    @description('Id of the role definition to assign to the targeted principal in the context of the account.')
    param roleDefinitionId string
    
    @description('Id of the identity/principal to assign this role in the context of the account.')
    param identityId string
    
    resource account 'Microsoft.DocumentDB/databaseAccounts@2024-05-15' existing = {
      name: accountName
    }
    
    resource assignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2024-05-15' = {
      name: guid(roleDefinitionId, identityId, account.id)
      parent: account
      properties: {
        principalId: identityId
        roleDefinitionId: roleDefinitionId
        scope: account.id
      }
    }
    
    output assignmentId string = assignment.id
    
  2. data-plane-role-assignment.bicepparam という新しい Bicep パラメーター ファイルを作成します。 このパラメーター ファイルでは、既存の Azure Cosmos DB for NoSQL アカウントの名前を accountName パラメーターに、先ほどメモしたロールの定義識別子を roleDefinitionId パラメーターに、ID の一意識別子を identityId パラメーターに割り当てます。

    using './data-plane-role-assignment.bicep'
    
    param accountName = '<name-of-existing-nosql-account>'
    param roleDefinitionId = '<id-of-new-role-definition>'
    param identityId = '<id-of-existing-identity>'
    
  3. az deployment group create を使用して Bicep テンプレートをデプロイします。

    az deployment group create \
        --resource-group "<name-of-existing-resource-group>" \
        --parameters data-plane-role-assignment.bicepparam \
        --template-file data-plane-role-assignment.bicep
    
  4. これらの手順を繰り返して、使用する他の ID からこのアカウントへのアクセス権を付与します。

    ヒント

    必要な数の ID に対してこれらの手順を繰り返すことができます。 一般的に、開発者が自分のユーザー ID を使用してアカウントにアクセスできるようにし、アプリケーションがマネージド ID を使用してアクセスできるようにするには、これらの手順を繰り返し実行する必要があります。

  1. Get-AzCosmosDBAccount を使用して、現在のアカウントのメタデータを取得します。

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        Name = "<name-of-existing-nosql-account>"
    }    
    Get-AzCosmosDBAccount @parameters | Select -Property Id
    
  2. 前のコマンドの出力を確認します。 次の手順で使用する必要があるため、このアカウントの Id プロパティの値をメモしておきます。

    Id
    --    
    /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql
    

    Note

    この例では、Id の値は /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql になります。 この例では架空のデータを使用します。実際の識別子はこの例とは異なります。

  3. New-AzCosmosDBSqlRoleAssignment を使用して、新しいロールを割り当てます。 先ほどメモしたロールの定義識別子を RoleDefinitionId パラメーターに使用し、自分の ID の一意識別子を PrincipalId パラメーターに使用します。 最後に、Scope パラメーターに自分のアカウントの識別子を使用します。

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        AccountName = "<name-of-existing-nosql-account>"
        RoleDefinitionId = "<id-of-new-role-definition>"
        PrincipalId = "<id-of-existing-identity>"
        Scope = "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    }    
    New-AzCosmosDBSqlRoleAssignment @parameters
    
  4. Get-AzCosmosDBSqlRoleAssignment を使用して、Azure Cosmos DB for NoSQL アカウントのすべてのロールの割り当てを一覧表示します。 出力に目を通して、ロールの割り当てが作成されたことを確認します。

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        AccountName = "<name-of-existing-nosql-account>"
    }
    Get-AzCosmosDBSqlRoleAssignment @parameters
    

コードでデータ プレーンのアクセスを検証する

最後に、好みのプログラミング言語でアプリケーション コードと Azure SDK を使用して、アクセスが正しく付与されたことを検証します。

using Azure.Core;
using Azure.Identity;
using Microsoft.Azure.Cosmos;

string endpoint = "<account-endpoint>";

TokenCredential credential = new DefaultAzureCredential();

CosmosClient client = new(endpoint, credential);

重要

このコード サンプルでは、NuGet の Microsoft.Azure.CosmosAzure.Identity のライブラリを使用しています。