You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 11:24:09