【Azure】Automation RunbookにGitHub上のPowerShellスクリプトをインポートする(ARMテンプレート編):Tech TIPS
Azure Automationアカウントをデプロイする場合、一緒に自動処理のためのPowerShellスクリプトもRunbookに自動登録できると手間が省けて便利だ。GitHubで公開されている仮想マシンの起動/シャットダウン用スクリプトを例に、その方法と注意点を説明する。
対象:Azure Automation、Runbook、ARMテンプレート(Bicep)
Azure上での各種自動化のためのサービス「Azure Automation」では通常、一定の操作を実行するPowerShellスクリプトを、Automationアカウントの「Runbook」として登録して利用する。
そのPowerShellスクリプトはGitHub上で多数公開されているため、自分のニーズに合致したスクリプトさえ見つかれば、いちいちスクリプトを書くことなく簡単に自動化を実現できる。
もしAzureのリソースをARM(Azure Resource Manager)テンプレートでデプロイしているなら、Automationアカウントをデプロイする際、必要なPowerShellスクリプトのインポート(登録)も同時に行いたくなるだろう。
本Tech TIPSでは、Automationアカウントを作ったことがある人を対象として、デプロイと同時にスクリプトもインポートする方法および注意点を説明する。ARMテンプレートの記述にはBicepを利用する。
対象のPowerShellスクリプトはインターネット上に一般公開されていて、そのURLさえ取得できれば特に制限なくダウンロードできるものとする。そのPowerShellスクリプトはデプロイ時に直接ダウンロードするので、格納用のAzure Storageをいちいち用意する必要はない。その一方で、未テストの新バージョンのスクリプトが再デプロイ時に自動でインポートされる恐れがある点には十分な注意が必要だ。
例として用いるのは、「Simple-Azure-VM-Start-Stop」というAzure上の仮想マシンを起動またはシャットダウンするためのスクリプトだ。もちろんRunbookに対応している。
■執筆時の各種ツール/APIのバージョン
- Azure CLI: Ver. 2.60.0
- Bicep CLI: Ver. 0.27.1
- Bicepでのデプロイ時のAPIバージョン: 2023-11-01(Automationアカウント)
インポートしたいPowerShellスクリプトのダウンロードURLを取得する
一般に公開されているRunbook向けのPowerShellスクリプトをデプロイ時に自動でインポートするには、そのスクリプトを直接ダウンロードできるURLを事前に確認しておく必要がある。
それには、Azureポータルで既存のAutomationアカウントを開き、以下のように操作する(WebブラウザはGoogle Chrome)。
■操作手順
- 仮作成しておいたAutomationアカウントをAzureポータルで開く
- 左側メニューの[プロセスオートメーション]−[Runbook]をクリック
- 右ペインの上部バーにある[+ 作成]をクリック
- Runbookの作成ウィザードが表示されたら、「Runbook」欄の[ギャラリーで参照]ラジオボタンを選択
- 「Runbookファイル」欄の[ギャラリーで参照するには、ここをクリックします]をクリック
- 「タイプ」欄で[PowerShellスクリプト]を選択
- 公開されているRunbook向けスクリプトの一覧ページが表示されるので、インポートしたいスクリプトの名称や機能などを検索窓に入力して検索
- 見つかったスクリプトの欄をクリック
- クリックしたスクリプトの詳細ページが表示されたら、スクリプトのコード欄の左上にある[ソースプロジェクトの表示]をクリック
- 選択したスクリプトが配布されているGitHub内のページが新たなタブに表示されるので、利用規約などを確認してから、インポートしたいスクリプト本体のファイルを見つけて、そのリンクをクリック
- スクリプトのコード欄の右上にある[Raw]をクリック
- スクリプトのコードそのものが表示されたら、アドレスバー(オムニボックス)内のURLを全選択してから右クリック
- 表示されたメニューで[コピー]をクリックしてURLをクリップボードにコピーする。さらにクリップボードからメモ帳などにペーストするなどして、別途URLをメモしておく
デプロイ時にPowerShellスクリプトをRunbookにインポートする
PowerShellスクリプトをAutomationアカウントのRunbookとして組み込むには、そのためのリソースを生成する必要がある。その際、公開されているPowerShellスクリプトをインポートするには、以下のようにARMテンプレートを記述する。
// ファイル: main.bicep(1/2)
param location string = resourceGroup().location
// インポートするRunbook用スクリプトの一覧
var runbooks = {
// https://github.com/diecknet/Simple-Azure-VM-Start-Stop
startStopVM: {
// ↑配列ではなくオブジェクトにしているのは、ジョブスケジュールから
// このキーでRunbookを特定して参照する必要があるため(詳細は別記事で解説)
name: 'Simple-Azure-VM-Start-Stop' // 識別しやすい名称を付ける
description: 'Start or Stop the specified VM.' // 説明
runbookType: 'PowerShell' // これはPowerShell 5.1の場合
// ↑PowerShell 7.2なら「PowerShell72」
publishContentLink: {
uri: 'https://raw.githubusercontent.com/diecknet/Simple-Azure-VM-Start-Stop/main/SimpleAzureVMStartStop.ps1'
// ↑スクリプトのダウンロードURL
}
}
}
// リソース生成: Runbooks
resource automationRunbook 'Microsoft.Automation/automationAccounts/runbooks@2023-11-01' = [
for runbook in items(runbooks): {
parent: automationAccount // 親リソースのAutomationアカウント
location: location
name: runbook.value.name // 「.value」でオブジェクトの値を参照
properties: {
description: runbook.value.description
runbookType: runbook.value.runbookType
publishContentLink: runbook.value.publishContentLink
}
}
]
※Microsoftのレファレンス:Microsoft.Automation/automationAccounts/runbooks、for、items()
前述の手順で取得したスクリプトのダウンロードURLは、変数「runbookType」の各値の「properties.publishContentLink」に指定する。
インポートするスクリプトをPowerShell 5.1で実行する場合は「properties.runbookType」に「PowerShell」を指定する。一方、PowerShell 7.2が必須の場合は、代わりに「PowerShell72」を指定すること。
上記コードでは、変数「runbooks」に複数のPowerShellスクリプトの情報をまとめることで、全て一緒に登録できるようにしている。その「runbooks」を配列ではなくオブジェクトで表現しているのは、キー名で特定のRunbookを参照できるようにするためだ。これは定期実行のスケジュールを組む際に必要となる。その具体例はTech TIPS「【Azure】AutomationアカウントでVMの起動/停止を定期的に繰り返すスケジュールを組む(ARMテンプレート編)」に記している。
Runbookリソースの親となるAutomationアカウントのリソース生成についても、以下にARMテンプレートの例を記しておく。ただし、実際にVMの起動/シャットダウンを実行するには、下記のコード以外に「アクセス許可」などに関するコードも記述する必要がある(後述)。
// ファイル: main.bicep(2/2)
param automationAccountName string // Automationアカウントのリソース名
param publicNetworkAccess bool = true // パブリックネットワークからのアクセスの可否
param disableLocalAuth bool = false // ローカル認証の可否
var identity = {
type: 'SystemAssigned' // マネージドID: システム割り当て
}
var sku = {
name: 'Basic' // SKU: Basic
}
var encryption = {
keySource: 'Microsoft.Automation' // 暗号化: デフォルトのまま
identity: {}
}
// リソース生成: Automationアカウント
resource automationAccount 'Microsoft.Automation/automationAccounts@2023-11-01' = {
name: automationAccountName
location: location
identity: identity
properties: {
publicNetworkAccess: publicNetworkAccess
disableLocalAuth: disableLocalAuth
sku: sku
encryption: encryption
}
}
※Microsoftのレファレンス:Microsoft.Automation/automationAccounts
「identityType」では、AutomationアカウントのマネージドIDを有効化している。これは、Runbookに登録(インポート)したスクリプトからAzure上のリソースを操作するのに必要となる。また、そのリソース操作の権限(アクセス許可)をロール(役割)としてAutomationアカウントに割り当てるためのリソース生成も必要になる。詳細はTech TIPS「【Azure】VMの起動/シャットダウンができるカスタムロールを割り当てつつAutomationをデプロイ(ARMテンプレート編)」を参照していただきたい。
上記コードでAutomationアカウントをデプロイすると、指定のスクリプトがインポートされたRunbookの作成状態は自動的に「発行済み」に変わるため、そのままスケジュールに組み込み可能だ。
■関連リンク
- Resource Managerテンプレートを使用してAzure Automationアカウントを作成する(Microsoft Learn)
- PowerShellギャラリーのAzure Automation Runbookとモジュールを使用する(Microsoft Learn)
■更新履歴
【2024/05/15】AzureポータルのUI変更にともない、スクリーンショットを更新しました。他のAutomationアカウントのTech TIPSとARMテンプレートのコードを揃えました。
【2024/05/01】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.