Windows Virtual Desktop の制御を Power Apps からやろうとしているので、Azure の操作を PowerShell で操作可能な Azure Automation を使ったのですが、実運用には全く耐えられないことがわかりました。
そもそも、Azure Automation はバッチ処理みたいな自動運用のためのサービスなんですよね。
なので、Azure Automation に実行要求を投げても、すぐには実行されずキュー待ちとなり、その後キューが実行されて初めて処理が実行されるのです。
早いときはそこそこ早いのですが(それでも2分ぐらい待つ)、遅いときは4~5分待つこともザラ。
ユーザー操作に対してのレスポンスがこれだと、正直使い物にならないですよね。
ですので、要求後即時実行可能で、PowerShell ができる Azure Functions for PowerShell を使ってみることにしました。
Azure Function for PowerShellを作る
ここで、ランタイムスタックを PowerShell Core に指定します。
あとは、Azure Functions を普通に作るのと一緒です。
関数の作成
関数の作成も Python などと同じです。
VS Code を環境にすることもできますし
ポータル上で直接開発することもできます
テンプレートも豊富に存在します。
仮に HTTP trigger を指定すると、以下のように自動生成されます。
using namespace System.Net
# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)
# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."
# Interact with query parameters or the body of the request.
$name = $Request.Query.Name
if (-not $name) {
$name = $Request.Body.Name
}
$body = "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
if ($name) {
$body = "Hello, $name. This HTTP triggered function executed successfully."
}
# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = [HttpStatusCode]::OK
Body = $body
})
Azure の認証
PowerShell で各種処理を行いたいときには、まずは Azure にて認証をしてあげる必要があります。
Azure Funtions には、マネージドIDを使って Azure RBAC を使用した認証を行うことができます。
デフォルトはオフになっていますので、こちらを有効化します。
あとは、操作したいリソースに対して、Azure ロールを割り当てることで、実行時に自動認証され、アクセス権が付与されます。
あとは・・・
自分の好きなように PowerShell を書いていただくことで、Azure の操作を自由に行うことができるようになります。
CI/CDももちろんできる!
デプロイセンターから様々なリポジトリを選択して、CI/CDを作ることもできます!
もちろん Azure Devops の Pipeline から、リポジトリの更新をトリガーとして、自動的にビルドされ、デプロイが完了します!
おまけ
Windows Virtual Desktop を Power Apps を使って操作することができます!
これも Azure Functions for PowerShell のおかげです。
#WVD の起動停止制御、及びセッション状態の取得を #PowerApps を使ってできるようにしたのを動画にしました!
— りなたむ MVP 🇯🇵 | Ryota Nakamura (@R_t_A_n_M) December 24, 2020
実際の操作処理を #AzureFunctions に変更したことで、かなり実用的な速度にすることができました!!
なお、Azure Functions のコードは PowerShell で作成しています!
※2.5倍速です pic.twitter.com/49NP7AMeuC