🐙

【Azure】cosmosDBのデータを取得するためのロール付与

2024/05/10に公開

初めに

AzureのリソースからAzure cosmosDBのデータを取得したり・追加したりしたいときにRBACを用いてcosmosDBのデータへのアクセス権限をリソースに付与しようとしました。しかし、MSLearnなどドキュメントを読んでもうまくいかず、Azureサポートへ問い合わせたりしました。正直MSLearnのドキュメントだけだと分かりづらいと思ったので、今回記事にして説明していきます。

今回のケースをもう少しわかりやすく

「初めに」の説明だと少しわかりづらいと思ったので、今回どういうことをしていきたかったかをもう少し補足します。例えばAppService上に作成したアプリからcosmosDBにアクセスしてデータの閲覧や書き込みを行いたい場合、AppServiceに対して対象のcosmosDBにアクセスできるような権限(ロール)を付与してあげる必要があります。今回はそのような場合につまりやすいポイントを紹介しつつ、cosmosDBのロールへの理解を深めようといった記事になっております。なお、AppServiceに限らず他のAzureリソースからcosmosDBのデータにアクセスしたい場合にも今回の話は必要な情報になります。

コントロールプレーンとデータプレーン

まず、cosmosDBのロールを考えるときにはコントロールプレーン・データプレーンという概念をざっくり理解しておく必要がありそうです。

コントロールプレーン

コントロールプレーンとは厳密な定義はわかりませんが、Azureポータル上でcosmosDBのデータを閲覧したり、操作したりするために必要な部分と解釈しました。コントロールプレーンのロールに関する話は以下記事で確認できます。
https://learn.microsoft.com/ja-jp/azure/cosmos-db/role-based-access-control
「このユーザーにAzureポータルでcosmosDBを閲覧できる権限を与えたい」という場合にはMSLearnに記載のあるように対象のcosmosDBのIAM(アクセス制御)からロールを割り当てることができます。

https://learn.microsoft.com/ja-jp/azure/cosmos-db/role-based-access-control
以下のようなロールがあるようなので、閲覧だけなら「CosmosDBアカウント閲覧者ロール」を割り当てれば良いと思います。

https://learn.microsoft.com/ja-jp/azure/cosmos-db/role-based-access-control
基本的にはこのIAM上でロールを割り当てればアクセス権限って付与できるものだと私は思っていたので、AppServiceに閲覧者のロールを割り当ててみましたが、AppServiceからcosmosDBにアクセスできませんでした。AppServiceからのアクセスを許可するためには次のデータプレーン部分のロールが必要で、むしろコントロールプレーン(IAMで設定できる)のロールは不要でした。

AppServiceからアクセスできない場合はこういうエラーが起きるかも(例)
Request is blocked because principal [*******************] does not have required RBAC permissions to perform action [Microsoft.DocumentDB/databaseAccounts/readMetadata] on resource [/]

→必要なロールがないというエラーですね。

データプレーン

データプレーンとは、Azureポータル以外でcosmosDBのデータにアクセスしたい場合に必要になってくる部分と解釈しています。今回データプレーンと言っているのがcosmosDB専用のRBACのようで、コントロールプレーンとは別物らしいです。以下MSLearnでデータプレーンのロールについて記載されています。以下MSLearnは上記で貼ったコントロールプレーンとは別のページです。言葉も「ロール」など同じような言葉を使うので、正直わかりづらいといった感想です。
https://learn.microsoft.com/ja-jp/azure/cosmos-db/how-to-setup-rbac
先ほども少し記載したようにAzureポータル上からロールを割り当てできません。
(↓MSLearnにも記載されてた)

https://learn.microsoft.com/ja-jp/azure/cosmos-db/how-to-setup-rbac
ロールの割り当て方法については上記のMSLearnに記載があるのですが、Azure PowerShellやAzure CLIの方法が記載されています。

データプレーンのロール割り当て方法(AzureCLI)

1つだけAzure CLIを用いてロールを設定する方法を紹介します。内容は以下リンクで確認できるものと大体同じです。
https://learn.microsoft.com/ja-jp/azure/cosmos-db/how-to-setup-rbac#using-the-azure-cli-1
(OSなど環境によって環境変数の定義の仕方など若干異なると思いますが基本的な流れはわかると思います。環境によって微修正してください。)
シェル上で、以下のコマンドを実行して自分のAzureリソースおよび与えたいロールを定義してください。<〜>の部分はそのまま入力するのではなく、自分の環境にあった値を記載する部分です。

resourceGroupName='<myResourceGroup>'
accountName='<myCosmosAccount>'
readOnlyRoleDefinitionId='<roleDefinitionId>'
principalId='<aadPrincipalId>'

どのような値を設定すれば良いかは以下の表を参考にしてください。

上記の変数名 内容
resourceGroupName cosmosDBアカウントのリソースグループ
accountName cosmosDBアカウントの名前(リソース名)
readOnlyRoleDefinitionId 割り当てるロールのID
principalId ロールの定義を割り当てるリソースのプリンシパルID

変数を定義できたら、以下コマンドを実行することでロールを割り当てることができます。
(Azure CLIの場合はおそらく以下コマンドの前にaz loginを実行して、ロールを割り当てる権限のあるEntra IDでログインすることが必要です。)

az cosmosdb sql role assignment create --account-name $accountName --resource-group $resourceGroupName --scope "/" --principal-id $principalId --role-definition-id $readOnlyRoleDefinitionId

scopeについて

ロールを割り当てるコマンドで以下のようにscopeを設定しています。今回のコマンドではアカウントレベルで設定しているので割り当てたAzureリソースはcosmosDB内のどのコンテナにもアクセスできることになります。

--scope "/"

もう少しscopeを絞りたい場合は以下を参考にしてください。

https://learn.microsoft.com/ja-jp/azure/cosmos-db/how-to-setup-rbac#role-assignments

割り当てるロールについて

既にAzure側で以下のようなロールが用意されているので、以下ロールのIDを「readOnlyRoleDefinitionId」の部分に設定できます(変数名がreadOnlyになっていて分かりづらくて申し訳ないのですが、共同作成者の方であれば書き込みも可能と思います)。

https://learn.microsoft.com/ja-jp/azure/cosmos-db/how-to-setup-rbac#role-assignments
用意されていないカスタムロールを定義することも可能なので、そこはドキュメントを確認してみてください。

最後に

cosmosDB以外に専用のRBACみたいなものが存在するかは分かりませんが、とりあえずcosmosDBのRBACはちょっと分かりづらいですね。この記事が誰かの参考になれば幸いです。

参考および補足

AppServiceにロールを割り当てるときには以下MSLearnのシステムマネージドIDというものを使用しています。対象のAppServiceのシステムマネージドIDにロールを割り当てるようなイメージですね。
https://learn.microsoft.com/ja-jp/entra/identity/managed-identities-azure-resources/overview

Discussion