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

如何通过单个变量切换Terraform AWS VPC NAT网关的四种模式?

单个变量实现Terraform AWS VPC NAT网关四种模式切换

当前使用三个布尔变量控制NAT网关配置,维护时易产生逻辑混淆,可通过单个枚举类型变量统一切换四种NAT网关状态:

  • NATGW disabled(禁用)
  • single NATGW(单NAT网关)
  • 1 NATGW per subnet(每个子网一个NAT网关)
  • 1 NATGW per AZ(每个可用区一个NAT网关)

实现步骤

1. 定义新的统一控制变量

替换原三个布尔变量,新增带值校验的字符串变量,限定可选模式:

variable "nat_gateway_mode" {
  description = "控制NAT网关的部署模式,可选值:disabled、single、per_subnet、per_az"
  type        = string
  default     = "disabled"
  validation {
    condition     = contains(["disabled", "single", "per_subnet", "per_az"], var.nat_gateway_mode)
    error_message = "nat_gateway_mode 必须是 disabled、single、per_subnet、per_az 中的一个。"
  }
}

2. 用本地值映射模式到原布尔变量

通过locals将新模式值转换为VPC模块需要的三个布尔参数,避免模块调用中写复杂逻辑:

locals {
  nat_gateway_config = {
    disabled = {
      enable_nat_gateway     = false
      single_nat_gateway     = false
      one_nat_gateway_per_az = false
    }
    single = {
      enable_nat_gateway     = true
      single_nat_gateway     = true
      one_nat_gateway_per_az = false
    }
    per_subnet = {
      enable_nat_gateway     = true
      single_nat_gateway     = false
      one_nat_gateway_per_az = false
    }
    per_az = {
      enable_nat_gateway     = true
      single_nat_gateway     = false
      one_nat_gateway_per_az = true
    }
  }
}

3. 修改VPC模块调用

将原三个布尔变量参数替换为本地值中的映射结果:

module "vpc" {
  source                 = "terraform-aws-modules/vpc/aws"
  name                   = var.vpc_name
  cidr                   = var.vpc_cidr
  azs                    = slice(data.aws_availability_zones.available.names, 0, local.selected_azs)
  private_subnets        = var.ath_private_subnet_block
  public_subnets         = var.ath_public_subnet_block
  # 用本地映射值替换原三个布尔变量
  enable_nat_gateway     = local.nat_gateway_config[var.nat_gateway_mode].enable_nat_gateway
  single_nat_gateway     = local.nat_gateway_config[var.nat_gateway_mode].single_nat_gateway
  one_nat_gateway_per_az = local.nat_gateway_config[var.nat_gateway_mode].one_nat_gateway_per_az
}

4. 调整手动创建的EIP资源(可选)

原代码中手动创建的aws_eip.nat资源,使用官方VPC模块时通常无需手动维护——模块会自动根据NAT网关配置创建对应数量的EIP。若需手动管理,可通过count控制是否创建:

resource "aws_eip" "nat" {
  # 仅当NAT网关未禁用时创建
  count = var.nat_gateway_mode != "disabled" ? 1 : 0
  vpc   = true
}

使用示例

只需设置nat_gateway_mode的值即可切换模式:

  • 禁用NAT网关:nat_gateway_mode = "disabled"
  • 单NAT网关:nat_gateway_mode = "single"
  • 每个子网一个NAT网关:nat_gateway_mode = "per_subnet"
  • 每个可用区一个NAT网关:nat_gateway_mode = "per_az"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:40:50