如何使用AWS CDK获取资源组内安全组、子网等资源引用
场景说明
需要通过指定标签或已知资源组的方式,导入安全组(SecurityGroup)与子网(Subnet)资源,要求避免硬编码网络资源ID,也不额外创建冗余SSM参数存储资源ID。
已编写的资源组配置如下:
resource "aws_resourcegroups_group" "private_networking" { name = "us-blog-private-networking" resource_query { query = <<JSON { "ResourceTypeFilters": [ "AWS::EC2::SecurityGroup", "AWS::EC2::Subnet" ], "TagFilters": [ { "Key": "Property", "Values": ["us-blog-production"] }, { "Key": "Private", "Values": [true] } ] } JSON } }
当前卡点:
- SecurityGroup和Subnet的
fromXXAttributes方法不支持基于标签查询资源 - 资源组目前仅提供L1层的
CfnGroup构造,没有内置拉取资源组内资源列表的静态方法,无对应L2级别的高层构造
实现方案
不需要依赖资源组做中转归集,根据你使用的工具链直接选对应原生方案即可,实现成本远低于资源组方案:
若使用AWS CDK
直接用CDK原生的运行时查找能力,无需自定义资源、无需资源组:
- 子网导入:先通过
Vpc.fromLookup按标签/名称查到目标VPC,再调用VPC实例的selectSubnets方法,传入标签过滤规则,就能直接拿到可引用的子网对象,不需要手动传子网ID - 安全组导入:直接调用
SecurityGroup.fromLookup方法,传入标签过滤条件、所属VPC信息,CDK会在栈合成阶段自动调用AWS API查询匹配的安全组,返回可直接绑定到其他资源的安全组对象
以上方法的查询结果会被CDK自动缓存,不会重复调用API,也不会产生额外资源费用。
若使用Terraform
直接用数据源(data source)做标签查询,不需要提前创建资源组:
- 用
aws_subnets数据源,传入和你资源组里一致的标签过滤规则,直接拿到匹配的子网ID列表 - 用
aws_security_groups数据源,同样传入标签过滤规则,就能拿到匹配的安全组ID列表
数据源查询是Terraform执行plan阶段自动完成的,不需要额外维护资源组资源,后续标签规则变更只需要修改数据源过滤条件即可。
特殊场景适配
如果你必须复用已经存在的资源组,不需要等CDK出L2构造,直接写一个轻量自定义资源即可:
- 给自定义资源绑定仅允许
resource-groups:ListGroupResources、ec2:DescribeSecurityGroups、ec2:DescribeSubnets权限的IAM角色 - 自定义资源逻辑直接调用资源组的ListGroupResources接口拉取组内资源ARN,解析出子网、安全组ID后返回,结果可以直接传给对应资源的fromId方法生成引用
- 把资源组名称、标签过滤规则作为自定义资源的触发属性,只有参数变更时才重新查询,避免不必要的资源更新
内容的提问来源于stack exchange,提问作者diegoaguilar
相关产品推荐
相关产品推荐

