Azure Cosmos DB for Table でロールベースのアクセス制御を使用する (プレビュー)
デプロイ ガイドのシーケンスのダイアグラム。概要、概念、準備、ロールベースのアクセス制御、リファレンスの順になっています。 現在、"ロールベースのアクセス制御" の場所が強調表示されています。
この記事では、Azure Cosmos DB for Table アカウントのデータを管理するアクセス権を ID に付与する手順について説明します。 この記事の手順では、個々の項目に対して操作を実行し、クエリを実行するためのデータ プレーン アクセスのみについて説明します。
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
- 既存の Azure Cosmos DB for Table アカウント。
- 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 Table のデータの読み取り、クエリ、管理を実行できるアクセス権を付与するために、dataActions
の一覧を含むロールの定義を準備する必要があります。
まず、az cosmsodb show
を使用して既存の Azure Cosmos DB for Table アカウントのリソース識別子を取得し、変数に格納します。 次に、az rest
を使用して、Azure Cosmos DB for Table アカウントに関連付けられているすべてのロールの定義を一覧表示します。 最後に、出力を確認して、Cosmos DB 組み込みデータ共同作成者というロールの定義を見つけます。 出力には、id
プロパティ内のロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値をメモしておきます。
resourceId=$( \
az cosmosdb show \
--resource-group "<name-of-existing-resource-group>" \
--name "<name-of-existing-table-account>" \
--query "id" \
--output tsv \
)
az rest \
--method "GET" \
--url $resourceId/tableRoleDefinitions?api-version=2023-04-15
[
...,
{
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002",
"name": "00000000-0000-0000-0000-000000000002",
"properties": {
"assignableScopes": [
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
],
"permissions": [
{
"dataActions": [
"Microsoft.DocumentDB/databaseAccounts/readMetadata",
"Microsoft.DocumentDB/databaseAccounts/tables/*",
"Microsoft.DocumentDB/databaseAccounts/tables/containers/entities/*"
],
"notDataActions": []
}
],
"roleName": "Cosmos DB Built-in Data Contributor",
"type": "BuiltInRole"
},
"type": "Microsoft.DocumentDB/databaseAccounts/tableRoleDefinitions"
}
...
]
Note
この例では、id
の値は /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002
になります。 この例では架空のデータを使用します。実際の識別子はこの例とは異なります。 この出力例は切り捨てられます。
Get-AzCosmosDBAccount
を使用して既存の Azure Cosmos DB for Table アカウントのリソース識別子を取得し、変数に格納します。 次に、Invoke-AzRestMethod
を使用して、Azure Cosmos DB for Table アカウントに関連付けられているすべてのロールの定義を一覧表示します。 出力を確認し、Cosmos DB 組み込みデータ共同作成者というロールの定義を見つけます。 出力には、Id
プロパティ内のロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値をメモしておきます。
$parameters = @{
ResourceGroupName = "<name-of-existing-resource-group>"
Name = "<name-of-existing-table-account>"
}
$resourceId = (
Get-AzCosmosDBAccount @parameters |
Select-Object -Property Id -First 1
).Id
$parameters = @{
Path = "$resourceId/tableRoleDefinitions?api-version=2023-04-15"
Method = "GET"
}
Invoke-AzRestMethod @parameters
StatusCode : 200
Content : {
"value": [
...,
{
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002",
"name": "00000000-0000-0000-0000-000000000002",
"properties": {
"assignableScopes": [
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
],
"permissions": [
{
"dataActions": [
"Microsoft.DocumentDB/databaseAccounts/readMetadata",
"Microsoft.DocumentDB/databaseAccounts/tables/*",
"Microsoft.DocumentDB/databaseAccounts/tables/containers/entities/*"
],
"notDataActions": []
}
],
"roleName": "Cosmos DB Built-in Data Contributor",
"type": "BuiltInRole"
},
"type": "Microsoft.DocumentDB/databaseAccounts/tableRoleDefinitions"
}
...
]
}
...
Note
この例では、Id
の値は /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002
になります。 この例では架空のデータを使用します。実際の識別子はこの例とは異なります。 この出力例は切り捨てられます。
ID にロールを割り当てる
次は、新しく定義したロールを ID に割り当てて、アプリケーションから Azure Cosmos DB for Table のデータにアクセスできるようにします。
重要
この割り当てタスクでは、ロールベースのアクセス制御のアクセス許可を付与する ID の一意識別子を取得しておく必要があります。 ID の一意識別子をお持ちではない場合は、マネージド ID の作成またはサインイン ID の取得ガイドに従ってください。
az cosmosdb show
を使用して、現在のアカウントの一意識別子を取得します。az cosmosdb show \ --resource-group "<name-of-existing-resource-group>" \ --name "<name-of-existing-resource-group>" \ --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
になります。 この例では架空のデータを使用します。実際の識別子はこの例とは異なります。role-assignment.json という新しい JSON ファイルを作成します。 JSON ファイルに、ID の一意識別子とアカウント リソースの一意識別子を追加します。
{ "properties": { "roleDefinitionId": "<account-resource-id>/tableRoleDefinitions/d3d3d3d3-eeee-ffff-aaaa-b4b4b4b4b4b4", "scope": "<account-resource-id>", "principalId": "<id-of-existing-identity>" } }
Note
この例では、指定された一意の GUID は
d3d3d3d3-eeee-ffff-aaaa-b4b4b4b4b4b4
です。 以前に独自のロールの定義に使用した一意の GUID を使用できます。次に、
az cosmosdb show
とaz rest
を組み合わせてロールの割り当てを作成または更新し、HTTPPUT
要求を発行します。 この要求の一部として、ロールの割り当てに一意の GUID を指定します。resourceId=$( \ az cosmosdb show \ --resource-group "<name-of-existing-resource-group>" \ --name "<name-of-existing-table-account>" \ --query "id" \ --output tsv \ ) az rest \ --method "PUT" \ --url $resourceId/tableRoleAssignments/e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5?api-version=2023-04-15 \ --body @role-assignment.json
Note
この例では、指定された一意の GUID は
e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5
です。 独自のロールの割り当てには、任意の一意の GUID を指定できます。
別の Bicep ファイルを作成して、ID にロールを割り当てます。 このファイルに data-plane-role-assignment.bicep という名前を付けます。
metadata description = 'Assign RBAC role for data plane access to Azure Cosmos DB for Table.' @description('Name of the Azure Cosmos DB for Table 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@2023-04-15' existing = { name: accountName } resource assignment 'Microsoft.DocumentDB/databaseAccounts/tableRoleAssignments@2023-04-15' = { name: guid(roleDefinitionId, identityId, account.id) parent: account properties: { principalId: identityId roleDefinitionId: roleDefinitionId scope: account.id } } output id string = assignment.id
data-plane-role-assignment.bicepparam
という名前の新しい Bicep パラメーター ファイルを作成します。 このパラメーター ファイルでは、既存の Azure Cosmos DB for Table アカウントの名前をaccountName
パラメーターに、先ほどメモしたロールの定義識別子をroleDefinitionId
パラメーターに、ID の一意識別子をidentityId
パラメーターに割り当てます。using './data-plane-role-assignment.bicep' param accountName = '<name-of-existing-table-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
になります。 この例では架空のデータを使用します。実際の識別子はこの例とは異なります。次に、
Get-AzCosmosDBAccount
とInvoke-AzRestMethod
を組み合わせてロールの割り当てを作成または更新し、HTTPPUT
要求を発行します。 この要求の一部として、ロールの割り当てに一意の GUID を指定します。 最後に、ID の一意識別子を指定するリソース割り当てペイロードを作成します。$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" Name = "<name-of-existing-table-account>" } $resourceId = ( Get-AzCosmosDBAccount @parameters | Select-Object -Property Id -First 1 ).Id $payload = @{ properties = @{ roleDefinitionId = "$resourceId/tableRoleDefinitions/00000000-0000-0000-0000-000000000002" scope = "$resourceId" principalId = "<id-of-existing-identity>" } } $parameters = @{ Path = "$resourceId/tableRoleAssignments/e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5?api-version=2023-04-15" Method = "PUT" Payload = $payload | ConvertTo-Json -Depth 2 } Invoke-AzRestMethod @parameters
Note
この例では、指定された一意の GUID は
e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5
です。 独自のロールの割り当てには、任意の一意の GUID を指定できます。
コードでデータ プレーンのアクセスを検証する
最後に、好みのプログラミング言語でアプリケーション コードと Azure SDK を使用して、アクセスが正しく付与されたことを検証します。
using Azure.Identity;
using Azure.Data.Tables;
string endpoint = "<account-endpoint>";
DefaultAzureCredential credential = new();
TableServiceClient client = new(
endpoint: new Uri(endpoint),
tokenCredential: credential
);
TableClient table = client.GetTableClient(
tableName: "<name-of-table>"
);
重要
このコード サンプルでは、NuGet の Azure.Data.Tables
と Azure.Identity
のライブラリを使用しています。
警告
ユーザー割り当てマネージド ID を使用している場合は、資格情報オブジェクトの作成の一環として、マネージド ID の一意識別子を指定する必要があります。