Azure Automation で Runbook を管理する

Azure Automation には、新しい Runbook を作成するか、ファイルまたは Runbook ギャラリーから既存の Runbook をインポートすることによって Runbook を追加することができます。 この記事では、Runbook の管理に関する情報と、Runbook の設計に関する推奨パターンとベスト プラクティスについて説明します。 コミュニティによって提供されている Runbook やモジュールの利用について詳しくは、Azure Automation 用の Runbook ギャラリーとモジュール ギャラリーに関するページを参照してください。

Runbook を作成する

Azure portal または PowerShell を使用して、Azure Automation に新しい Runbook を作成します。 作成した Runbook は、次の情報を使用して編集できます。

Azure portal で Runbook を作成する

  1. Azure Portal にサインインします。
  2. Automation アカウントを検索して選択します。
  3. [Automation アカウント] ページで、一覧からお使いの Automation アカウントを選択します。
  4. Automation アカウントで [プロセス オートメーション][Runbook] を選択し、Runbook の一覧を開きます。
  5. [Runbook の作成] をクリックします。
    1. Runbook に名前を付けます。
    2. [Runbook の種類] ドロップダウンから 種類を選択します。 Runbook 名は、先頭を英字にする必要があり、英字、数字、アンダースコア、ダッシュを使用できます
    3. [ランタイム バージョン] を選択します
    4. 該当する [説明] を入力します
  6. [作成] をクリックして、Runbook を作成します。

PowerShell で Runbook を作成する

空の Runbook を作成するには、New-AzAutomationRunbook コマンドレットを使用します。 Type パラメーターを使用して、New-AzAutomationRunbook に対して定義されている Runbook の種類の 1 つを指定します。

次の例は、新しい空の Runbook を作成する方法を示しています。

$params = @{
    AutomationAccountName = 'MyAutomationAccount'
    Name                  = 'NewRunbook'
    ResourceGroupName     = 'MyResourceGroup'
    Type                  = 'PowerShell'
}
New-AzAutomationRunbook @params

Runbook をインポートする

PowerShell または PowerShell ワークフロー ( .ps1) スクリプト、グラフィカル Runbook ( .graphrunbook)、Python 2 または Python 3 スクリプト ( .py) をインポートして独自の Runbook を作成することができます。 インポート時に作成される Runbook の種類を指定します。その際、次のことを考慮します。

  • ワークフローが含まれていない .ps1 ファイルは、PowerShell Runbook または PowerShell ワークフロー Runbook のどちらにもインポートすることができます。 それを PowerShell ワークフロー Runbook にインポートすると、ワークフローに変換されます。 この場合、Runbook には、加えられた変更を説明するコメントが追加されます。

  • PowerShell ワークフローを含む .ps1 ファイルは、PowerShell ワークフロー Runbook にのみインポートできます。 ファイルに複数の PowerShell ワークフローが含まれている場合、インポートは失敗します。 各ワークフローを個別のファイルに保存し、それぞれを個別にインポートする必要があります。

  • PowerShell ワークフローを含む .ps1 ファイルは PowerShell スクリプト エンジンでは認識できないため、PowerShell Runbook にインポートしないでください。

  • .graphrunbook ファイルは、新しいグラフィカル Runbook にのみインポートします。

Azure portal から Runbook をインポートする

次の手順を使用して、スクリプト ファイルを Azure Automation にインポートできます。

Note

このポータルを使用して PowerShell ワークフロー Runbook にインポートできるのは .ps1 ファイルだけです。

  1. Azure portal で [Automation アカウント] を検索して選択します。
  2. [Automation アカウント] ページで、一覧からお使いの Automation アカウントを選択します。
  3. Automation アカウントで [プロセス オートメーション][Runbook] を選択し、Runbook の一覧を開きます。
  4. [Runbook のインポート] をクリックします。 次のいずれかのオプションを選択できます。
    1. [ファイルの参照] - ローカル コンピューターからファイルを選択します。
    2. [ギャラリーで参照] - ギャラリーから既存の Runbook を参照して選択できます。
  5. ファイルを選択します。
  6. [名前] フィールドが有効になっている場合は、必要に応じて Runbook 名を変更することができます。 名前は文字で始める必要があり、文字、数字、アンダースコア、およびダッシュを含めることができます。
  7. [Runbook の種類] は自動的に設定されますが、該当する制限を考慮して種類を変更することもできます。
  8. [ランタイム バージョン] は、自動的に設定されるか、またはドロップダウン リストからバージョンを選択します。
  9. [インポート] をクリックします。 Automation アカウントの Runbook の一覧に新しい Runbook が表示されます。
  10. 実行する Runbook は前もって発行しておく必要があります。

Note

グラフィカル Runbook は、インポート後、他の種類に変換することができます。 ただし、グラフィカル Runbook をテキスト形式の Runbook に変換することはできません。

PowerShell で Runbook をインポートする

Runbook のドラフトとしてスクリプト ファイルをインポートするには、Import-AzAutomationRunbook コマンドレットを使用します。 Runbook が既に存在する場合、コマンドレットで Force パラメーターを使用しないと、インポートは失敗します。

次の例では、スクリプト ファイルを Runbook にインポートする方法を示します。

$params = @{
    AutomationAccountName = 'MyAutomationAccount'
    Name                  = 'Sample_TestRunbook'
    ResourceGroupName     = 'MyResourceGroup'
    Type                  = 'PowerShell'
    Path                  = 'C:\Runbooks\Sample_TestRunbook.ps1'
}
Import-AzAutomationRunbook @params

リソースを処理する

Runbook でリソースを作成する場合、リソースの作成を試みる前に、リソースが既に存在するかどうかをスクリプトで確認する必要があります。 基本的な例を次に示します。

$vmName = 'WindowsVM1'
$rgName = 'MyResourceGroup'
$myCred = Get-AutomationPSCredential 'MyCredential'

$vmExists = Get-AzResource -Name $vmName -ResourceGroupName $rgName
if (-not $vmExists) {
    Write-Output "VM $vmName does not exist, creating"
    New-AzVM -Name $vmName -ResourceGroupName $rgName -Credential $myCred
} else {
    Write-Output "VM $vmName already exists, skipping"
}

アクティビティ ログから詳細を取得する

Runbook を開始したユーザーやアカウントなど、Runbook に関する詳細を、Automation アカウントのアクティビティ ログから取得できます。 次の PowerShell の例では、指定した Runbook を最後に実行したユーザーが提供されます。

$rgName = 'MyResourceGroup'
$accountName = 'MyAutomationAccount'
$runbookName = 'MyRunbook'
$startTime = (Get-Date).AddDays(-1)

$params = @{
    ResourceGroupName = $rgName
    StartTime         = $startTime
}
$JobActivityLogs = (Get-AzLog @params).Where( { $_.Authorization.Action -eq 'Microsoft.Automation/automationAccounts/jobs/write' })

$JobInfo = @{}
foreach ($log in $JobActivityLogs) {
    # Get job resource
    $JobResource = Get-AzResource -ResourceId $log.ResourceId

    if ($null -eq $JobInfo[$log.SubmissionTimestamp] -and $JobResource.Properties.Runbook.Name -eq $runbookName) {
        # Get runbook
        $jobParams = @{
            ResourceGroupName     = $rgName
            AutomationAccountName = $accountName
            Id                    = $JobResource.Properties.JobId
        }
        $Runbook = Get-AzAutomationJob @jobParams | Where-Object RunbookName -EQ $runbookName

        # Add job information to hashtable
        $JobInfo.Add($log.SubmissionTimestamp, @($Runbook.RunbookName, $Log.Caller, $JobResource.Properties.jobId))
    }
}
$JobInfo.GetEnumerator() | Sort-Object Key -Descending | Select-Object -First 1

進捗状況の追跡

簡単に再利用や再起動ができるロジックを使用したモジュールの形式で Runbook を作成することをお勧めします。 問題が発生しても、Runbook の進行状況が追跡されていれば、Runbook のロジックを正常に実行することができます。

Runbook の進行状況は、ストレージ アカウント、データベース、ファイル共有などの外部ソースを使用して追跡できます。 最後に実行されたアクションの状態をまずチェックするロジックを、Runbook に作成します。 その後、チェックの結果に基づいて、Runbook 内の特定のタスクをスキップまたは続行できます。

同時実行ジョブの防止

一部の Runbook は、同時に複数のジョブで実行されると、おかしな動作をすることがあります。 この場合は、既に実行中のジョブがあるかどうかをチェックするロジックを Runbook に実装することが重要です。 基本的な例を次に示します。

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription `
    -DefaultProfile $AzureContext

# Check for already running or new runbooks
$runbookName = "runbookName"
$resourceGroupName = "resourceGroupName"
$automationAccountName = "automationAccountName"

$jobs = Get-AzAutomationJob -ResourceGroupName $resourceGroupName `
    -AutomationAccountName $automationAccountName `
    -RunbookName $runbookName `
    -DefaultProfile $AzureContext

# Check to see if it is already running
$runningCount = ($jobs.Where( { $_.Status -eq 'Running' })).count

if (($jobs.Status -contains 'Running' -and $runningCount -gt 1 ) -or ($jobs.Status -eq 'New')) {
    # Exit code
    Write-Output "Runbook $runbookName is already running"
    exit 1
} else {
    # Insert Your code here
    Write-Output "Runbook $runbookName is not running"
}

Runbook をシステム割り当てマネージド ID で実行する場合は、コードをそのままにしておきます。 ユーザー割り当てマネージド ID を使用する場合は、次のようにします。

  1. 行 5 から $AzureContext = (Connect-AzAccount -Identity).context を削除します。
  2. それを $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context に置き換えた後、
  3. クライアント ID を入力します。

時間に依存するスクリプトの一時的なエラーを処理する

Runbook は堅牢であること、そして再起動や失敗を引き起こす可能性のあるエラー (一時的なエラーを含む) を処理できることが必要です。 Runbook が失敗した場合、Azure Automation によって再試行されます。

Runbook が時間制約内で普通に実行される場合は、スクリプトで実行時間をチェックするロジックを実装します。 このチェックにより、特定の時間帯にのみ、起動、シャットダウン、スケールアウトなどの操作が実行されることが保証されます。

Note

Azure サンドボックス プロセス上のローカル時刻は UTC に設定されます。 Runbook での日付と時刻の計算では、この事実を考慮する必要があります。

複数のサブスクリプションの操作

Runbook は、サブスクリプションを操作できることが必要です。 たとえば、複数のサブスクリプションを処理するために、Runbook には Disable-AzContextAutosave コマンドレットが使用されます。 このコマンドレットを使用するのは、同じサンドボックスで実行されている別の Runbook から認証コンテキストが取得されないようにするためです。

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription `
    -DefaultProfile $AzureContext

$childRunbookName = 'childRunbookDemo'
$resourceGroupName = "resourceGroupName"
$automationAccountName = "automationAccountName"

$startParams = @{
    ResourceGroupName     = $resourceGroupName
    AutomationAccountName = $automationAccountName
    Name                  = $childRunbookName
    DefaultProfile        = $AzureContext
}
Start-AzAutomationRunbook @startParams

Runbook をシステム割り当てマネージド ID で実行する場合は、コードをそのままにしておきます。 ユーザー割り当てマネージド ID を使用する場合は、次のようにします。

  1. 行 5 から $AzureContext = (Connect-AzAccount -Identity).context を削除します。
  2. それを $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context に置き換えた後、
  3. クライアント ID を入力します。

カスタム スクリプトを使用する

Note

通常、Log Analytics エージェントがインストールされているホストでカスタム スクリプトと Runbook を実行することはできません。

カスタム スクリプトを使用するには、次の手順に従います。

  1. Automation アカウントを作成します。
  2. Hybrid Runbook Worker ロールを展開します。
  3. Linux コンピューターでは通常より高い権限が必要です。 サインインして署名の確認を無効にします

Runbook をテストする

Runbook のテスト時には ドラフト バージョン が実行され、そのバージョンで行われるすべてのアクションが完了します。 ジョブ履歴は作成されませんが、 [テスト出力] ペインに出力および警告とエラーのストリームが表示されます。 VerbosePreference 変数が Continue に設定されている場合のみ、詳細ストリームに対するメッセージが [出力] ペインに表示されます。

ドラフト バージョンを実行している場合も、Runbook は通常どおり実行され、環境中のリソースに対するすべての操作が実行されます。 このため、Runbook をテストするのは非運用環境のリソースのみにしてください。

Runbook の各種類をテストする手順はいずれも同じです。 Azure portal のテキスト エディターとグラフィカル エディターではテスト方法に違いはありません。

  1. テキスト エディターまたはグラフィカル エディターのどちらかで、ドラフト バージョンの Runbook を開きます。
  2. [テスト] をクリックして [テスト] ページを開きます。
  3. Runbook にパラメーターがある場合は左ペインに表示され、そこでテストに使用する値を指定することができます。
  4. Hybrid Runbook Worker に対してテストを実施する場合は、 [実行設定][ハイブリッド worker] に変更してターゲット グループの名前を選択します。 それ以外の場合は、既定の [Azure] をそのまま使用してクラウドでテストを実行します。
  5. [開始] をクリックしてテストを開始します。
  6. テスト中の Powershell Workflow およびグラフィカル Runbook は、 [出力] ペインのボタンで停止および一時停止できます。 Runbook は、中断される場合は中断前に現在のアクティビティを完了します。 Runbook を中断した後で、停止または再開できます。
  7. [出力] ペインで Runbook の出力を調べます。

Runbook を発行する

新しく作成またはインポートした Runbook は、実行する前に発行しておく必要があります。 Azure Automation の各 Runbook には、ドラフト バージョンと発行バージョンがあります。 実行できるのは発行バージョンのみで、編集できるのはドラフト バージョンのみです。 ドラフト バージョンを変更しても発行バージョンに影響はありません。 ドラフト バージョンを使用できるようにする必要がある場合は、それを発行します。これにより、現在発行されているバージョンがドラフト バージョンで上書きされます。

Azure portal で Runbook を発行する

  1. Azure portal で [Automation アカウント] を検索して選択します。
  2. [Automation アカウント] ページで、一覧からお使いの Automation アカウントを選択します。
  3. お使いの Automation アカウントで Runbook を開きます。
  4. [編集] をクリックします。
  5. [発行] をクリックしてから、確認メッセージに対して [はい] を選択します。

PowerShell を使用して Runbook を発行する

Publish-AzAutomationRunbook コマンドレットを使用して Runbook を発行します。

$accountName = "MyAutomationAccount"
$runbookName = "Sample_TestRunbook"
$rgName = "MyResourceGroup"

$publishParams = @{
    AutomationAccountName = $accountName
    ResourceGroupName     = $rgName
    Name                  = $runbookName
}
Publish-AzAutomationRunbook @publishParams

Azure portal で Runbook をスケジュールする

Runbook が発行済みであるときに、操作のスケジュールを設定できます。

  1. Azure portal で [Automation アカウント] を検索して選択します。
  2. [Automation アカウント] ページで、一覧からお使いの Automation アカウントを選択します。
  3. Runbook の一覧から Runbook を選択します。
  4. [リソース] の下の [スケジュール] を選択します。
  5. [スケジュールの追加] を選択します。
  6. [Runbook のスケジュール設定] ウィンドウで、 [スケジュールを Runbook にリンクします] を選択します。
  7. [スケジュール] ウィンドウで、 [新しいスケジュールを作成します] を選択します。
  8. [新しいスケジュール] ウィンドウで、名前、説明、その他のパラメーターを入力します。
  9. スケジュールを作成したら、それを強調表示し、 [OK] をクリックします。 これで、Runbook にリンクされるようになります。
  10. メールボックスの電子メールで、Runbook の状態通知を探します。

ジョブの状態を取得する

Azure portal で状態を表示する

Azure Automation におけるジョブの処理について詳しくは、「ジョブ」を参照してください。 Runbook ジョブを見る準備が整ったら、Azure portal を使用して Automation アカウントにアクセスします。 右側にある [ジョブの統計情報] で、すべての Runbook ジョブの概要を確認できます。

Job Statistics tile

概要では、実行された各ジョブの数を確認できるほか、その状態がグラフィカルに表示されます。

タイルをクリックすると、実行されたすべてのジョブの概要を示す一覧が含まれた [ジョブ] ページが表示されます。 このページには、各ジョブの状態、Runbook 名、開始時刻、完了時間が表示されます。

Screenshot of the Jobs page.

[ジョブのフィルター] を選択すると、ジョブの一覧をフィルター処理すできます。 特定の Runbook、ジョブの状態、またはドロップダウン リストから選択したものでフィルター処理し、検索の時間範囲を指定します。

Filter job status

また、Automation アカウントの [Runbook] ページで Runbook を選択してから、 [ジョブ] を選択することで、特定の Runbook のジョブ概要の詳細を表示することができます。 この操作により、[ジョブ] ページが表示されます。 ここから、ジョブ レコードをクリックして、その詳細と出力を表示できます。

Screenshot of the Jobs page with the Errors button highlighted.

PowerShell を使用してジョブの状態を取得する

Runbook 用に作成されたジョブと、特定のジョブの詳細を取得するには、Get-AzAutomationJob コマンドレットを使用します。 Start-AzAutomationRunbook を使用して Runbook を開始すると、結果として作成されたジョブが返されます。 ジョブの出力を取得するには Get-AzAutomationJobOutput を使用します。

次の例では、サンプル Runbook の最後のジョブが取得されて、その状態、Runbook パラメーターに指定された値、およびジョブの出力が表示されます。

$getJobParams = @{
    AutomationAccountName = 'MyAutomationAccount'
    ResourceGroupName     = 'MyResourceGroup'
    Runbookname           = 'Test-Runbook'
}
$job = (Get-AzAutomationJob @getJobParams | Sort-Object LastModifiedDate -Desc)[0]
$job | Select-Object JobId, Status, JobParameters

$getOutputParams = @{
    AutomationAccountName = 'MyAutomationAccount'
    ResourceGroupName     = 'MyResourceGroup'
    Id                    = $job.JobId
    Stream                = 'Output'
}
Get-AzAutomationJobOutput @getOutputParams

次の例では、特定のジョブの出力が取得されて、各レコードが返されます。 いずれかのレコードで例外が発生した場合、スクリプトでは値ではなく例外が書き出されます。 この動作は役に立ちます。出力時に通常はログに記録されない追加情報が、例外によって提供される可能性があるためです。

$params = @{
    AutomationAccountName = 'MyAutomationAccount'
    ResourceGroupName     = 'MyResourceGroup'
    Stream                = 'Any'
}
$output = Get-AzAutomationJobOutput @params

foreach ($item in $output) {
    $jobOutParams = @{
        AutomationAccountName = 'MyAutomationAccount'
        ResourceGroupName     = 'MyResourceGroup'
        Id                    = $item.StreamRecordId
    }
    $fullRecord = Get-AzAutomationJobOutputRecord @jobOutParams

    if ($fullRecord.Type -eq 'Error') {
        $fullRecord.Value.Exception
    } else {
        $fullRecord.Value
    }
}

次のステップ