Azure でロールの割り当てをPowerShellで行う方法ともうちょっと頑張れば自動化できるようになるところまでを備忘録として記録します。
前置きですが、これに至る経緯として 今回 仮想デスクトップ(WVD/AVD)のマシンを使用するユーザが各自でマシンを停止したり再起動したりできるようにカスタムロールを作成しました。これをやっておくことで、AVDに接続できない場合なんかに再起動操作などをユーザー側に任せられるようになります。つまり、情シスへの問い合わせが減る!
で、これを実現するためには作成したロールをマシンへ割り当てる必要がありますが、この作業は手動で行う必要があり1台ずつGUIでやっていたら日が暮れてしまうので、PowerShellでやる手順を確認したときのものです。
ロールの割り当てを行う(GUI & PowerShell)
カスタムロールを作成する方法はこちらのサイトでわかりやすく説明されていました。
今回はカスタムロールの割り当てをしていますが、組み込みのロールでも可能です。以下にGUIでの手順をPowerShellの手順を記載してます。
GUIでロール割り当て手順
まずはGUIでの手順です。PowerShellの手順は下のほうに記載しています。
ロール割り当ての追加の画面を開きます。
1 |
仮想マシン > アクセス制御 > 追加 > ロールの割り当ての追加(プレビュー) |
対象のロールを選択して「次へ」
割り当て先のメンバーを選択して、次へ。
「レビューと割り当て」をクリックして完了。
以下で、ロールが割り当てられていることを確認する。
1 |
対象の仮想マシン > アクセス制御(IAM)> ロールの割り当て |
GUIでの設定手順は以上です。
PowerShell でロールの割り当て手順
前提として、今回、割り当てるメンバーはユーザーです(グループではなく)。そして、スコープ(割り当て先のリソース)としては、仮想マシンになります。
まず、割り当てるコマンドは「New-AzRoleAssignment」で、構文としては以下のようになります。
1 2 3 |
New-AzRoleAssignment -ObjectId <objectId> ` -RoleDefinitionName <roleName> ` -Scope /subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>/providers/<providerName>/<resourceType>/<resourceSubType>/<resourceName> |
オプション説明
-ObjectId | ユーザのID |
-RoleDefinitionName | ロールの名前 |
-Scope | 仮想マシンのリソースID |
オプションの各値は今回の前提に沿っているので、状況によってスコープや割り当てるオブジェクトIDは変わってきます。
それぞれの値をどうやって取ってくるのかという説明を以下に記載します。
- ユーザのIDの取得
12345678910111213> Get-AzADUser -StartsWith usernameUserPrincipalName username@pig-log.comObjectType UserUsageLocation JPGivenNameSurnameAccountEnabled TrueMailNickname usernameMail username@pig-log.comDisplayName usernameId xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxType Member
- ロールの名前GUIの手順でロール割り当ての追加 の手順で名前を確認できます。引数に指定するのはidでも良いみたいです。というか日本語表記のロールであれば、idを取得して指定したほうがよさそうですね。「Get-AzRoleDefinition」のコマンドでロールやロールのidを取得できます。
- 仮想マシンのリソースID
「Get-AzResource」で ResourceId を取得できます。
12345678Get-AzResource |where { $_.Name -eq "avd-vm-1" }Name : avd-vm-1ResourceGroupName : ResourceGroup1ResourceType : Microsoft.Compute/virtualMachinesLocation : japaneastResourceId : /subscriptions/zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzz/resourceGroups/ResourceGroup1/providers/Microsoft.Compute/virtualMachines/avd-vm-1Tags :
これらをふまえて、実行するコマンドは以下のようになります。
1 2 3 |
New-AzRoleAssignment -ObjectId xxxxxxx-xxxx-xxxx-xxxx-xxxxxxx ` -RoleDefinitionName "ロール名" ` -Scope /subscriptions/zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzz/resourceGroups/ResourceGroup1/providers/Microsoft.Compute/virtualMachines/avd-vm-1 |
ここまでやってみて気づきましたが、オブジェクトIDと割り当て先のスコープが都度変わってくる今回のような場合、結構手間です。GUIじゃかったるくてやってらんねーと思ってPowerShellでやってみたらこっちはこっちでそれなりに手間。。。ということで、スクリプトにしたのが以下です。
実行時に引数として、ユーザー名と割り当て先のマシン名を付与することで、ユーザーのオブジェクトIDやマシンのリソースIDを自動で取得して指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
### 変数定義 # 引数 $user_name = $Args[0] $host_name = $Args[1] # サブスクリプションID $sub_id = "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzz" # カスタムロール名 $custom_role_name = "custom role name" # リソースグループ名(割当先リソースIDが存在するリソースグループ名) $target_resrc_grname = "RG_NAME" # 割当先リソースID $target_resrc_id = "/subscriptions/$sub_id/resourceGroups/$target_resrc_grname/providers/Microsoft.Compute/virtualMachines/$host_name" ### 事前処理 # ユーザオブジェクトID取得 $user_object_id = Get-AzADUser -UserPrincipalName $user_name $user_object_id = $user_object_id.id ### メイン処理 # カスタムロール割り当て New-AzRoleAssignment -ObjectId $user_object_id ` -RoleDefinitionName "$custom_role_name" ` -Scope "$target_resrc_id" |
あとは、CSVでユーザ名とマシン名のリストを用意して、foreachで回せば楽ちん一発でロール割り当てが完了するハズです。
では!
↓↓↓ 持っていると便利な一冊。