Azモジュールを使ったAzure Automation Runbookの記述方法


はじめに

これからAzure AutomationでPowershellスクリプトを作るにあたって、AzureRM系列のモジュールが2020年で更新停止となり、AzureAz系列のモジュールをこれから使ってください。とのアナウンスがあったのでAzを使ってスクリプトを作ろうとしたらサンプルスクリプトは無いわ、モジュールは入ってないわで2019/11現在で一工夫しないと使えない状態だったのでAzで使える方法を確認しました。
もしかしたらすぐグローバルモジュールがRMからAzに切り替わるかも知れないですが、過渡期の手順として残しておきます。
参考文献:
MS:Azure Automation での Az モジュールのサポート
MS:最初の PowerShell Workflow Runbook

0. 環境準備

現時点ではAutomation RunbookにはデフォルトでAzのモジュールが入っていないので追加で投入する必要があります。
参考文献に記載の通り、Az.AccountsとAz.Automationは最初に投入が必要なので以下で投入します。 その後、スクリプト作成に必要な各モジュール類(Az.Sql等)を任意で投入します。
※スクリプト本文中でダウンロードしてくる形でスクリプト記載する方は不要と思います。

Automationアカウントリソースメニューから「モジュールギャラリー」を選択すると、モジュールをアカウントに対してインポートできます。
(Powershellギャラリーからでもインポートできます。

1. Azureへの接続文

Automationからリソース管理をする場合は、スクリプト文内でAzureへAutomationアカウントで接続する必要があります。 Azでこの部分を以下のように記載します。
Azモジュールの場合は、「Connect-AzAccount」が接続用のコマンドになります。
また、最後にコンテキストに認証情報をオブジェクトに格納しておき、以降のコマンドにコンテキスト引数として利用します。

AutomationConnect.ps1
# Automationアカウントの接続名(既定名の場合)
$connectionName = "AzureRunAsConnection"

# AzureRMContextでセッションが残っているとAzコマンドが使えないため念の為セッション継続を無効にしておく
Disable-AzContextAutosave Scope Process

$conn = Get-AutomationConnection -Name $connectionName
Connect-AzAccount -ServicePrincipal -Tenant $conn.TenantID `
-ApplicationId $conn.ApplicationID -CertificateThumbprint $conn.CertificateThumbprint

$AzureContext = Select-AzSubscription -SubscriptionId $conn.SubscriptionID

※「Disable-AzContextAutosave」はMSのサンプルスクリプトにも記載があったのでオマジナイ代わりではありますが、RM系のモジュールで作ったセッションが残った状態でAz系のモジュールを動かすとエラーが発生(逆の場合でも)する為、要件が無ければ念の為記載した方が良いかと思います。

2. 認証情報の差し込み方

1.で作成した認証情報はAzコマンドの引数として以下のように差し込みます。
例はNew-AzSqlServerです。

Create_SQLServer.ps1
$server = New-AzSqlServer -ResourceGroupName $resourceGroupName `
   -ServerName $serverName `
   -Location $location `
   -SqlAdministratorCredentials $cred `
   -AzContext $AzureContext

一番下に指定してある引数「-AzContext」でコンテキストの認証情報を差し込みます。
面倒ですがコマンド毎引数を指定して差し込む必要があります。
※AzContextのデフォルト値を指定する方法が別途あるのかもしれませんが

おわりに

Automationのアカウント設定から環境準備まで長かった。。。
これでやっとAutomationで諸々のスクリプトを実装する準備が整いました。
これから暫くSQLServerのリソースリストア用、DBバックアップ、DBリストアなど
非機能要件周りのコマンドを弄っていきたいと思います。