发布于 2026-01-06 1 阅读
0

使用 Azure 函数自动清理您的混乱局面

使用 Azure 函数自动清理您的混乱局面

本文是#ServerlessSeptember活动的一部分。在这个涵盖所有 Serverless 相关内容的合集中,您可以找到其他有用的文章、详细的教程和视频。整个九月,社区成员和云技术倡导者每天都会发布新文章——没错,每天都有!

访问https://docs.microsoft.com/azure/azure-functions了解更多关于 Microsoft Azure 如何启用您的无服务器函数的信息

在之前的文章中,我解释了如何创建 Azure 自动化来执行 PowerShell 脚本,以删除所有过期资源。这次,我们将利用无服务器架构的强大功能来清理这些资源。

目标

根据既定计划,我们需要删除所有“已过期”的资源。资源被判定为已过期的条件是:首先,它被标记为“已过期”;expireOn其次,该标签的值早于当前日期。

所有代码都可以在我的GitHub 代码库中找到。此外,还有一个一键按钮,可以将解决方案部署到您的 Azure 订阅中!

Azure资源图

Azure 资源图查询性能极佳。您可以阅读 Stephane Lapointe(微软 Azure MVP)撰写的一篇精彩文章,其中展示了一些性能对比。简而言之,我们无需检索所有资源并遍历它们,而是只检索我们需要的内容;记录更少,速度更快。

在我们的例子中,所有标签expireOn小于now().

$expResources= Search-AzGraph -Query 'where todatetime(tags.expireOn) < now() | project id'

foreach ($r in $expResources) {
    Remove-AzResource -ResourceId $r.id -Force
}

$rgs = Get-AzResourceGroup;

foreach($resourceGroup in $rgs){
    $name=  $resourceGroup.ResourceGroupName;
    $count = (Get-AzResource | Where-Object{ $_.ResourceGroupName -match $name }).Count;
    if($count -eq 0){
        Write-Output "==> $name is empty. Deleting it...";
        Remove-AzResourceGroup -Name $name -Force -WhatIf
    }
}
Enter fullscreen mode Exit fullscreen mode

然后我们需要删除空的资源组,由于这些资源组无法通过资源图进行搜索,我们使用通常的方法Get-AzResourceGroup获取所有资源组,然后删除空的资源组Remove-AzResourceGroup

要了解 Azure 资源图的全部功能,请查看这份包含大量示例的优秀文档。我还制作了一个 5 分钟的视频“像专家一样使用 Azure Graph 查询进行搜索”,其中解释了它的工作原理。

PowerShell Azure 函数

在这篇文章中,我将使用强大的Azure Functions for Visual Studio Code扩展来创建我的函数。

在 VSCode 扩展中,点击第一个选项“创建新项目”。选择本地文件夹和语言;在本演示中,我将使用 PowerShell。这将创建一些文件和文件夹。

现在我们来创建函数。从扩展菜单中,选择第二个选项“创建函数”。创建一个名为AzSubCleanerTimeTrigger的时间触发器。最后一步是使用cron 表达式设置计划任务。要让函数每天早上 5 点触发,请输入cron 表达式0 0 5 * * *。您可以随时通过编辑 cron 文件来更改此设置function.json

将之前显示的 PowerShell 代码添加到 run.ps1 文件的末尾。这样,我们的代码就完成了。该函数将接收一个时间参数,您可以将其用于日志记录等用途。

必需模块

如果你稍等片刻后再尝试执行此函数,你可能会收到一个关于缺少模块的错误。这是因为要处理该命令,Search-AzGraph我们需要添加该模块Az.ResourceGraph

要将 PowerShell 模块添加到 FunctionApp,请在根目录创建一个名为“modules”的文件夹。如果您已在本地安装了该模块,则可以通过执行以下命令找到模块文件夹的位置:

Get-Module -ListAvailable Az.ResourceGraph
Enter fullscreen mode Exit fullscreen mode

你需要将该文件夹复制Az.ResourceGraph到你刚刚创建的 modules 文件夹中。它应该看起来像这样。

如果本地没有安装该模块,可以使用以下命令进行安装,或者点击此处查看更完整的文档

Install-Module -Name Az.ResourceGraph
Enter fullscreen mode Exit fullscreen mode

部署

使用 VSCode 扩展部署 Azure 函数非常简单。在扩展中,单击第三个按钮“部署到函数应用”。选择当前文件夹(您应该位于函数文件夹的根目录),然后选择目标订阅。当提示选择 Web 应用时,选择“ + 创建新 Web 应用”,并将名称输入为“AzSubscriptionCleaner”。部署过程大约需要一分钟,完成后即可完成。

大部分工作已经完成,现在我们需要授权 Azure 函数管理订阅。部署完成后,请转到 Azure 门户并打开刚刚部署的 Azure 函数应用。打开“平台功能”选项卡,然后在“网络”部分选择“标识” 。

现在将状态更改为“开启”,然后保存。这将创建一个新的主体并将其分配给函数应用。

要将“贡献者”角色分配给此主体,我们需要进入订阅。从左侧菜单中选择“所有服务”,然后在搜索栏中输入“订阅”。单击“订阅”以查看可用订阅列表。单击您刚刚部署了 AzSubscriptionCleaner 的订阅。

从左侧选项中选择“访问控制 (IAM)”。单击“添加”,然后选择“添加角色分配”。在左侧的新面板中,选择“参与者”作为角色,并在“选择”文本框中输入您的资源名称(例如:azsubscriptioncleaner)

选择蓝色“选择”按钮,就完成了!

进而?

第二天早上,Azure 函数将被触发并删除所有过期资源。前往 Azure 门户并添加一些标签。对于任何资源,单击“标签”选项,然后输入expireOn名称和您希望此资源过期的日期,格式为 `<terminal-term-expensive>:<terminal-term-expensive>` YYYY-MM-dd

也可以使用 PowerShell、Azure CLI 和 Azure 资源管理器 (ARM) 模板添加标签。

如果您愿意,我这里还有这篇文章的视频版本。

祝您清洁愉快!

感谢@iboonox提供的精美题图!

文章来源:https://dev.to/azure/use-azure-function-to-clean-up-your-mess-automatically-3h29