Azure Cosmos DB にアクセスしようとした際に、「権限がない」 等のエラーが発生し、読み取り(クエリ)に失敗するケースがあります。これはロールベースのアクセス制御 (RBAC) 設定が正しく行われていない可能性が高いです。本記事では、エラーを解消するためのロールアサイン(Role Assignment)の手順を紹介します。
・実際に出たエラー内容
principal [principal id] does not have required RBAC permissions to perform action [Microsoft.DocumentDB/databaseAccounts/readMetadata] on
resource
1. RBAC とロールアサインとは
RBAC (Role-Based Access Control)
-
概要
Azure にはリソースを操作する権限をロール単位で管理する仕組み (RBAC) があります。 -
Cosmos DB
Cosmos DB でも RBAC を用いて「読み取り専用」「読み書き可能」などアクセス権を細かく制御可能です。
ロールアサインの重要性
-
ロールが付与されていない場合
ユーザーやサービス プリンシパル (SP) などがクエリ操作をしようとしてもForbidden
またはUnauthorized
エラーが返り、アクセスできません。 -
ロール定義
Cosmos DB には組み込みのロール定義 (例: Read-Only) やカスタムロール定義が存在し、ユーザー/サービス プリンシパルに適切なロールを割り当てる必要があります。
2. 具体的なロールアサイン例
以下のコマンドは、Cosmos DB の特定アカウントに対して読み取り専用ロールをユーザー (または SP) に付与する例です。
az cosmosdb sql role assignment create \
-a <cosmos-db-account-name> \
-g <rg-hogehoge> \
-s "/" \
-p 0ab87591-6611-4bde-ab82-5d5079868728 \
-d 00000000-0000-0000-0000-000000000001
-
実行結果 (サンプル)
{ "id": "/subscriptions/<subscription-id>/resourceGroups/<rg-hogehoge>/providers/Microsoft.DocumentDB/databaseAccounts/<cosmos-db-account-name>/sqlRoleAssignments/9a2e6c6a-b0d3-4a42-b823-2d0e0c991682", "name": "9a2e6c6a-b0d3-4a42-b823-2d0e0c991682", "principalId": "0ab87591-6611-4bde-ab82-5d5079868728", "resourceGroup": "<rg-hogehoge>", "roleDefinitionId": "/subscriptions/<subscription-id>/resourceGroups/<rg-hogehoge>/providers/Microsoft.DocumentDB/databaseAccounts/<cosmos-db-account-name>/sqlRoleDefinitions/00000000-0000-0000-0000-000000000001", "scope": "/subscriptions/<subscription-id>/resourceGroups/<rg-hogehoge>/providers/Microsoft.DocumentDB/databaseAccounts/<cosmos-db-account-name>", "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments" }
これで、principalId
に指定したユーザー or SP に対して、Cosmos DB アカウント全体 (-s "/"
) の読み取り専用ロールが割り当てられます。
3. パラメータの解説
パラメータ | 説明 |
---|---|
-a <cosmos-db-account-name> |
Cosmos DB アカウント名。例: foc-dev-cosmos など |
-g <rg-hogehoge> |
リソースグループ名 (ここではマスク)。 |
-s "/" |
ロール適用のスコープ。ここではアカウント全体 ("/" ) を指定 |
-p 0ab87591-6611-4bde-xxxx-xxxxxxxxxxxx |
ロールを割り当てる先のプリンシパル ID (ユーザーまたはサービス プリンシパルなど) |
-d 00000000-0000-0000-0000-000000000001 |
ロール定義 ID。読み取り専用の組み込みロールを指定 |
-
ロール定義 ID
-
00000000-0000-0000-0000-000000000001
は Cosmos DB の組み込み読み取りロールです。書き込みが必要な場合は別のロール定義 ID を指定します。
-
4. トラブルシューティング
-
権限がすぐに反映されない
- 反映までに数分かかるケースがあります。少し待ってから再度試してください。
-
ロール定義 ID がわからない
- CLI や Portal から Cosmos DB のロール定義一覧を確認し、必要な ID を調べます。
-
アカウントまたはプリンシパル ID が間違っている
-
az ad sp show --id <app-id>
などを使い、対象 SP (またはユーザー) が正しいか確認してください。 - Cosmos DB アカウント名も誤字がないように再チェックを。
-
5. まとめ
- Cosmos DB で読み取り権限がない場合、RBAC によるロールアサインが必須です。
-
az cosmosdb sql role assignment create
コマンドを使い、該当ユーザーやサービス プリンシパルにロールを付与します。 - 割り当てた後は数分待ってアクセスし直すか、Portal の「アクセス制御 (IAM)」などからロールの反映状況を確認しましょう。
これで「Forbidden
/ Unauthorized
」系の読み取りエラーが解消し、無事に Cosmos DB のクエリが実行できるようになるはずです。ぜひ試してみてください。