Terraform每次添加一个配置块时,都会尝试在循环中重新排序和重新创建配置块

Terraform每次添加一个配置块时,都会尝试在循环中重新排序和重新创建配置块,terraform,Terraform,在循环中修改配置块时,我看到一些奇怪的行为 看起来Terraform正在使用配置块或其他东西: // example map variable "my_apps" { type = map(object({ app-type-1 = list(string) })) default = { us-east-1 = { app-type-1 = [ "app1", ] }

在循环中修改配置块时,我看到一些奇怪的行为

看起来Terraform正在使用配置块或其他东西:

// example map
variable "my_apps" {
  type = map(object({
    app-type-1 = list(string)
  }))

  default = {
    us-east-1 = {
      app-type-1 = [
        "app1",
      ]
    }
    us-west-2 = {
      app-type-1 = [
        "app1",
        "app2",
        "app3"
      ]
    }
  }
}

// loop over map
resource "aws_elastic_beanstalk_configuration_template" "mytemplate" {
  depends_on = [aws_elastic_beanstalk_application.myapp]
  provider      = aws.us-west-2
  for_each = toset(var.beanstalk_applications["us-west-2"]["app-type-1"])
  name = "app-type1-base"
  application = each.value
  solution_stack_name = "64bit Amazon Linux 2015.09 v2.0.8 running Go 1.4"
  setting {
    namespace = "aws:ec2:vpc"
    name = "VPCId"
    value = "blah"
  }
  setting {
    namespace = "aws:ec2:vpc"
    name = "Subnets"
    value = "blah"
  }
  // added this
  setting {
    namespace = "aws:ec2:vpc"
    name = "ELBSubnets"
    value = "blah"
  }
}
当我添加一个新的块时,地形会重新排列整个东西

+ setting {
    + name      = "ELBSubnets"
    + namespace = "aws:ec2:vpc"
    + value     = "blah"
  }
- setting {
    - name      = "Subnets" -> null
    - namespace = "aws:ec2:vpc" -> null
    - value     = "blah" -> null
  }
+ setting {
    + name      = "Subnets"
    + namespace = "aws:ec2:vpc"
    + value     = "blah"
  }
- setting {
    - name      = "VPCId" -> null
    - namespace = "aws:ec2:vpc" -> null
    - value     = "blah" -> null
  }
+ setting {
    + name      = "VPCId"
    + namespace = "aws:ec2:vpc"
    + value     = "blah"
  }

查看此资源的代码:

设置
参数不强制新资源,是的,您看到的有点烦人,但没有任何害处

  "setting": {
    Type:     schema.TypeSet,
    Optional: true,
    Computed: true,
    Elem:     resourceAwsElasticBeanstalkOptionSetting(),
    Set:      optionSettingValueHash,
  },
  "solution_stack_name": {
    Type:     schema.TypeString,
    Optional: true,
    ForceNew: true,
  },
一个解决方案是用一种能保持给定顺序的字体来替换该字体,但可能会有副作用


可以尝试使用动态嵌套块,例如:

provider "aws" {
  region      = "us-east-1"
}

resource "aws_elastic_beanstalk_configuration_template" "mytemplate" {  
  for_each = toset(["app1", "app2"])
  name = "app-type1-base"
  application = each.value
  solution_stack_name = "64bit Amazon Linux 2015.09 v2.0.8"

  dynamic "setting" {
    for_each = toset(sort(["ELBSubnets", "Subnets", "VPCId"]))
    content {
      namespace = "aws:ec2:vpc"
      name = setting.value
      value = "blah"
    }
  }
}
toset(排序([“子网”、“子网”、“VPCId”)


应始终保持它们的有序性查看此资源的代码:

设置
参数不强制新资源,是的,您看到的有点烦人,但没有任何害处

  "setting": {
    Type:     schema.TypeSet,
    Optional: true,
    Computed: true,
    Elem:     resourceAwsElasticBeanstalkOptionSetting(),
    Set:      optionSettingValueHash,
  },
  "solution_stack_name": {
    Type:     schema.TypeString,
    Optional: true,
    ForceNew: true,
  },
一个解决方案是用一种能保持给定顺序的字体来替换该字体,但可能会有副作用


可以尝试使用动态嵌套块,例如:

provider "aws" {
  region      = "us-east-1"
}

resource "aws_elastic_beanstalk_configuration_template" "mytemplate" {  
  for_each = toset(["app1", "app2"])
  name = "app-type1-base"
  application = each.value
  solution_stack_name = "64bit Amazon Linux 2015.09 v2.0.8"

  dynamic "setting" {
    for_each = toset(sort(["ELBSubnets", "Subnets", "VPCId"]))
    content {
      namespace = "aws:ec2:vpc"
      name = setting.value
      value = "blah"
    }
  }
}
toset(排序([“子网”、“子网”、“VPCId”)


应该始终保持它们的顺序

但是如果我更改顺序,tf会尝试删除/添加回设置吗?我认为foreach在状态中创建了key=>值的映射,而count只是创建了一个数组。我在想,每个“设置”配置块都会在状态中绑定到自己的键,配置的顺序无关紧要。也许我把一些东西混在一起了,我现在也把动态块和静态配置的设置混在一起了。因此,我有一些单独定义的设置块,还有一个动态设置块-指定区域设置,然后在共享设置地图上循环所有区域使用抱歉@red888我不确定我是否遵循您的评论
foreach创建了一个key=>value的映射
是的,它对资源有效,但对动态块无效。但我的回答的要点是:setting参数不强制新资源您可能不想看到所有这些更改,但它非常好,但是如果我更改顺序,tf会尝试删除/添加回设置吗?我认为foreach在状态中创建了key=>值的映射,而count只是创建了一个数组。我在想,每个“设置”配置块都会在状态中绑定到自己的键,配置的顺序无关紧要。也许我把一些东西混在一起了,我现在也把动态块和静态配置的设置混在一起了。因此,我有一些单独定义的设置块,还有一个动态设置块-指定区域设置,然后在共享设置地图上循环所有区域使用抱歉@red888我不确定我是否遵循您的评论
foreach创建了一个key=>value的映射
是的,它为资源创建了映射,但不为动态块创建映射u