0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-01-28

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

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
  • 実行結果 (サンプル)
    {
      "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 のクエリが実行できるようになるはずです。ぜひ試してみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?