【问题标题】:Terraform dynamic inside dynamicTerraform 动态内部动态
【发布时间】:2020-11-06 02:41:20
【问题描述】:

这个想法是生成这样的东西:

  environment {
    ...

    environment_variable {
      ...
    }

    environment_variable {
      ...
    }
  }

其中有一个具有某些属性的环境块和具有某些属性的 0...n environment_variables。

我有以下模块,它在动态中使用动态。这可能吗?或者我将如何实现这一目标?

到目前为止,我所拥有的是以下模块,它在动态内部使用动态:

模块:

dynamic "environment" {
  for_each = var.environment_definition

  content {
    field1 = environment.value.field1
    field2 = environment.value.field2

    dynamic "environment_variable" {
      for_each = length(var.environment_variables) == 0 ? [] : [var.environment_variables]

      content {
        name  = environment_variable.value.env_name
        value = environment_variable.value.env_value
      }
    }
  }
}

变量.tf:

variable "environment_definition" {
  description = ""
  type = any
  default = {}
}

variable "environment_variables" {
  description = ""
  type = map(object({
    env_name  = string
    env_value = string
  }))
  default = {}
}

上面的模块及其变量在我的 main.tf 中被调用:

  environment_definition = {
    field1                = "value"
    field2                = "value"
  }

  environment_variables = {
    tf_version = {
      env_name  = "TERRAFORM_VERSION"
      env_value = "0.12.28"
    },
    aws_account = {
      env_name  = "AWS_ACCOUNT"
      env_value = "Account123456"
    },
    environment = {
      env_name  = "ENVIRONMENT"
      env_value = "dev"
    }
  }

但是我收到了这个错误:

Error: Missing map element

  on ../../../modules/codebuild/main.tf line 123, in resource "aws_codebuild_project" "this":
 152:           value = environment_variable.value.env_value
    |----------------
    | environment_variable.value is map of object with 3 elements

This map does not have an element with the key "env_value".

我怎样才能成功地实现这个?

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    问题是你调用了根变量而不是each.value

    content {
            name  = environment_variable.value.env_name
            value = environment_variable.value.env_value
          }
    

    问题是你把你的地图放在一个数组中:

      for_each = length(var.environment_variables) == 0 ? [] : 
       [var.environment_variables]
    

    所以您现在正在处理一组表示第一个元素的地图

    键 = 0 和 值 = tf_version = { env_name = "TERRAFORM_VERSION" env_value = "0.12.28" }

    你的代码应该是:

    dynamic "environment_variable" {
          #solution1
          for_each = var.environment_variable
          #solution 2 am not sure this works but so you get the prob
         for_each = length(var.environment_variables) == 0 ? {} : 
       var.environment_variables
          content {
            name  = environment_variable.value.env_name
            value = environment_variable.value.env_value
          }
        }
    

    而且你应该尝试更改动态名称更好

    content {
            name  = <dynamic_name>.value.env_name
            value = <dynamic_name>.value.env_value
          }
    

    https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each/

    【讨论】:

    • 好吧,看来我需要更多练习基本的 Terraform...我认为 TF 编码起来相当不方便
    • 这是什么意思:name = .value.env_name
    • 你好,我的意思是你应该使用不同的变量名,这样你就不会感到困惑
    【解决方案2】:

    你试过吗?既然你有地图,我认为你应该改用keyvalue

    dynamic "environment" {
      for_each = var.environment_definition
    
      content {
        field1 = environment.value.field1
        field2 = environment.value.field2
    
        dynamic "environment_variable" {
          for_each = length(var.environment_variables) == 0 ? [] : [var.environment_variables]
    
          content {
            name  = environment_variable.key
            value = environment_variable.value
          }
        }
      }
    }
    

    以下示例摘自 Terraform 的博客,并认为它描述了您正在尝试做的事情:

    # Configuration for Terraform 0.12
    
    locals {
      standard_tags = {
        Component   = "user-service"
        Environment = "production"
      }
    }
    
    resource "aws_autoscaling_group" "example" {
      # ...
    
      tag {
        key                 = "Name"
        value               = "example-asg-name"
        propagate_at_launch = false
      }
    
      dynamic "tag" {
        for_each = local.standard_tags
    
        content {
          key                 = tag.key
          value               = tag.value
          propagate_at_launch = true
        }
      }
    }
    

    参考:https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each/

    【讨论】:

    • 你好 Rafael ,如果你看你会发现他已经在使用 key 和 value
    猜你喜欢
    • 1970-01-01
    • 2023-02-21
    • 2020-08-18
    • 1970-01-01
    • 2022-11-04
    • 2023-02-07
    • 2019-04-01
    • 1970-01-01
    相关资源
    最近更新 更多