代码之家  ›  专栏  ›  技术社区  ›  Dilu

列表变量的地形标记不起作用

  •  0
  • Dilu  · 技术社区  · 11 月前

    在尝试创建aws资源时,我在标签中遇到了问题,有人能帮忙吗 但我想将标签与local.tags合并,并添加用于创建资源的标签,我认为这与列表和对象有关,

    provider "aws" {
      region = var.aws_region
      default_tags {
        tags = local.tags
      }
    }
    
    locals {
    
       tags = {
        Application     = var.stack
        Owner           = var.owner
        CostCenter      = var.cost_center
        Project         = var.stack
        environmentCode = var.environment_code
        Environment     = var.environment
        Cmdb            = var.cmdb
      }
    }
    
    data "aws_ssm_parameter" "environment" {
      name = "/ss/environment"
    }
    
    resource "awscc_elasticache_serverless_cache" "elasticache" {
      serverless_cache_name = "${data.aws_ssm_parameter.environment.value}-serverless-elasticache"
      description           = "Generic ElastiCache Redis Serverless"
      engine                = "redis"
      major_engine_version  = 7
      daily_snapshot_time   = "03:00"
      snapshot_retention_limit = 7
      security_group_ids = ["${aws_security_group.elasticache_access.id}"]
      subnet_ids          = module.vpc_data.subnet_ids
      depends_on = [aws_security_group.elasticache_access]
      kms_key_id            =  data.aws_kms_key.ucm.id
      tags = merge(
        local.tags,
        {
          Name   = "${data.aws_ssm_parameter.environment.value}-ucm-elasticache-serverless"
          "Description" = "ECS security group for ${var.stack} running on ${local.environment}"
        },
      )
    }
    

    错误

    错误:属性值类型不正确 在main.tf第68行,在资源“awscc_lasticache_serverless_cache”“elasticache”中: 68:标签=合并( 69:local.tags, 70: { 71:“名称”=“${data.aws_ssm_parameter.environment.value}-ucm-elasticache-serverless", 72:“Description”=“用于ucm的无服务器Elasticache” 73: } 74: ) local.tags是具有7个属性的对象 属性“tags”的值不合适:需要一组对象。

    即使按照 https://registry.terraform.io/providers/hashicorp/awscc/latest/docs/resources/elasticache_serverless_cache

     tags = [{
        Name   = "${data.aws_ssm_parameter.environment.value}-ucm-elasticache-serverless"
        Description = "Elasticache serverless for ucm"
      }]
    

    错误:属性值类型不正确 在main.tf第68行,在资源“awscc_lasticache_serverless_cache”“elasticache”中: 68:标签=[{ 69:名称=“${data.aws_ssm_parameter.environment.value}-ucm-elasticache-serverless" 70:描述=“用于ucm的无服务器Elasticache” 71: }] 属性“tags”的值不适当:元素0:属性“key”为 必修的。

    1 回复  |  直到 11 月前
        1
  •  1
  •   Marko E    11 月前

    根据您链接的文档,标记似乎需要提供:

      tags = [
        {
          key   = "Name"
          value = "${data.aws_ssm_parameter.environment.value}-ucm-elasticache-serverless"
        },
        {
          key   = "Description"
          value = "ECS security group for ${var.stack} running on ${local.environment}"
        }
      ]
    

    换句话说,您似乎需要明确定义关键字 key 对于标记密钥和 value 用于标记值。你必须对你想要的其他标签重复类似的内容,但它可能适用于 default_tags 也确保在运行时检查 terraform plan .

    编辑:由于所有标签都需要 钥匙 价值 keys,一个新的局部变量 elasticache_serverless_tags 可以定义如下:

    locals {
       tags = {
        Application     = var.stack
        Owner           = var.owner
        CostCenter      = var.cost_center
        Project         = var.stack
        environmentCode = var.environment_code
        Environment     = var.environment
        Cmdb            = var.cmdb
      }
    
       elasticache_serverless_tags = [
         {
           key   = "Application"
           value = var.stack
         },
         {
           key   = "Owner"
           value = var.owner
         },
         {
           key   = "CostCenter"
           value = var.cost_center
         },
         {
           key   = "Project"
           value = var.stack
         },
         {
           key   = "environmentCode"
           value = var.environment_code
         },
         {
           key   = "Environment"
           value = var.environment
         },
         {
           key   = "Cmdb"
           value = var.cmdb
         },
      ]
    }
    

    然后,在资源块中:

      tags = toset(concat(local.elasticache_serverless_tags,
      [
        {
          key   = "Name"
          value = "${data.aws_ssm_parameter.environment.value}-ucm-elasticache-serverless"
        },
        {
          key   = "Description"
          value = "ECS security group for ${var.stack} running on ${local.environment}"
        }
      ]))
    

    旧的局部变量 tags 必须保持不变,因为它在中被引用 默认标记(_T) 这需要具有地图。

    第2版:一种更简单的方法,代码重复更少,如下所示:

    locals {
       tags = {
        Application     = var.stack
        Owner           = var.owner
        CostCenter      = var.cost_center
        Project         = var.stack
        environmentCode = var.environment_code
        Environment     = var.environment
        Cmdb            = var.cmdb
      }
    
      elasticsearch_serverless_tags = [for k, v in local.tags : {
        key   = k
        value = v
      }]
    }
    

    这个 concat toset 将与前面的示例中使用的相同 标签 资源的参数。