Terraform:如何修改由模块 'vpc' 创建的 public 子网的路由 table?

Terraform: How to modify a public subnet's route table that was created by module 'vpc'?

我使用 vpc 模块通过以下代码创建了我的 VPC:

module "vpc" {
  source = "terraform-aws-modules/vpc/aws"
  name = "${var.namespace}-vpc"
  cidr = "10.0.0.0/16"
  azs = data.aws_availability_zones.available.names
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
  public_subnets = ["10.0.101.0/24", "10.0.102.0/24"]
  #assign_generated_ipv6_cidr_block = true
  create_database_subnet_group     = true
  enable_nat_gateway               = true
  single_nat_gateway               = true
  enable_dns_hostnames = true
  enable_dns_support   = true
}

此模块自动创建两个 public 子网,其中有一个指向互联网网关的路由 table。但是,我想修改两个 public 子网之一,使其具有指向我创建的防火墙的不同路由 table。

我所做的是创建一个新路由 table pub_to_firewall,然后创建一个新 aws_route_table_association 将 public 子网与新路由 table.

resource "aws_route_table_association" "sn_to_fw_rt_association" {
  subnet_id      = module.vpc.public_subnets[0]
  route_table_id = aws_route_table.pub_to_firewall.id
  depends_on = [
    aws_route_table.pub_to_firewall,
  ]
}

我已经能够按照说明将原始关联导入到这个新关联中,并且 terraform apply 让 public 子网拥有这个新路由 table 包含防火墙参考。

但是,当我再次 运行 terraform apply 时,terraform 现在想回到 'default' 关联:

Objects have changed outside of Terraform

Terraform detected the following changes made outside of Terraform since the last "terraform apply":

  # module.networking.module.vpc.aws_route_table_association.public[0] has been deleted
  - resource "aws_route_table_association" "public" {
      - id             = "rtbassoc-[ ]" -> null
      - route_table_id = "rtb-0cabc2388adXXXXX" -> null
      - subnet_id      = "subnet-0a2b011cd7aXXXXX" -> null
    }


Unless you have made equivalent changes to your configuration, or ignored the relevant attributes using ignore_changes, the following plan may include actions to undo or respond to these
changes.
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
  ~ update in-place

Terraform will perform the following actions:


  # module.networking.module.vpc.aws_route_table_association.public[0] will be created
  + resource "aws_route_table_association" "public" {
      + id             = (known after apply)
      + route_table_id = "rtb-0cabc2388adXXXXX"
      + subnet_id      = "subnet-0a2b011cd73XXXXX"
    }

我不希望重新创建此资源,因为它会抛出一个错误 │ Error: error creating Route Table (rtb-0cabc2388adXXXXX) Association: Resource.AlreadyAssociated: the specified association for route table rtb-0cabc2388adXXXXX conflicts with an existing association 显然因为我已经将它与新路由相关联 table.

我怎样才能:

  1. 强制 terraform 'ignore' 默认子网路由 table 设置
  2. 或者更新 vpc 创建的 aws_route_table_association 资源 module.networking.module.vpc.aws_route_table_association.public[0] 以引用新路由 table?

您无法更改它,因为这就是 aws vpc 模块的工作方式。为此,您需要定制设计的 VPC。因此,您必须分叉整个模块并进行所需的更改,或者根据您的需要从头开始创建新的 VPC 模块。

感谢 Marcin 的回答!我做了更多研究并询问了一些人,最初决定使用 'vpc' 模块来设置初始基础设施似乎是要权衡修改单个资源是不可能的。

我在下面采取的步骤是保留我需要的现有子网等而不破坏它们。更改子网将意味着破坏我们不想要的关联 EC2 实例等。

因此,我不得不执行逐个资源重新创建基础架构的繁琐步骤。以下是我对未来感兴趣的人的步骤:

  1. 运行 terraform state list 查看与 vpc 模块关联的所有资源,您可以过滤以查看 module.networking.module.vpc.aws_eip.nat[0], module.networking.module.vpc.aws_internet_gateway.this[0] 等等等等

  2. 对于module.networking.module.vpc列表下的每个资源,分别重新创建资源。例如,如果您需要私有子网,则创建一个新的 aws_subnet 资源。这会很痛苦,但您需要更改其他资源中指向 Terraform 代码中旧资源的所有链接,以指向这些新资源。

  3. 创建每个单独的资源后,告诉 Terraform 将现有资源指向您要创建的新资源(记得先 terraform init 以便 Terraform 知道新资源)示例 terraform state mv module.networking.module.vpc.aws_subnet.private[0] module.vpc.aws_subnet.private_subnet_1