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

如何通过Terraform为AWS VPC安全组添加500+独立IP入站规则?

解决AWS安全组添加500+独立IP的问题

核心原理

AWS安全组规则确实要求使用CIDR块,但单个IP可以通过IP地址/32的格式来表示,这等价于仅允许该单一IP访问。比如示例中的192.168.0.64,写成192.168.0.64/32就能被安全组正确识别。

针对500+IP的两种实现方案

方案一:使用前缀列表(推荐,适配大量IP场景)

AWS前缀列表(Prefix List)可批量管理多个CIDR块,安全组规则只需引用前缀列表即可,无需创建数百条单独规则,既简洁又能规避安全组规则数量限制(单安全组默认最多100条规则,前缀列表默认支持最多1000个条目,完全覆盖500+IP的需求)。

Terraform代码示例

  1. 定义带/32格式的IP列表变量
variable "allowed_deploy_ips" {
  type        = list(string)
  description = "部署网关IP列表,需转换为x.x.x.x/32格式"
  default     = [
    "192.168.0.64/32",
    "10.1.2.3/32",
    # 添加上其余500+个IP的/32格式条目
  ]
}
  1. 创建前缀列表
resource "aws_ec2_managed_prefix_list" "deploy_gateways" {
  name           = "deploy-gateway-ips"
  address_family = "IPv4"
  max_entries    = length(var.allowed_deploy_ips) # 设置为IP总数,确保容纳所有条目

  dynamic "entry" {
    for_each = var.allowed_deploy_ips
    content {
      cidr      = entry.value
      description = "部署网关授权IP"
    }
  }
}
  1. 在默认安全组中引用前缀列表
resource "aws_security_group" "default_vpc_sg" {
  name        = "default-vpc-security-group"
  description = "允许部署网关访问的默认VPC安全组"
  vpc_id      = aws_vpc.default.id # 替换为你的VPC ID

  # 按需配置开放的端口范围,示例为开放所有TCP端口
  ingress {
    from_port        = 0
    to_port          = 65535
    protocol         = "tcp"
    prefix_list_ids  = [aws_ec2_managed_prefix_list.deploy_gateways.id]
  }

  # 保留默认出站规则(按需调整)
  egress {
    from_port   = 0
    to_port     = 65535
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

方案二:动态生成安全组规则(仅适合IP数量≤100的场景)

如果IP数量在安全组规则上限内(单安全组默认最多100条入站规则),可以用dynamic块为每个/32 CIDR生成单独规则,但500+IP会超出限制,仅作参考:

variable "allowed_deploy_ips" {
  type        = list(string)
  description = "部署网关IP列表,需转换为x.x.x.x/32格式"
  default     = [
    "192.168.0.64/32",
    "10.1.2.3/32",
    # 其余IP条目
  ]
}

resource "aws_security_group" "default_vpc_sg" {
  name        = "default-vpc-security-group"
  description = "允许部署网关访问的默认VPC安全组"
  vpc_id      = aws_vpc.default.id

  dynamic "ingress" {
    for_each = var.allowed_deploy_ips
    content {
      from_port   = 22 # 替换为实际需要开放的端口
      to_port     = 22
      protocol    = "tcp"
      cidr_blocks = [ingress.value]
      description = "部署网关IP访问授权"
    }
  }

  egress {
    from_port   = 0
    to_port     = 65535
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

注意事项

  • 前缀列表的max_entries必须大于等于实际IP数量,否则创建会失败。
  • 端口范围按需配置,避免过度开放不必要的端口。
  • 若IP数量远超100且前缀列表容量不够,可拆分IP到多个前缀列表,或给实例关联多个安全组分别配置规则。

内容的提问来源于stack exchange,提问作者snowcoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:07:49