はじめに
社内向けにAzureの研修を実施する際、研修前にユーザー毎のリソースグループを作成しておき、研修直前でロックを解除し、研修後にロックをかけなおす、または削除する、という事をやっています。
仕組み自体はPowerShellで書いてAzure Automationで実行しています。
Azure Automationで事前にスケジュールしておけば基本的には勝手に動いてくれるのですが、たまに、「スケジュール設定間違えてロック解除されてない!でも今電車の中でAzureポータル操作できない!」という状況に陥ることがあります。
そんな時にPower AutomateからAzure Automationを操作出来たら便利だなと思ったので、作ってみることにしました。
※ 注意:今回のPower Automateではプレミアムコネクタを使っています。契約形態によっては利用できない場合があります。
全体像の整理
すでにAzure AutomationのRunbookは作成しています。ただ、ロックをかける用とロックを解除する用で別のRunbookになっているので、どちらのケースも一つのPower Automateで実行できるようにすることを狙います。
また、併せて、Azure AutomationのRunbookでは、研修の種別をパラメーターで指定することで、特定のタグのついているリソースグループのみ操作することが出来るようになっているので、これもPower Automateから制御できるようにします。
Azure AutomationのRunbookの確認
ロックをかける用のRunbook
このように、パラメーターとしてCloud(研修種別)を受け取り、そのタグのついたリソースグループに対して、読み取り専用のロックを設定しています。
#### パラメーター Param( [Parameter(Mandatory=$true)] [ValidateSet("IaaS", "PaaS")] [string] $Cloud ) #### 変数 $SubscriptionID = "xxxxxxx-xxxx-xxxxxx-xxxx-xxxxxx" ##### システム割り当てマネージド ID を使用してアクセスを認証する # https://docs.microsoft.com/ja-jp/azure/automation/enable-managed-identity-for-automation#authenticate-access-with-system-assigned-managed-identity # Ensures you do not inherit an AzContext in your runbook Disable-AzContextAutosave -Scope Process # Connect to Azure with system-assigned managed identity $AzureContext = (Connect-AzAccount -Identity).context # set and store context $AzureContext = Set-AzContext -SubscriptionId $SubscriptionID -DefaultProfile $AzureContext ##### スクリプト実行 $rgs = Get-AzResourceGroup -Tag @{ "Cloud" = $Cloud } $rgs | ForEach-Object -Parallel { New-AzResourceLock -LockName RG-ReadOnly -LockLevel ReadOnly -ResourceGroupName $_.ResourceGroupName -Force } -ThrottleLimit 4
ロックを解除する用のRunbook
ほぼ同じ作りになっています。パラメーターとしてCloud(研修種別)を受け取り、そのタグのついたリソースグループに対して、Remove-AzResourceLockでロックを削除しています。
#### パラメーター Param( [Parameter(Mandatory=$true)] [ValidateSet("IaaS", "PaaS")] [string] $Cloud ) #### 変数 $SubscriptionID = "xxxxxxx-xxxx-xxxxxx-xxxx-xxxxxx" ##### システム割り当てマネージド ID を使用してアクセスを認証する # https://docs.microsoft.com/ja-jp/azure/automation/enable-managed-identity-for-automation#authenticate-access-with-system-assigned-managed-identity # Ensures you do not inherit an AzContext in your runbook Disable-AzContextAutosave -Scope Process # Connect to Azure with system-assigned managed identity $AzureContext = (Connect-AzAccount -Identity).context # set and store context $AzureContext = Set-AzContext -SubscriptionId $SubscriptionID -DefaultProfile $AzureContext ##### スクリプト実行 $rgs = Get-AzResourceGroup -Tag @{ "Cloud" = $Cloud } $rgs | ForEach-Object -Parallel { $lockId = (Get-AzResourceLock -ResourceGroupName $_.ResourceGroupName).LockId Remove-AzResourceLock -LockId $lockId -Force } -ThrottleLimit 4
Power Automateのフローを作成する
では、これらのRunbookをPower Automateから実行できるようにしましょう。
トリガーの設定
まず、今回は任意のタイミングでの実行のみを視野に入れているので、トリガーとしては「手動でフローをトリガー」を使います。
また、研修種別とアクションが2種類ずつあり、どちらも表記ゆれがあると困るので、「手動でフローをトリガー」のオプションのドロップダウンリストで選べるようにします。
アクションによる分岐
ロックをかけるか解除するかで使用するRunbookが異なるので、アクションの入力に従って条件を分岐させます。
Azure Automationのコネクタを利用してアクションを設定する
冒頭でも書いた通り、Azure Automationのコネクタはプレミアムコネクタとなります。今回はその中から、「ジョブの作成」のアクションを利用します。
Runbookを選択すると、パラメーターとして設定していた部分は、ちゃんとPower Automateから指定できるように枠が出てきます。*1
今回はここに研修種別をセットします。
ロックを解除するケースの方も同様に設定します。
動作確認を行う
Power Automateから実行する
まずはPower Automateのテストから挙動を確認してみます。
このように、研修種別とアクションをドロップダウンリストから選べるようになっています。
Azure Automationから確認する
今回は、研修種別をPaaS、アクションをロックをかける、でテストしました。
Automationアカウントのジョブを見ると、ロック用のジョブが作成されたことが分かります。
ログや実際にリソースグループを確認すると、ロックされたことが分かります。
スマートフォンから実行する
ブラウザから実行するだけだとAzure Automationから実行してもあまり変わらないので、スマートフォンのPower Automateアプリから実行してみます。
ブラウザから実行するときと同じように、研修種別やアクションも選択できます。
おわりに
Power Automateでは直接PowerShellスクリプトの実行などは出来ないので、PowerShellスクリプトの自動実行ではAzure Automationを使っています。ただ、今回のようにAzure Automationコネクタを利用すれば、間接的にですが、Power AutomateでPowerShellを利用できるケースもあるかと思います。
Power Automateのプレミアムコネクタを必要とするので敷居が高い部分はあるのですが、よければ参考にしてください。
*1:今回はパラメーター1つだけですが、複数のパラメーターがある場合はちゃんと複数設定できます
舟越 匠(日本ビジネスシステムズ株式会社)
人材開発部に所属。社内向けの技術研修をしつつ、JBS Tech Blog編集長を兼任。2024年8月からキーマンズネットでPower Automateの連載を開始。好きなサービスはPower AutomateやLogic Apps。好きなアーティストはZABADAKとSound Horizon。
担当記事一覧