向 terraform 模块添加计数

din*_*dam 8 state module file terraform

在添加计数之前,我已经通过下面列出的此模块部署了我的 VPC。

这工作得很好,但是要改变我们的基础设施,我需要向模块添加一个计数

module "core_vpc" {
  source = "./modules/vpc"

  count          = var.environment == "qa" || var.environment == "production" ? 1 : 0
  aws_region     = var.aws_region
  environment    = var.environment
  system         = var.system
  role           = var.system
  vpc_name       = var.system
  vpc_cidr       = var.vpc_cidr
  ssh_key_name   = var.ssh_key_name
  ssh_key_public = var.ssh_key_public
  nat_subnets    = var.nat_subnets
  nat_azs        = var.vpc_subnet_azs

}
Run Code Online (Sandbox Code Playgroud)

现在 Terraform 想要更新我的状态文件并销毁我的大部分配置,并将其替换为下面示例中所示的内容。这当然不仅限于路由关联,还包括模块内创建的所有资源。我不能让这种情况发生,因为我正在运行生产并且不想弄乱它。

 module.K8_subnets.aws_route_table_association.subnet[0] will be destroyed

Run Code Online (Sandbox Code Playgroud)

并将其替换为:

module.K8_subnets[0].aws_route_table_association.subnet[0] will be created
Run Code Online (Sandbox Code Playgroud)

有没有办法阻止 Terraform 进行这些更改?无法在 tf 状态下手动更改它。我想要的只是 VPC 不部署在 DEV 中。

谢谢。

luk*_*302 6

您可以使用“移动”地形状态tf state mv src target。具体来说,您可以将旧的非计数器版本移动到索引 0 处的新计数版本:

terraform state mv 'module.K8_subnets' 'module.K8_subnets[0]'
Run Code Online (Sandbox Code Playgroud)

这适用于单个资源以及整个模块。它也适用于for_each资源,在那里你不会有索引,但有一个可以移动到的键。如果您删除/但仍想保留资源,甚至可以相反。countfor_each

  • @Thayne 是的,这就是为什么 terraform 不久前引入了一个 `moved { }` 块:https://www.terraform.io/language/modules/develop/refactoring (3认同)