Bicep触ってみる4(ロール割り当て)
前回で一区切りと思ったんだけど、おまけでサンプルを見た時にRBACもできそうなことが分かったので、少し触ってみることにする。
環境をまとめて作る時に権限をそこに絞って付けたくなることがあるかもしれないし。
ロールの割り当て想定
サンプルではVNETを作成してそのVNETに対するRBACを設定していたので、リソース単位はそのままで良さそう。なので今回はリソースグループのRBACを触ってみようと思う。
作成したリソースグループに対して、あるユーザーに閲覧者権限を付与することにする。
ユーザーの作成
AzureポータルのMicrosoft Entra IDから適当なユーザーを作成し、オブジェクトIDを取得しておく。
ユーザーもBicepで作れないかなと思って少し調べたが、Entra IDはAzureの中という感じではないので触れないのかもしれない。

サンプル確認とBicepファイルの修正
何故かURLが埋め込みできないけれど、BicepモジュールのレジストリのVNETのものを確認する。
main.bicepの198行目から207行目がRBAC設定をしているところで、モジュールとしてnested_rbac.bicepを呼び出している。
nested_rbac.bicepは同じディレクトリの.bicepの中に入っているので、これを転用しよう。ダウンロードして手元のBicepファイルと同じ場所に置く。
サンプルではスコープがVNETになっているが、今回はスコープがリソースグループになるため、色々と変更が必要。
・7行目から変数builtInRoleNamesとしてビルトインロールのIDが列挙されているので、ロール側のIDはこれをそのまま使わせてもらう。今回は閲覧者なのでReaderを使う。ここは変更しない。
・40行目から42行目で、main.bicepで作成したVNETリソースを取得している。この手法だとリソースグループではスコープエラーとなるので、まるっと削除する。
・45行目でVNET名を利用しているが、40-42行目を削除したことで利用できなくなっている。ここは力技だけど、引数のresourceIdをそのまま使う(最終的に一意な名前がつけばなんでもいいはずなので)
・52行目のスコープは削除する
以上を行ったものを保存する。第2回で作ったmain.bicepとの相対パスを確認する。
次に、nested_rbac.bicepを呼び出す部分をmain.bicepに追記する。
サンプルのmain.bicepを参考に下記を追記する。
param roleAssignments array = [
{
roleDefinitionIdOrName: 'Reader'
principalIds: [
'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
]
principalType: 'User'
}
]
module rg_rbac 'nested_rbac.bicep' = [for (roleAssignment, index) in roleAssignments: {
name: '${uniqueString(deployment().name, location)}-rg-Rbac-${index}'
params: {
description: contains(roleAssignment, 'description') ? roleAssignment.description : ''
principalIds: roleAssignment.principalIds
roleDefinitionIdOrName: roleAssignment.roleDefinitionIdOrName
principalType: contains(roleAssignment, 'principalType') ? roleAssignment.principalType : ''
resourceId: rg.id
}
scope: rg
}]
1つ目のブロックはパラメータでroleAssignmentsを定義する。配列なので複数の指定も可能だが、今回は1つだけ。
・roleDefinitionIdOrNameにはnested_rbac.bicepの7行目からのリストの名前もしくはロールのIDを直接指定する
・principalIdsにはaliceのオブジェクトIDを指定する。複数の指定も可能だが、今回は1つだけ。
・principalTypeは、aliceがユーザーなのでUserを指定する。グループならGroup、マネージドIDならServicePrincipalなど適切なものを選ぶ必要がある。
2つ目のブロックはサンプルからほぼ変更しておらず、スコープや対象のリソースを作成したリソースグループに変更した程度。
デプロイ
右クリックメニューからデプロイする。VS Code上でエラーが無ければ特に詰まることはないはず。
確認
作成したリソースグループ → アクセス制御 (IAM) → ロールの割り当てタブを確認する。aliceに閲覧者権限が付与されていることが確認できる。

まとめ
少し強引なこともしたが、リソースグループにもロールの割り当てができることが分かった。
複数選択も可能だし、パラメータファイルで渡すこともできるので、作成した環境の権限管理をしたい場合に活用できそうだ。