CosmosDBの読み取り権限がないエラーに対する対処法



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) に付与する例です。

```bash:role_assignment.sh
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
```

- **実行結果 (サンプル)**
  ```json
  {
    "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. トラブルシューティング

1. **権限がすぐに反映されない**  
   - 反映までに数分かかるケースがあります。少し待ってから再度試してください。

2. **ロール定義 ID がわからない**  
   - CLI や Portal から Cosmos DB のロール定義一覧を確認し、必要な ID を調べます。

3. **アカウントまたはプリンシパル 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 のクエリが実行できるようになるはずです。ぜひ試してみてください。

https://qiita.com/baku2san/items/85714f90c094cebedb44