使用阿里云操作审计(ActionTrail)自动继承父资源标签
背景
标签被广泛应用于许多云上管理场景,比如资源管理、财务管理、自动化运维和权限管理。有了标签,资源就容易被聚类或者被索引,然而,对于许多用户而言,管理大量标签始终是一个挑战。特别是,当用户需要给一系列关联资源统一打标时。
云资源管理过程中,有很多场景需要创建一个功能模块,这个模块包含一个父资源和多个子资源。比如说,当用户创建一个ECS时,他一定需要创建一个磁盘,有时也会创建一个镜像,同时,磁盘也可能存在快照。因为这些资源属于同一个父资源,用户希望,当给父资源打标签时,其所包含的子资源也要继承同样的标签,或者当用户在父资源下添加新的子资源时,用户希望子资源自动继承父资源已经有的标签。我们再举一个例子,专有网络(VPC)包含交换机、路由表、NAT网关和VPN网关作为子资源,弹性公网IP可以关联到NAT网关。我们时常听到用户反馈,当在VPC下创建新的子资源时,希望子资源能够自动继承VPC的标签。
在这篇文章中,我们将介绍子资源如何自动从父资源继承标签。我们将使用以上VPC的场景来讲解这个解决方案,但是这个方案并不局限于VPC,可以被应用在任何类似的场景。
目标
下图展示了VPC和子资源之间的关系
这篇文章中的解决方案将实现以下两个目标
- 当在VPC下创建子资源时,子资源自动继承父资源的标签
- 当给VPC添加新标签时,所有子资源自动继承新标签
解决方案概览
此解决方中使用到的云产品
这些云产品将按照下图的关系进行集成
操作审计持续记录VPC和其子资源的操作,其中每一条记录都会被路由到事件总线(EventBridge),然后我们通过事件总线中的规则过滤出我们感兴趣的事件。我们会创建2条规则,规则一过滤出所有给VPC打标的操作(TagResources),规则二过滤出创建VPC子资源的操作。最后我们把两个规则分别连接到相应的函数,以实现自动打标的目标
解决方实施
接下来我们逐步描述该方案的实施过程
为了成功实施该方案,以下条件必须首先满足
- 一个阿里云账号
- 对于NodeJS有基本了解
- 确保一下步骤都在同一个区域进行
操作审计(ActionTrail)
操作审计默认自动开启,此处无需额外操作和配置
创建一个阿里云服务
为了在函数中给资源打标,我们必须赋予函数VPC和Tag相应权限
- 打开访问控制→ 角色 → 创建角色
- 选择阿里云服务
- 角色命名为TagVPCRole
- 选择受信服务函数计算
- 点击完成
- 我们需要给这个角色赋予三个角色,
AliyunVPCReadOnlyAccess
,AliyunLogFullAccess
andAliyunTagAdministratorAccess
:
创建一个函数服务
接下来我们创建执行打标操作的函数
1. 打开 函数计算
2. 点击 服务及函数
3. 创建一个名为 VPCTagService 的服务
4. 在服务表中找到上面创建的服务
5. 点击 配置
6. 在角色配置部分, 选择 TagVPCRole
7. 保存
创建函数func01
当VPC增加新标签时,这个函数会自动给子资源打上同样的标签
1. 打开函数 函数计算 → 服务 → 函数
2. 点击 创建函数, 创建一个名为func01的函数
3. 创建完成后,你会被重定向到函数编辑页面. 点击 上传代码,选择 上传Zip文件
4. Zip文件可以从这里获取 here
5. 上传成功后确保点击 保存和部署,使代码生效
创建函数func02
当VPC增加新的子资源时,这个函数会自动给子资源打上同样的标签
1. 打开函数 函数计算 → 服务 → 函数
2. 点击 创建函数, 创建一个名为func02的函数
3. 创建完成后,你会被重定向到函数编辑页面. 点击 上传代码,选择 上传Zip文件
4. Zip文件可以从这里获取 here
5. 上传成功后确保点击 保存和部署,使代码生效
事件总线(EventBridge)
默认事件总线会监听有操作审计的事件,但是我们并不想因为任意事件触发一次函数执行。我们只关心两类事件,第一类,VPC打标事件,第二类创建VPC子资源事件。因此,我们创建两个规则,分别过滤这两类事件。
创建规则1
第一个规则命名为 TagVPC
. 这个规则将用来过滤VPC上的 TagResources
事件。
1. 打开 事件总线->default->事件规则->创建规则
2. 定义事件模式
{
"data": {
"eventName": [
"TagResources"
],
"serviceName": [
"Vpc"
]
},
"source": [
"acs.vpc"
],
"type": [
"vpc:ActionTrail:AliyunServiceEvent",
"vpc:ActionTrail:ApiCall",
"vpc:ActionTrail:ConsoleOperation"
]
}
3. 下一步我们把规则的目标指向对应的函数
选择 函数计算 作为服务类型,选择函数func01
创建规则 2
第二条规则命名为 CreateVPCResources
. 这条规则用来过滤创建子资源事件
1. 打开 事件总线->default->事件规则->创建规则
2. 定义事件模式
{
"data": {
"resourceType": [
"ACS::VPC::NatGateway",
"ACS::VPNGateway::VpnGateway",
"ACS::ECS::Instance;ACS::EIP::EipAddress",
"ACS::VPC::VSwitch;ACS::VPC::VPC",
"ACS::VPC::RouteTable;ACS::VPC::VPC",
"ACS::VPC::VPC"
],
"eventName": [
"Create",
"AssociateEipAddress",
"CreateVSwitch",
"CreateRouteTable"
]
},
"source": [
"acs.vpc"
],
"type": [
"vpc:ActionTrail:AliyunServiceEvent",
"vpc:ActionTrail:ApiCall",
"vpc:ActionTrail:ConsoleOperation"
]
}
2. 按照上面的方法,把func02添加为这个规则的目标
总结
这篇文章讲述了如何从VPC向其子资源自动传播标签。此方案适用了ActionTrail, EventBridge 和 Function Compute. 虽然我们使用了VPC作为例子,但这个方法同样适用于其他类似场景