Azure Automation Runbook をトリガーするアラートを使用する
Azure Monitor を使用して Azure のほとんどのサービスのベース レベルのメトリックとログを監視します。 アクション グループを使用して Azure Automation Runbook を呼び出し、アラートに基づくタスクを自動化することができます。 この記事では、アラートを使用して Runbook を構成および実行する方法を示します。
前提条件
- 少なくとも 1 つのユーザー割り当てマネージド ID を持つ Azure Automation アカウント。 詳細については、「Azure Automation アカウントのユーザー割り当てマネージド ID を使用する」を参照してください。
- Az モジュール:
Az.Accounts
およびAz.Compute
が Automation アカウントにインポートされている。 詳細については、「Az モジュールをインポートする」を参照してください。 - Azure 仮想マシン。
- Azure Az PowerShell モジュールがマシンにインストールされている。 インストールまたはアップグレードするには、Azure Az PowerShell モジュールをインストールする方法に関するページを参照してください。
- Automation Runbook に関する一般的な理解。
アラートの種類
Automation Runbook は、次の 3 つの種類のアラートで使用できます。
- 共通アラート
- アクティビティ ログ アラート
- ほぼリアルタイムのメトリック アラート
Note
共通アラート スキーマを使用すると、Azure のアラート通知の使用エクスペリエンスを標準化できます。 これまで、Azure の 3 種類のアラート (メトリック、ログ、アクティビティ ログ) には、独自のメール テンプレートや Webhook スキーマ などがありました。詳細については、「共通アラート スキーマ」を参照してください
アラートが Runbook を呼び出すとき、実際の呼び出しは webhook に対する HTTP POST 要求です。 POST 要求の本文には、アラートに関する有用なプロパティを格納する JSON 形式のオブジェクトが含まれています。 次の表は、各アラートの種類のペイロード スキーマへのリンクを示しています。
Alert | 説明 | ペイロード スキーマ |
---|---|---|
共通アラート | 今日の Azure でのアラート通知の使用エクスペリエンスを標準化する共通アラート スキーマ。 | 共通アラートのペイロード スキーマ。 |
アクティビティ ログ アラート | Azure のアクティビティ ログ内の新しいイベントのいずれかが特定の条件と一致する場合に、通知が送信されます。 たとえば、Delete VM 操作が myProductionResourceGroup で発生した場合、または状態が [アクティブ] の新しい Azure Service Health イベントが表示されている場合などです。 |
アクティビティ ログ アラートのペイロード スキーマ |
ほぼリアルタイムのメトリック アラート | 1 つまたは複数のプラットフォーム レベルのメトリックが指定した条件を満たす場合に、メトリック アラートよりも速く通知が送信されます。 たとえば、過去 5 分間の VM の CPU % の値が 90 より大きく、[ネットワーク入力] の値が 500 MB より大きい場合などです。 | ほぼリアルタイムのメトリック アラートのペイロード スキーマ |
種類ごとに提供されるデータは異なるため、アラートは種類ごとに異なる方法で処理されます。 次のセクションでは、さまざまな種類のアラートを処理する Runbook を作成する方法について説明します。
マネージド ID にアクセス許可を割り当てる
適切なマネージド ID にアクセス許可を割り当てて、仮想マシンを停止できるようにします。 Runbook では、Automation アカウントのシステム割り当てマネージド ID またはユーザー割り当てマネージド ID のいずれかを使用できます。 以下に、各 ID にアクセス許可を割り当てる手順を示します。 次の手順では PowerShell を使用します。 ポータルを使用する場合は、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。
Connect-AzAccount コマンドレットを使用して、Azure に対話的にサインインし、指示に従います。
# Sign in to your Azure subscription $sub = Get-AzSubscription -ErrorAction SilentlyContinue if(-not($sub)) { Connect-AzAccount } # If you have multiple subscriptions, set the one to use # Select-AzSubscription -SubscriptionId <SUBSCRIPTIONID>
下の変数に適切な値を指定し、スクリプトを実行します。
$resourceGroup = "resourceGroup" $automationAccount = "AutomationAccount" $userAssignedManagedIdentity = "userAssignedManagedIdentity"
PowerShell コマンドレット New-AzRoleAssignment を使用して、システム割り当てマネージド ID にロールを割り当てます。
$SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId New-AzRoleAssignment ` -ObjectId $SAMI ` -ResourceGroupName $resourceGroup ` -RoleDefinitionName "DevTest Labs User"
ユーザー割り当てマネージド ID にロールを割り当てる
$UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity) New-AzRoleAssignment ` -ObjectId $UAMI.PrincipalId ` -ResourceGroupName $resourceGroup ` -RoleDefinitionName "DevTest Labs User"
システム割り当てマネージド ID の場合は、
ClientId
を表示し、後で使用するためにその値を記録します。$UAMI.ClientId
アラートを処理する Runbook を作成する
アラートで Automation を使用するには、Runbook に渡されるアラートの JSON ペイロードを管理する Runbook が必要です。 次の例の Runbook が Azure アラートから呼び出される必要があります。
前のセクションで説明したように、アラートの種類ごとにスキーマは異なります。 このスクリプトでは、WebhookData
Runbook 入力パラメーターのアラートから Webhook データを取得します。 次に、スクリプトによって JSON ペイロードが評価され、使用されているアラートの種類が判断されます。
この例では、Azure 仮想マシン (VM) からのアラートを使用します。 ペイロード (特にトリガーされたアラートのターゲット リソース) から VM データを抽出し、その情報を利用して VM を停止します。 接続は、Runbook が実行される Automation アカウントで設定する必要があります。 アラートを使用して Runbook をトリガーする場合は、トリガーされる Runbook でアラートの状態を確認することが重要です。 アラートの状態が変化するたびに、Runbook がトリガーされます。 アラートには複数の状態があります。最も一般的な 2 つの状態は "アクティブ" と "解決済み" です。 Runbook が複数回実行されないことを確実にするために、Runbook ロジックの状態を確認します。 この記事の例では、状態がアクティブのアラートのみを検索する方法を示しています。
Runbook では、VM に対する管理アクションの実行を Azure で認証するために、Automation アカウントのシステム割り当てマネージド ID が使用されます。 Runbook は、ユーザー割り当てマネージド ID を使用するように簡単に変更することができます。
Note
パブリック ネットワーク アクセスを使用することをお勧めします。これは、Automation アカウントがプライベート リンクを使用していて、[パブリック アクセス] が [無効] に設定されている場合に、Azure アラート (メトリック、ログ、アクティビティ ログ) を使用して Automation Webhook をトリガーできないためです。
この例を使用してStop-AzureVmInResponsetoVMAlert と呼ばれる Runbook を作成します。 PowerShell スクリプトは変更して、多くのさまざまなリソースで使用することができます。
Azure portal にサインインし、お使いの Automation アカウントに移動します。
[プロセス オートメーション] の [Runbook] を選択します。
[+ Runbook の作成] を選択します。
- Runbook に
Stop-AzureVmInResponsetoVMAlert
という名前を付けます。 - [Runbook の種類] ドロップダウン メニューから、[PowerShell] を選択します。
- [作成] を選択します。
- Runbook に
Runbook エディターで、次のコードを貼り付けます。
[OutputType("PSAzureOperationResponse")] param ( [Parameter (Mandatory=$false)] [object] $WebhookData ) $ErrorActionPreference = "stop" if ($WebhookData) { # Get the data object from WebhookData $WebhookBody = (ConvertFrom-Json -InputObject $WebhookData.RequestBody) # Get the info needed to identify the VM (depends on the payload schema) $schemaId = $WebhookBody.schemaId Write-Verbose "schemaId: $schemaId" -Verbose if ($schemaId -eq "azureMonitorCommonAlertSchema") { # This is the common Metric Alert schema (released March 2019) $Essentials = [object] ($WebhookBody.data).essentials # Get the first target only as this script doesn't handle multiple $alertTargetIdArray = (($Essentials.alertTargetIds)[0]).Split("/") $SubId = ($alertTargetIdArray)[2] $ResourceGroupName = ($alertTargetIdArray)[4] $ResourceType = ($alertTargetIdArray)[6] + "/" + ($alertTargetIdArray)[7] $ResourceName = ($alertTargetIdArray)[-1] $status = $Essentials.monitorCondition } elseif ($schemaId -eq "AzureMonitorMetricAlert") { # This is the near-real-time Metric Alert schema $AlertContext = [object] ($WebhookBody.data).context $SubId = $AlertContext.subscriptionId $ResourceGroupName = $AlertContext.resourceGroupName $ResourceType = $AlertContext.resourceType $ResourceName = $AlertContext.resourceName $status = ($WebhookBody.data).status } elseif ($schemaId -eq "Microsoft.Insights/activityLogs") { # This is the Activity Log Alert schema $AlertContext = [object] (($WebhookBody.data).context).activityLog $SubId = $AlertContext.subscriptionId $ResourceGroupName = $AlertContext.resourceGroupName $ResourceType = $AlertContext.resourceType $ResourceName = (($AlertContext.resourceId).Split("/"))[-1] $status = ($WebhookBody.data).status } elseif ($schemaId -eq $null) { # This is the original Metric Alert schema $AlertContext = [object] $WebhookBody.context $SubId = $AlertContext.subscriptionId $ResourceGroupName = $AlertContext.resourceGroupName $ResourceType = $AlertContext.resourceType $ResourceName = $AlertContext.resourceName $status = $WebhookBody.status } else { # Schema not supported Write-Error "The alert data schema - $schemaId - is not supported." } Write-Verbose "status: $status" -Verbose if (($status -eq "Activated") -or ($status -eq "Fired")) { Write-Verbose "resourceType: $ResourceType" -Verbose Write-Verbose "resourceName: $ResourceName" -Verbose Write-Verbose "resourceGroupName: $ResourceGroupName" -Verbose Write-Verbose "subscriptionId: $SubId" -Verbose # Determine code path depending on the resourceType if ($ResourceType -eq "Microsoft.Compute/virtualMachines") { # This is an Resource Manager VM Write-Verbose "This is an Resource Manager VM." -Verbose # 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 # Stop the Resource Manager VM Write-Verbose "Stopping the VM - $ResourceName - in resource group - $ResourceGroupName -" -Verbose Stop-AzVM -Name $ResourceName -ResourceGroupName $ResourceGroupName -DefaultProfile $AzureContext -Force # [OutputType(PSAzureOperationResponse")] } else { # ResourceType not supported Write-Error "$ResourceType is not a supported resource type for this runbook." } } else { # The alert status was not 'Activated' or 'Fired' so no action taken Write-Verbose ("No action taken. Alert status: " + $status) -Verbose } } else { # Error Write-Error "This runbook is meant to be started from an Azure alert webhook only." }
Runbook をシステム割り当てマネージド ID で実行する場合は、コードをそのままにしておきます。 ユーザー割り当てマネージド ID を使用する場合は、次のようにします。
- 行 78 から
$AzureContext = (Connect-AzAccount -Identity).context
を削除します。 - それを
$AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context
に置き換えた後、 - 前に取得したクライアント ID を入力します。
- 行 78 から
[保存]、[発行] の順に選択し、確認を求められたら [はい] を選択します。
[Runbook] ページを閉じて、[Automation アカウント] ページに戻ります。
アラートを作成する
アラートでは、アクション グループが使用されます。アクション グループは、アラートによってトリガーされるアクションのコレクションです。 Runbook は、アクション グループで使用できるさまざまなアクションの 1 つにすぎません。
Automation アカウントで、[監視] の下の [アラート] を選択します。
[+ 新しいアラート ルール] を選択して [アラート ルールの作成] ページを開きます。
[スコープ] で [リソースの編集] を選択します。
[リソースの選択] ページで、[リソースの種類でフィルター] ドロップダウン リストから [仮想マシン] を選択します。
監視する仮想マシンの横にあるチェック ボックスをオンにします。 次に、[完了] を選択して、[アラート ルールの作成] ページに戻ります。
[条件] で、[条件の追加] を選択します。
[Select a signal]\(シグナルの選択\) ページで、検索テキスト ボックスに「
Percentage CPU
」と入力し、結果から [CPU 使用率] を選択します。[シグナル ロジックの構成] ページの [しきい値] の下に、テスト用に初期の低い値 (
5
など) を入力します。 アラートが想定どおりに動作することを確認したら、戻ってこの値を更新することができます。 次に、[完了] を選択して、[アラート ルールの作成] ページに戻ります。[アクション] の [アクション グループの追加]、[+ アクション グループの作成] の順に選択します。
[アクション グループの作成] ページで次の手順を実行します。
[基本] タブで、[アクション グループ名] と [表示名] を入力します。
[アクション] タブの [名前] テキスト ボックスに名前を入力します。 次に [アクションの種類] ドロップダウン リストから [Automation Runbook] を選択し、[Runbook の構成] ページを開きます。
[Runbook ソース] の項目で [ユーザー] を選択します。
[サブスクリプション] ドロップダウン リストからサブスクリプションを選択します。
[Automation アカウント] ドロップダウン リストから、Automation アカウントを選択します。
[Runbook] ドロップダウン リストから [Stop-AzureVmInResponsetoVMAlert] を選択します。
[一般的なアラート スキーマを有効にします] 項目で [はい] を選択します。
[OK] を選択し、[アクション グループの作成] ページに戻ります。
[確認と作成] を選択し、[作成] を選択すると、[アラート ルールの作成] ページに戻ります。
[アラート ルールの詳細] の [アラート ルール名] テキスト ボックス。
[アラート ルールの作成] を選択します。 このアクション グループは作成したアクティビティ ログ アラートと準リアルタイムのアラートで使用することができます。
検証
VM が実行されていることを確認します。 Runbook Stop-AzureVmInResponsetoVMAlert に移動し、生成される [最近のジョブ] 一覧を確認します。 完了したジョブが表示されたら、そのジョブを選択し、出力を確認します。 また、VM が停止していないかどうかも確認します。
Azure VM 管理オペレーション
Azure Automation は、VM の再起動、VM の停止、VM の削除、スケール アップおよびダウン シナリオなどの一般的な Azure VM 管理操作のスクリプトを Runbook ギャラリーで提供します。 スクリプトは、Azure Automation GitHub リポジトリにもあります。これらのスクリプトは、上記の手順で説明したように使用することもできます。
Azure VM の管理操作 | 詳細 |
---|---|
Stop-Azure-VM-On-Alert | この runbook は、Azure アラートトリガーに応答して Azure Resource Manager VM を停止します。 トリガーされるアラートのターゲット リソースは、停止対象の VM である必要があります。 これは、トリガーされたアラート ペイロードから入力パラメーターで渡されます。 Runbook は、webhook を使用して Azure アラートから呼び出す必要があります。 Az module の最新バージョンは、automation アカウントに追加する必要があります。 マネージド ID が有効になっていて、automation アカウントへの共同作成者のアクセス権が付与されている必要があります。 |
Restart-Azure-VM-On-Alert | この runbook は、Azure アラートトリガーに応答して Azure Resource Manager VM を停止します。 トリガーされるアラートのターゲット リソースは、再起動対象の VM である必要があります。 これは、トリガーされたアラート ペイロードから入力パラメーターで渡されます。 Runbook は、webhook を使用して Azure アラートから呼び出す必要があります。 Az module の最新バージョンは、automation アカウントに追加する必要があります。 マネージド ID が有効になっていて、automation アカウントへの共同作成者のアクセス権が付与されている必要があります。 |
Delete-Azure-VM-On-Alert | この runbook は、Azure アラートトリガーに応答して Azure Resource Manager VM を停止します。 トリガーされるアラートのターゲット リソースは、削除対象の VM である必要があります。 これは、トリガーされたアラート ペイロードから入力パラメーターで渡されます。 Runbook は、webhook を使用して Azure アラートから呼び出す必要があります。 Az module の最新バージョンは、automation アカウントに追加する必要があります。 マネージド ID が有効になっていて、automation アカウントへの共同作成者のアクセス権が付与されている必要があります。 |
ScaleDown-Azure-VM-On-Alert | この runbook は、Azure アラートトリガーに応答して Azure Resource Manager VM を停止します。 トリガーされるアラートのターゲット リソースは、スケールダウン対象の VM である必要があります。 これは、トリガーされたアラート ペイロードから入力パラメーターで渡されます。 Runbook は、webhook を使用して Azure アラートから呼び出す必要があります。 Az module の最新バージョンは、automation アカウントに追加する必要があります。 マネージド ID が有効になっていて、automation アカウントへの共同作成者のアクセス権が付与されている必要があります。 |
ScaleUp-Azure-VM-On-Alert | この runbook は、Azure アラートトリガーに応答して Azure Resource Manager VM を停止します。 トリガーされるアラートのターゲット リソースは、スケールアップ対象の VM である必要があります。 これは、トリガーされたアラート ペイロードから入力パラメーターで渡されます。 Runbook は、webhook を使用して Azure アラートから呼び出す必要があります。 Az module の最新バージョンは、automation アカウントに追加する必要があります。 マネージド ID が有効になっていて、automation アカウントへの共同作成者のアクセス権が付与されている必要があります。 |
次のステップ
- 予算を作成してそれを Automation Runbook に関連付ける方法についてさらに学びます。
- Runbook を開始するさまざまな方法については、Runbook の開始に関する記事をご覧ください。
- アクティビティ ログ アラートの構成方法は、「アクティビティ ログ アラートの作成」をご覧ください。
- ほぼリアルタイムのアラートの作成方法については、「Azure Portal でアラート ルールを作成する」をご覧ください。