データ プレーンのロールベースのアクセス制御と 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 PowerShell をローカルで使用する場合は、次のようにします。
- Az PowerShell モジュールの最新バージョンをインストールします。
- Connect-AzAccount コマンドレットを使用して、Azure アカウントに接続します。
- Azure Cloud Shell を使用する場合は、次のようにします。
- 詳細については、Azure Cloud Shell の概要に関するページを参照してください。
ロールの定義を準備する
まず、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
詳しくは、コントロール プレーンのロールベースのアクセスの許可に関する記事をご覧ください。
az cosmosdb show
を使用して、現在のアカウントの一意識別子を取得します。az cosmosdb show \ --resource-group "<name-of-existing-resource-group>" \ --name "<name-of-existing-nosql-account>" \ --query "{id:id}"
前のコマンドの出力を確認します。 次の手順で使用する必要があるため、このアカウントの
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
になります。 この例では架空のデータを使用します。実際の識別子はこの例とは異なります。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"
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>"
新しい 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
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>'
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
これらの手順を繰り返して、使用する他の ID からこのアカウントへのアクセス権を付与します。
ヒント
必要な数の ID に対してこれらの手順を繰り返すことができます。 一般的に、開発者が自分のユーザー ID を使用してアカウントにアクセスできるようにし、アプリケーションがマネージド ID を使用してアクセスできるようにするには、これらの手順を繰り返し実行する必要があります。
Get-AzCosmosDBAccount
を使用して、現在のアカウントのメタデータを取得します。$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" Name = "<name-of-existing-nosql-account>" } Get-AzCosmosDBAccount @parameters | Select -Property Id
前のコマンドの出力を確認します。 次の手順で使用する必要があるため、このアカウントの
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
になります。 この例では架空のデータを使用します。実際の識別子はこの例とは異なります。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
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.Cosmos
と Azure.Identity
のライブラリを使用しています。