教程:使用 Azure Functions 创建前期事件和后期事件
适用于:✔️ Windows VM ✔️ Linux VM ✔️ 本地环境 ✔️ Azure VM ✔️ 已启用 Azure Arc 的服务器。
本教程介绍如何使用 Azure Functions 创建预处理和后处理事件,以在计划修补工作流中启动和停止 VM。
本教程介绍如何执行下列操作:
- 先决条件
- 创建函数应用
- 创建函数
- 创建事件订阅
先决条件
确保使用的是 PowerShell 7.2 Runbook。
向托管标识分配权限 - 可以将权限分配给相应的托管标识。 Runbook 可使用自动化帐户的系统分配的托管标识或用户分配的托管标识。
可以使用门户或 PowerShell cmdlet 向每个标识分配权限:
- 导入
Az.ResourceGraph
模块,确保将该模块更新到使用模块版本 2.0.3 的 ThreadJob。
创建函数应用
按照创建函数应用中的步骤执行。
创建函数应用后,转到“资源”,确保按照以下步骤加载依赖项:
注意
仅首次执行时才必须加载依赖项。
在“函数应用”上,选择“应用文件”。
在 host.json 下,将 ManagedDependecy 设置为“True”,然后选择 requirements.psd1。
在 requirements.psd1 下,粘贴以下代码:
@{ 'Az'='5.*' 'Az.ResourceGraph'='0.13.0' 'Az.Resources'='6.*' 'ThreadJob' = '2.*' }
选择“保存”。
从“概述”选项卡重启函数应用,加载 requirements.psd1 文件中提到的依赖项。
创建函数
创建函数应用后,转到“资源”,然后在“概述”中选择“在 Azure 门户中创建”。
在“创建函数”窗口中,进行以下选择:
在“事件网格函数”中,从左侧菜单中选择“代码+测试”,粘贴以下代码,然后选择“保存”。
# Make sure that we are using eventGridEvent for parameter binding in Azure function. param($eventGridEvent, $TriggerMetadata) Connect-AzAccount -Environment AzureChinaCloud -Identity # Install the Resource Graph module from PowerShell Gallery # Install-Module -Name Az.ResourceGraph $maintenanceRunId = $eventGridEvent.data.CorrelationId $resourceSubscriptionIds = $eventGridEvent.data.ResourceSubscriptionIds if ($resourceSubscriptionIds.Count -eq 0) { Write-Output "Resource subscriptions are not present." break } Write-Output "Querying ARG to get machine details [MaintenanceRunId=$maintenanceRunId][ResourceSubscriptionIdsCount=$($resourceSubscriptionIds.Count)]" $argQuery = @" maintenanceresources | where type =~ 'microsoft.maintenance/applyupdates' | where properties.correlationId =~ '$($maintenanceRunId)' | where id has '/providers/microsoft.compute/virtualmachines/' | project id, resourceId = tostring(properties.resourceId) | order by id asc "@ Write-Output "Arg Query Used: $argQuery" $allMachines = [System.Collections.ArrayList]@() $skipToken = $null do { $res = Search-AzGraph -Query $argQuery -First 1000 -SkipToken $skipToken -Subscription $resourceSubscriptionIds $skipToken = $res.SkipToken $allMachines.AddRange($res.Data) } while ($skipToken -ne $null -and $skipToken.Length -ne 0) if ($allMachines.Count -eq 0) { Write-Output "No Machines were found." break } $jobIDs= New-Object System.Collections.Generic.List[System.Object] $startableStates = "stopped" , "stopping", "deallocated", "deallocating" $allMachines | ForEach-Object { $vmId = $_.resourceId $split = $vmId -split "/"; $subscriptionId = $split[2]; $rg = $split[4]; $name = $split[8]; Write-Output ("Subscription Id: " + $subscriptionId) $mute = Set-AzContext -Subscription $subscriptionId $vm = Get-AzVM -ResourceGroupName $rg -Name $name -Status -DefaultProfile $mute $state = ($vm.Statuses[1].DisplayStatus -split " ")[1] if($state -in $startableStates) { Write-Output "Starting '$($name)' ..." $newJob = Start-ThreadJob -ScriptBlock { param($resource, $vmname, $sub) $context = Set-AzContext -Subscription $sub; Start-AzVM -ResourceGroupName $resource -Name $vmname -DefaultProfile $context} -ArgumentList $rg, $name, $subscriptionId $jobIDs.Add($newJob.Id) } else { Write-Output ($name + ": no action taken. State: " + $state) } } $jobsList = $jobIDs.ToArray() if ($jobsList) { Write-Output "Waiting for machines to finish starting..." Wait-Job -Id $jobsList } foreach($id in $jobsList) { $job = Get-Job -Id $id if ($job.Error) { Write-Output $job.Error } }
从左侧菜单中选择“集成”,并在“触发器”下编辑“事件触发器参数名称”。 使用“代码+测试”窗口中给定的参数名称。 在此示例中,参数为 eventGridEvent。
选择保存
创建事件订阅
- 登录到 Azure 门户,转到“Azure 更新管理器”。
- 在“管理”下,选择“计算机”和“维护配置”。
- 在“维护配置”页上选择“配置”。
- 在“设置”下,选择“事件”。
- 选择“+事件订阅”以创建维护前/后维护事件。
- 在“创建事件订阅”页中输入以下详细信息:
- 在“事件订阅详细信息”部分,提供适当的名称。
- 将架构保留为“事件网格架构”。
- 对于“事件类型”部分,请选择“筛选事件类型”。
- 选择“预维护事件”作为预处理事件。
- 在“终结点详细信息”部分,选择“Azure 函数”终结点,然后选择“配置和终结点”。
- 提供相应的详细信息,例如资源组、用于触发事件的函数应用。
- 选择“后期维护事件”作为后处理事件。
- 在“终结点详细信息”部分,选择“Azure 函数”终结点,然后选择“配置和终结点”。
- 提供相应的详细信息,例如资源组、用于触发事件的函数应用。
- 选择“预维护事件”作为预处理事件。
- 选择创建。
还可使用 Azure 存储帐户和事件中心来存储、发送和接收事件。 详细了解如何创建事件中心和存储队列。
后续步骤
- 有关详细信息,请参阅 Azure 更新管理器中的前置事件和后置事件概述。
- 有关详细信息,请参阅如何创建前置事件和后置事件
- 若要了解如何管理预维护和后期维护事件或取消计划运行,请参阅预维护和后期维护配置事件。
- 有关详细信息,请参阅通过自动化使用 Webhook 创建前置事件和后置事件。