この記事は更新から24ヶ月以上経過しているため、最新の情報を別途確認することを推奨いたします。
はじめに
本記事は PowerShell を用いて仮想マシンの起動停止を行う Functions を作成します。インフラ技術者が普段使用する PowerShell を使用することで、より直感的に Functions を理解し、Automation との違いを理解することを目的とします。
流れとして、Functions リソースを作成し起動停止スクリプトを記述します。次にマネージド ID を有効にし、Functions アプリに対し仮想マシンの起動停止権限を設定します。
作成方法
では作成していきましょう。
- Azure ポータル > リソースの作成 > Functions App(関数アプリ) から作成をクリックします。
- アプリ名等を決め、ランタイムスタックに PowerShell Core を選択し作成します。
- “関数” > “追加” をクリックします。
- “Timer Trigger” をクリックします。
- 名称とスケジュールを適宜指定します。
[0 30 4 * * *] ならば毎日4:30(UTC) =13:30(JST)に実行されます。
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-timer?tabs=csharp#ncrontab-expressions - “コードとテスト” を開き、以下のコードを追記します。
# 関数定義
Function Start-VM ($ResourceGroup, $VM) {
# 起動、停止の場合は Stop-AzVM
Start-AzVM -ResourceGroupName $ResourceGroup -Name $VM
}
# ポータルのアプリケーション設定からリソースグループと仮想マシン名を取得
$rg1 = $env:RG1
$vm1 = $env:VM1
# ログ
Write-Host ("Get Environment/RG:{0},VM:{1}" -f $rg1, $vm1)
# 関数呼び出し
Start-VM $rg1 $vm1
# ログ
Write-Host ("Start VM/RG:{0},VM:{1}" -f $rg1, $vm1) - 保存をクリックします。
- 構成を開きます。
- Functions 内で使用する変数(RG1、VM1)をアプリケーション設定に追加します。”新しいアプリケーション設定” をクリックします。
※RG1:リソースグループ名、VM1:仮想マシン名です。 - 追加後、保存します。
- Functions に仮想マシン操作権限を追加するため、”ID” をクリックします。
- “システム割り当て済み” の状態を “オン” にし保存します。
- Azure AD に登録するか確認ダイアログが表示されるので “はい” をクリックします。
- リソースグループの “アクセス制御(IAM)” > “ロールの割り当て” をクリックします。
※仮想マシンが存在するリソースグループに割り当てしていますが、サブスクリプションに対して追加するとサブスクリプション全体で権限が有効になります。 - “役割” に “仮想マシン共同作成者” を選択し、”アクセスの割り当て先” に “関数アプリ” を選択します。その後作成した Functions を選択し保存します。
※システム割り当て済みがオンの Functions が表示されます。 - 作成した Functions を開き、”コードとテスト” > “テストと実行” をクリックします。
- “実行” をクリックして起動したことを確認します。
※スケジュールでも実行されます。
※アクティビティログにはイベント開始者が作成した Functions 名として記録されています。
以上で完了です。
まとめ・Functions の強み
いかがでしょうか。
マネージド ID を使用することで、非常に少ないスクリプト量で仮想マシンの操作が可能なことがお分かり頂けたかと思います。また、仮想マシンだけではなくその他の様々な PowerShell Core コマンドも使用可能です。
Functions と Automation は似ており、実行可能な処理が重複していますが Functions のメリットデメリットをまとめてみます。
メリットとしては
- PowerShell Core 以外に C# や Javascript でも記述可能
https://docs.microsoft.com/ja-jp/azure/azure-functions/supported-languages - 様々なトリガー・バインドがある
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-triggers-bindings - Httpトリガーで実行結果を返却できる
→Automation は Webhook で実行することは出来ますが実行結果は分かりません - マネージド ID を使用することで、認証情報を不要にすることが出来る
→Automation は証明書の更新が発生します
デメリットとしては
- PowerShell は PowerShell Core のみ対応
- スケジュールの作成が cron で分かりにくい
- Automation は課金アカウント毎に500分まで無料
→Functions も無料分がありますが、分かりにくいです
といった点があります。
取っつきにくいと思われがちな Functions ですが、この記事を見て使ってみたいという原動力になりましたら幸いです。
参考URL
・仮想マシン管理 PowerShell コマンド
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/ps-common-ref
・Azure serverless community library
https://www.serverlesslibrary.net/?technology=Functions%202.x&language=PowerShell