この記事は更新から24ヶ月以上経過しているため、最新の情報を別途確認することを推奨いたします。
パーソルプロセス&テクノロジーの佐藤です。
弊ブログでも何度かAzure Automationのソリューションをご紹介してきたように、Azure Automationを自社のAzure運用に取り入れているお客様は多いと思いますが、それらの多くはおそらくAzure Automationの通常の実行環境を利用するものではないでしょうか。
ご存じの方も多いかと思いますが、Azure Automationはその標準の実行環境では機能にいくつかの制限があります。
本稿ではその課題を解決するHybrid Runbook Workerという機能とその利用方法を実践的にご紹介します。
概要
Hybrid Runbook Worker はAzure Automationの機能であり、
これを用いてオンプレミスや他のクラウド環境上のコンピューターでRunbookを直接実行することができます。
通常、Azure Automation RunbookはAzure クラウド プラットフォーム(=Azure サンドボックス)で実行されるため、他のクラウドやオンプレミス環境のリソースにはアクセスできない場合があります。
Hybrid Runbook Workerを用いて同環境上のコンピューターからRunbookを実行することで、通常Azure からはアクセスできないローカルリソースを管理することができます。
Hybrid Runbook Workerでは、RunbookがAzure Automationで管理され、
Hybrid Runbook Worker機能をホストするコンピューターに配信された後に実行されます。
各Hybrid Runbook WorkerはHybrid Runbook Workerグループに所属し、このグループがRunbookに対し割り当てられます。
Hybrid Runbook Workerは現行の殆どのWindows , Linux OS をサポートしています。
(Azure AutomationってPowershell 用のサービスなのにLinux?と思われる方もいらっしゃるかもしれませんが、実はAzure AutomationはPythonにも対応しているためLinuxでも利用可能です。)
以下にHybrid Runbook Workerの概要図を記載します。
Hybrid Runbook Workerの利用推奨ケース
Hybrid Runbook Workerは以下のようなケースで効果を発揮します。
- ローカルリソースに関係するスクリプトを実行する
概要で記述したように、Azureからはアクセスできないリソースを管理することができます。
- 実行時間が長いスクリプト、
リソースを大量に消費するスクリプトを実行する
通常の実行環境でのRunbook実行には実行時間の、およびリソースの制限がありますが、
この制限はHybrid Runbook Workerには適用されません。
参考:Microsoft Docs-Azureサブスクリプションの制限とクォータ -Automationの制限
- サードパーティのソフトウェア、
特定の要件を持つモジュールに依存したスクリプトを実行する
任意のソフトウェアやモジュールをインストールしたコンピューター上でRunbookを実行することができます。
- 昇格が必要なスクリプトを実行する
通常の実行環境では昇格は許可されませんが、Hybrid Runbook Workerではコマンドによってこれを回避することができます。
このように、Hybrid Runbook Workerは通常のAzure Automation実行環境では手の届かない範囲・規模のスクリプトに対応できます。
一方で、コストを最小限に抑えたいときやAzure リソースの最適な管理に主眼を置く場合は通常の実行環境に軍配が上がるため、
目的に応じて使い分けるのが良いでしょう。
デプロイ
以下、Windows Hybrid Runbook Worker の構成手順を記載します。
ネットワーク
Hybrid Runbook Workerの動作には以下のURLへの通信が必要です。なお、必要なポートはTCP 443のみです。
- *.azure-automation.net
- https://<workspaceId>.agentsvc.azure-automation.net
- *.ods.opinsights.azure.com
- *.oms.opinsights.azure.com
- *.blob.core.windows.net
Log Analytics ワークスペース
Hybrid Runbook Workerの作成には、Automation アカウントにリンクされたLog Analytics ワークスペースとそのエージェントが必要です。
Log Analyticsワークスペースに依存してHybrid Runbook Worker機能がインストール・構成されます。
なお、Log Analytics ワークスペースの作成とエージェントのインストールは自動デプロイの手順でまとめて行うことができるので事前に作成していなくても問題ありません。
Windows Hybrid Runbook Workerインストール
Windows Hybrid Runbook Workerのインストールと構成にはいくつかの方法があります。
大まかなステップとしては、仮想マシン拡張機能などでLog Analyticsエージェントをインストールしてワークスペースに登録し、Hybrid Runbook Worker グループにマシンを登録するというものになります。
手動で行うこともできますが、これらを含めた必要なすべての手順を自動で実行するPowershell スクリプトを用いることが可能です。
Hybrid Runbook Workerとして登録するマシン上で、以下のコマンドでPowershell ギャラリーからスクリプトをインストールします。
Install-Script -Name New-OnPremiseHybridWorker
インストールした場所に移動し、以下のコマンドでスクリプトを実行します。
実行時にAzure認証が要求されるので、サブスクリプション共同作成者以上の権限を持つアカウントでサインインします。。
.\New-OnPremiseHybridWorker.ps1
-AutomationAccountName <Automationアカウント名>
-AAResourceGroupName <Automationアカウントのリソースグループ>
-OMSResourceGroupName <Log Analyticsワークスペースのリソースグループ>
-WorkspaceName <Log Analyticsワークスペース名>
-HybridGroupName <作成するHybrid Runbook Workspace名>
-SubscriptionID <サブスクリプションID>
このスクリプトによって以下の処理が自動で実行されます。
- 必要なモジュールのインストール
- Log Analyticsワークスペースの作成 (※指定のリソースが存在しない場合)
- ワークスペースとAutomationアカウントのリンク
- Log Analyticsエージェントのインストール
- Hybrid Runbook Workerグループの作成(※指定のグループが存在しない場合)とマシンの登録
スクリプトの処理が完了すると、AutomationアカウントにHybrid Worker グループが作成され、Workerとしてマシンが登録されます。
下記画像ではHybrid Group Test01というHybrid Worker GroupにADDSというマシンがWorkerとして登録されていることがわかります。
テスト
テストとして、ユーザ名とホスト名を取得する簡単なRunbookをAutomation上で作成して実行してみます。
$who = whoami
write-output ("I am $who")
$hostname = hostname
write-output("This is $hostname")
Runbookの開始画面でハイブリッド Workerを選択し、作成したハイブリッド Workerグループを選択して実行します。
結果の出力を見ると、ホスト名にWorkerのマシン名が、ユーザーとしてローカルのシステムアカウントが表示され、Hybrid Runbook Workerが正常に動作していることがわかります。
また、実行対象をハイブリッドWorkerではなくAzureに設定し実行した場合、下記画像のようにユーザーとホストは空白になることがわかります。
Runbook例:ユーザー作成&Azure ADコネクト同期
さて、これでHybrid Runbookが使えるようになったので、実用的な使い方を考えてみましょう。
Hybrid Runbookの強みは、サーバーに入ることなくAzureからローカルの資産・リソースにアクセスできることです。
例えばADDSサーバーでのユーザー作成、そしてAzure ADコネクトサーバーでのADコネクト同期実施をAzure上で完結させることができます。
ADコネクト同期は多くの方がデフォルトの30分周期の自動実行を設定しているので需要は薄いかもしれませんが、Hybrid Azure AD Joinを構成したい場合など、同期が走るまで30分も待ってらんないよ!というときにAzure Portalから同期が実行できれば便利ですよね。
ではRunbookを作成していきましょう。
Runbookの作成・インポート
テストではAutomationからRunbookを作成しましたが、
実運用ではWorkerのマシン上で.ps1ファイルを作成・テストしてAzure AutomationにRunbookとしてインポートします。
Runbookのインポートには以下のPowershell コマンドを実行します。
$AAccountName = "<Automationアカウント名>"
$runbookName = "<作成するRunbook名>"
$scriptPath = "<.ps1ファイルのパス>"
$RGName = "<Automationアカウントのリソースグループ>"
Import-AzAutomationRunbook
-Name $runbookName -Path $scriptPath
-ResourceGroupName $RGName -AutomationAccountName $AAcountName
-Type Powershell -Force
例:ユーザー作成Runbook
Param(
[parameter(mandatory=$true)][string]$username,
[parameter(mandatory=$true)][string]$password
)
Start-Transcript C:\Temp\RunbookLog.txt
$pwd = ConvertTo-SecureString $password -AsPlainText -Force
New-ADUser -Name $username -Enabled $true -AccountPassword $pwd
Stop-Transcript
Get-Content "C:\Temp\RunbookLog.txt"
例:Azure AD コネクト同期Runbook
Start-Transcript C:\Temp\RunbookLog.txt
Start-ADSyncSyncCycle -PolicyType Delta
Stop-Transcript
Get-Content "C:\Temp\RunbookLog.txt"
実行
テストでも既に触れましたが、Hybrid Runbookの実行はPowershell あるいはAzure Portalから、オプションにおいてHybrid Worker Groupを指定して行います。
Powershell の場合はRunOnオプションを用いて以下のようにコマンドレットを実行します。
Start-AzAutomationRunbook
-AutomationAccountName <AutoAcountName>
-Name <RunbookName>
-RunOn <HybridGroupName>
Azure PortalではRunbookの開始画面あるいはスケジュール設定画面において実行設定を[ハイブリッドWorker]にセットし、プルダウンからHybrid Worker Groupを指定します。
また、Hybrid Runbookに限ったことではないですが、Runbookの冒頭にparam($username) のようにパラメータを設定することで、
Runbook内の引数をこの開始画面から渡すことができます。
Runbookの実行後、Azure ADのログを見ると、ADDSで作成されたユーザーがAzure ADユーザーとして正しく同期されていることがわかります。
AzureリソースへのRunbook認証
Hybrid Runbook WorkerからAzure リソースを管理する場合はRunbook内で認証の手段を用意する必要があります。
これにはAutomation実行アカウント証明書のほか、AzureリソースのマネージドIDを使用することができます。
構成手順は割愛しますが、マネージドIDをWorkerマシンに登録してConnect-AzAccountコマンドレットと-Identityパラメータを使用することで、
コード内に資格情報を格納せずにRunbook認証を構成することができます。
Runbookへの署名
これまではHybrid Runbook Workerに対し、作成したRunbookを自由に発行してきましたが、この構成では不意の、あるいは悪意のある処理がローカル環境に対し実行される恐れがあります。
これを防ぐため、Hybrid Runbook Workerは自身が署名したRunbookにのみ配信を許可するよう構成することが可能です。
署名を検証するようWorkerを構成し、自己署名証明書を作成してインポートしてRunbookに署名するスクリプトがMicrosoftから公開されています。
# Create a self-signed certificate that can be used for code signing
$SigningCert = New-SelfSignedCertificate -CertStoreLocation cert:\LocalMachine\my `
-Subject "CN=contoso.com" `
-KeyAlgorithm RSA `
-KeyLength 2048 `
-Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" `
-KeyExportPolicy Exportable `
-KeyUsage DigitalSignature `
-Type CodeSigningCert
# Export the certificate so that it can be imported to the hybrid workers
Export-Certificate -Cert $SigningCert -FilePath .\hybridworkersigningcertificate.cer
# Import the certificate into the trusted root store so the certificate chain can be validated
Import-Certificate -FilePath .\hybridworkersigningcertificate.cer -CertStoreLocation Cert:\LocalMachine\Root
# Install the certificate into a location that will be used for validation.
Import-Certificate -FilePath .\hybridworkersigningcertificate.cer -CertStoreLocation Cert:\LocalMachine\AutomationHybridStore
# Configure the hybrid worker to use signature validation on runbooks.
Set-HybridRunbookWorkerSignatureValidation -Enable $true -TrustedCertStoreLocation "Cert:\LocalMachine\AutomationHybridStore"
# Retrieve the thumbprint for later use
$SigningCert.Thumbprint
Microsoft Docs- Windows Hybrid Runbook Worker での署名済み Runbook の使用
$SigningCert = ( Get-ChildItem -Path cert:\LocalMachine\My\<CertificateThumbprint>)
Set-AuthenticodeSignature .\TestRunbook.ps1 -Certificate $SigningCert
Runbookへの署名が完了したらAutomationにインポートし、発行します。
インポートされたRunbookには下記画像のように署名ブロックが挿入され、署名のないRunbookの実行は失敗するようになります。
まとめ
以上、Hybrid Runbook Workerの概要とその使用例をご紹介しました。
Hybrid Runbook Workerによって、通常のAzure Automation実行環境ではできなかった処理を実装することができます。
Invoke-Commandコマンドレットを利用してAutomation からローカル環境にリモートバッチを適用したり、 WebhookとLogic Appを用いて運用に合わせたトリガーを構成するなど、Hybrid Runbookの応用の幅はとても広く考えられます。
本稿が皆様のインフラストラクチャ運用の一助になれば幸いです。