SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Azure Automation で PowerShell Runbook を作成する際の覚書 (2020/4 版)

without comments

Azure 上で、PowerShell を実行する場合、Function App を使用して書いてしまうことが多いのですが、実行時間やスケジュール設定の GUI 視認性 (cron 形式ではないスケジューリングの設定) などで、Azure Automation の PowerShell Runbook を使用してスクリプトを実行するケースもあるかと思います。

どうやって使ったかというのを忘れることがしばしばあるので、この機会にまとめておこうかと。

Azure 実行アカウントの作成

Automation アカウントを作成する際には、「Azure 実行アカウントの作成」という設定があります。

image

Azure 実行アカウントについては後からも作成することができるので、Automation アカウントを作成する際に必須で作らなくてはいけないということはありません。

image

Azure 実行アカウントとは何者かというと、後から作成する際の次のメッセージが内容を示しています。

image

実行アカウントを作成すると、Azure AD の「アプリの登録」→「全てのアプリケーション」に次にようなサービスプリンシパルが登録されます。

image

このサービスプリンシパルには、証明書が設定されており、ポータルから作成した場合の証明書の有効期間は 1 年間となっていますので、必要に応じて証明書のメンテナンスを検討しておきます。

実行アカウントは Azure のサブスクリプションに対して、「共同作成者 (Contributor)」の権限が設定されますので、サブスクリプションに対しての各種操作を実行アカウントの資格情報を使用することで実施することができるようになります。

image

作成された実行アカウントの情報については、Automation の共有リソース (資産) の「接続」に「AzureRunAsConnection」として登録が行われています。

image

接続時の情報は、次のようなスクリプトで Runbook からアクセスすることができますので、Azure に対しての操作を実行したい場合には Azure Automation の「接続」の情報から実行アカウントの権限を利用して、サブスクリプションに対しての各種操作を行うことができます。

$connectionName = "AzureRunAsConnection"
try
{
    # Get the connection "AzureRunAsConnection "
    $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName         

    "Logging in to Azure..."
    Add-AzureRmAccount `
        -ServicePrincipal `
        -TenantId $servicePrincipalConnection.TenantId `
        -ApplicationId $servicePrincipalConnection.ApplicationId `
        -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 
}

 

Azure 実行アカウントは必ず作成する必要はあるか?

Azure のリソースに対しての各種操作を実行する場合は、実行アカウント経由でのアクセスが一般的かと思いますが、「SQL Database に対して、SQL Server 認証により接続を行い、定期的にクエリを実行したい」というような、ジョブスケジューラーのように使用する場合には、SQL Server 認証の接続文字列があれば、処理を実行することができます。

Azure Automation は PowerShell 5.1 が使用可能な Windows 環境ですので、多少の処理であれば .NET のライブラリを使用しながら組むこともできますので。

$conString = Get-AutomationVariable -Name 'SQLConnectionString'
$con = New-Object System.Data.SqlClient.SqlConnection($conString)
$con.Open()
$cmd = $con.CreateCommand()
$cmd.CommandTimeout=0
$cmd.CommandText = "SELECT @@VERSION"
$reader = $cmd.ExecuteReader()
$reader.Read()
$reader[0]
$con.Close()
$con.Dispose()

 

Azure Automation に標準で含まれているモジュールのバージョン

Azure Automation に標準で含まれているモジュールのバージョンですが、既定のモジュール にどのようなモジュールが含まれているか記載されていますが、割と古めです。

image

モジュールの更新方法ですが、Azure Automation の Azure PowerShell モジュールを更新する方法 で解説されている Updating Azure PowerShell modules in Azure Automation accounts を使用することでアップデートできます。

標準環境では、AzureRM モジュールが導入されていますが、Az モジュールをインストールすることもできます。

 

エラートラップ

サンプルの Runbook で try – catch ブロックが設定されているように、Runbook の実行が失敗した場合にエラーとしたいは実行が失敗したら、ジョブの状態が「失敗」(エラー) となるかどうかを確認しておきます。

「$ErrorActionPreference = "Stop"」をつけたり、サンプルの Runbook のように Exception を Throw するようにして、ジョブの状態が「完了」ではなく「失敗」になることを見ておくとよいかと。

catch {
    if (!$servicePrincipalConnection)
    {
        $ErrorMessage = "Connection $connectionName not found."
        throw $ErrorMessage
    } else{
        Write-Error -Message $_.Exception
        throw $_.Exception
    }
}

Written by Masayuki.Ozawa

4月 15th, 2020 at 11:23 pm

Leave a Reply