このエントリは2025/02/16現在の情報に基づいています。将来の機能追加や変更に伴い、記載事項からの乖離が発生する発生する可能性があります。
この記事の目的
以前、Managed Identityを使ったCosmos DBのRBACを構成する記事を書いたが、現在では新たに組み込みロールが用意されているため、書き直すことにした。内容やコード自体は旧版と同じ。
以前からManaged Identityを使ったCosmos DBへのアクセスは可能であったが、Azure ADのアカウントを使ってCosmos DBのデータ プレーン操作に対するRBACが組み込みロールを使って構成できるようになっている。
データ プレーンのロールベースのアクセス制御と Azure Cosmos DB for NoSQL を使用する / Use data plane role-based access control with Azure Cosmos DB for NoSQL
https://learn.microsoft.com/azure/cosmos-db/nosql/security/how-to-grant-data-plane-role-based-access
なお、コントロールプレーンのRBACは以下のドキュメントを参照。
コントロール プレーンのロールベースのアクセス制御と Azure Cosmos DB for NoSQL を使用する / Use control plane role-based access control with Azure Cosmos DB for NoSQL
https://learn.microsoft.com/azure/cosmos-db/nosql/security/how-to-grant-control-plane-role-based-access
構成
旧版と同様、Function appからCosmos DB Java SDK v4を使いCosmos DBにアクセスするが、Function appのランタイムはJava 21を使う点だけが異なる。トポロジーは全く同じ。

準備
1) Function app
構成は旧版と同じ。
2) Cosmos DB
Database、Containerまでは旧版と同じだが、割り当てるロールとして、組み込みロールを使う(もちろんカスタムロールを作ってもよい)。まずはロールの定義リストを取得したいので、以下のコマンドを実行する。
$ az cosmosdb sql role definition list \
-g <resource_group> \
-a <cosmosdb_account>
すると以下のような結果が得られる。
[
{
"assignableScopes": [
"/subscriptions/<subscriptionId>/resourceGroups/<resource_group>/providers/Microsoft.DocumentDB/databaseAccounts/<cosmosdb_account>"
],
"id": "/subscriptions/<subscriptionId>/resourceGroups/<resource_group>/providers/Microsoft.DocumentDB/databaseAccounts/<cosmosdb_account>/sqlRoleDefinitions/00000000-0000-0000-0000-000000000001",
"name": "00000000-0000-0000-0000-000000000001",
"permissions": [
{
"dataActions": [
"Microsoft.DocumentDB/databaseAccounts/readMetadata",
"Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/executeQuery",
"Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/readChangeFeed",
"Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/read"
],
"notDataActions": []
}
],
"resourceGroup": "cosmosdb",
"roleName": "Cosmos DB Built-in Data Reader",
"type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions",
"typePropertiesType": "BuiltInRole"
},
{
"assignableScopes": [
"/subscriptions/<subscriptionId>/resourceGroups/<resource_group>/providers/Microsoft.DocumentDB/databaseAccounts/<cosmosdb_account>"
],
"id": "/subscriptions/<subscriptionId>/resourceGroups/<resource_group>/providers/Microsoft.DocumentDB/databaseAccounts/<cosmosdb_account>/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": "cosmosdb",
"roleName": "Cosmos DB Built-in Data Contributor",
"type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions",
"typePropertiesType": "BuiltInRole"
}
]
ここで取得できたものが組み込みロールで、読み書き可能なものと、読み取り専用の2ロールが定義されている(実のところ、これらは旧版で作っていたカスタムロール)。
- Cosmos DB Built-in Data Contributor
- Cosmos DB Built-in Data Reader
あとは作成したManaged IdentityのPrincipal IDを使い、ロールに割り当てたらおしまい。スコープはルート (“/”) なので、Cosmos DBアカウントのIDを指定してもよいし、 “/” でもよい。
az cosmosdb sql role assignment create \
-g <resource_group> \
-a <cosmosdb_account> \
-d <CosmosDB_BuiltIn_Role_Id> \
-p <ManagedIdentity_PrincipalId> \
-s "/"
このあたりは、以下のエントリでも触れている。
これでおしまい。
テスト
あとはFunctionsをテストするだけだが、内容自体は旧版と同じなので割愛する。コードはJava 21対応したものをGitHubで公開中。
CosmosDB_RBAC_Demo
https://github.com/anishi1222/CosmosDB_RBAC_Demo