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

移除Terraform中NAT网关与弹性IP后Django应用无法启动

移除AWS NAT网关后Fargate Django应用部署异常问题

我正在尝试降低通过Terraform部署在AWS上的Django应用的基础设施成本。当前环境包含2个公有子网和2个私有子网,部署了NAT网关(NAT Gateways)和弹性IP(Elastic IPs),功能正常但成本较高。由于目前不需要私有网络的出站连接,我考虑移除NAT网关和弹性IP,对网络模块做了如下修改(注释掉NAT网关与弹性IP相关资源):

resource "aws_vpc" "main" {
  cidr_block           = "10.1.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = merge(
    var.common_tags,
    tomap({ "Name" = "${var.prefix}-vpc" })
  )
}

resource "aws_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id

  tags = merge(
    var.common_tags,
    tomap({ "Name" = "${var.prefix}-main" })

  )
}
#####################################################
# Public Subnets - Inbound/Outbound Internet Access #
#####################################################
resource "aws_subnet" "public_a" {
  cidr_block              = "10.1.1.0/24"
  map_public_ip_on_launch = true
  vpc_id                  = aws_vpc.main.id
  availability_zone       = "${var.region}a"

  tags = merge(
    var.common_tags,
    tomap({ "Name" = "${var.prefix}-public-a" })
  )
}

resource "aws_route_table" "public_a" {
  vpc_id = aws_vpc.main.id

  tags = merge(
    var.common_tags,
    tomap({ "Name" = "${var.prefix}-public-a" })
  )
}

resource "aws_route_table_association" "public_a" {
  subnet_id      = aws_subnet.public_a.id
  route_table_id = aws_route_table.public_a.id
}

resource "aws_route" "public_internet_access_a" {
  route_table_id         = aws_route_table.public_a.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.main.id
}

# resource "aws_eip" "public_a" {
#   vpc = true

#   tags = merge(
#     var.common_tags,
#     tomap({ "Name" = "${var.prefix}-public-a" })
#   )
# }

# resource "aws_nat_gateway" "public_a" {
#   allocation_id = aws_eip.public_a.id
#   subnet_id     = aws_subnet.public_a.id

#   tags = merge(
#     var.common_tags,
#     tomap({ "Name" = "${var.prefix}-public-a" })
#   )
# }

resource "aws_subnet" "public_b" {
  cidr_block              = "10.1.2.0/24"
  map_public_ip_on_launch = true
  vpc_id                  = aws_vpc.main.id
  availability_zone       = "${var.region}b"

  tags = merge(
    var.common_tags,
    tomap({ "Name" = "${var.prefix}-public-b" })
  )
}

resource "aws_route_table" "public_b" {
  vpc_id = aws_vpc.main.id

  tags = merge(
    var.common_tags,
    tomap({ "Name" = "${var.prefix}-public-b" })
  )
}

resource "aws_route_table_association" "public_b" {
  subnet_id      = aws_subnet.public_b.id
  route_table_id = aws_route_table.public_b.id
}

resource "aws_route" "public_internet_access_b" {
  route_table_id         = aws_route_table.public_b.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.main.id
}

# resource "aws_eip" "public_b" {
#   vpc = true

#   tags = merge(
#     var.common_tags,
#     tomap({ "Name" = "${var.prefix}-public-b" })
#   )
# }

# resource "aws_nat_gateway" "public_b" {
#   allocation_id = aws_eip.public_b.id
#   subnet_id     = aws_subnet.public_b.id

#   tags = merge(
#     var.common_tags,
#     tomap({ "Name" = "${var.prefix}-public-b" })
#   )
# }


##################################################
# Private Subnets - Outbound internt access only #
##################################################
resource "aws_subnet" "private_a" {
  cidr_block        = "10.1.10.0/24"
  vpc_id            = aws_vpc.main.id
  availability_zone = "${var.region}a"

  tags = merge(
    var.common_tags,
    tomap({ "Name" = "${var.prefix}-private-a" })
  )
}

resource "aws_route_table" "private_a" {
  vpc_id = aws_vpc.main.id

  tags = merge(
    var.common_tags,
    tomap({ "Name" = "${var.prefix}-private-a" })
  )
}

resource "aws_route_table_association" "private_a" {
  subnet_id      = aws_subnet.private_a.id
  route_table_id = aws_route_table.private_a.id
}

# resource "aws_route" "private_a_internet_out" {
#   route_table_id         = aws_route_table.private_a.id
#   nat_gateway_id         = aws_nat_gateway.public_a.id
#   destination_cidr_block = "0.0.0.0/0"
# }

resource "aws_subnet" "private_b" {
  cidr_block        = "10.1.11.0/24"
  vpc_id            = aws_vpc.main.id
  availability_zone = "${var.region}b"

  tags = merge(
    var.common_tags,
    tomap({ "Name" = "${var.prefix}-private-b" })
  )
}

resource "aws_route_table" "private_b" {
  vpc_id = aws_vpc.main.id

  tags = merge(
    var.common_tags,
    tomap({ "Name" = "${var.prefix}-private-b" })
  )
}

resource "aws_route_table_association" "private_b" {
  subnet_id      = aws_subnet.private_b.id
  route_table_id = aws_route_table.private_b.id
}

# resource "aws_route" "private_b_internet_out" {
#   route_table_id         = aws_route_table.private_b.id
#   nat_gateway_id         = aws_nat_gateway.public_b.id
#   destination_cidr_block = "0.0.0.0/0"
# }

直接部署该配置时,访问端点/DNS会出现503错误,且CloudWatch中无容器日志;取消注释相关部分重新部署则一切正常。奇怪的是,若先部署带NAT的配置,再注释NAT相关部分并执行terraform plan和apply,服务却能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:20:39