【问题标题】:Disable a resource using count for specific environment with terraform使用 terraform 针对特定环境的计数禁用资源
【发布时间】:2020-08-13 17:45:21
【问题描述】:

我正在尝试禁用特定环境的资源,在这种情况下,它是 qa 环境,我只希望为生产和登台创建资源。 我有相同的 terraform 代码,可通过管道运行 qa、登台和生产。

我有一些用于创建 ECS 集群的代码。我不希望它为 qa 环境创建。 这是在 ECS 上创建集群的代码:

resource "aws_ecs_cluster" "main" {
  name = "${terraform.workspace}-main"

  tags = {
    App         = var.app_name
    Environment = terraform.workspace
  }
}

output "main_ecs_id" {
  value = aws_ecs_cluster.main.id
}

我尝试使用 count 来禁用 qa 环境,这很有效:


resource "aws_ecs_cluster" "main" {
  count   = terraform.workspace != "qa" ? 1 : 0

  name = "${terraform.workspace}-main"

  tags = {
    App         = var.app_name
    Environment = aws_ecs_cluster.main[count.index].name
  }
}

output "main_ecs_id" {
  value = aws_ecs_cluster.main.*.id
}


唯一的问题是它不适用于我希望创建资源的环境(生产和暂存)。 当它尝试在生产和登台时使用该代码创建资源时,我收到此错误:

Error: Self-referential block
on ecs.tf line 8, in resource "aws_ecs_cluster" "main":
8:     Environment = aws_ecs_cluster.main[count.index].name
Configuration for aws_ecs_cluster.main may not refer to itself.

知道我做错了什么吗? 谢谢

【问题讨论】:

    标签: terraform


    【解决方案1】:

    您的问题与使用计数禁用资源无关,只是您不能在其内部引用资源(使用 self keyword 的供应商是这里的例外,但它们是资源的额外内容)。

    相反,您需要重新构建名称或将名称字符串提取到本地:

    resource "aws_ecs_cluster" "main" {
      count = terraform.workspace != "qa" ? 1 : 0
    
      name = "${terraform.workspace}-main"
    
      tags = {
        App         = var.app_name
        Environment = "${terraform.workspace}-main"
      }
    }
    

    或与当地人:

    locals {
      cluster_name = "${terraform.workspace}-main"
    }
    
    resource "aws_ecs_cluster" "main" {
      count = terraform.workspace != "qa" ? 1 : 0
    
      name = local.cluster_name
    
      tags = {
        App         = var.app_name
        Environment = local.cluster_name
      }
    }
    

    使用locals 只允许您处理资源块之外已知的事情(例如您的字符串连接)。如果您想要依赖资源块中的counteach 的东西,那么您将无法使用它。有一个 existing issue 将资源范围的本地人作为一项出色的功能请求。

    【讨论】:

    • 谢谢,在不自引用集群的情况下如何禁用资源?
    • 和你一样。禁用资源根本没有链接到自引用。如果您尝试我的答案中的任何一个示例,您会收到错误消息吗?
    • 谢谢你的作品。用了第一个例子。出于某种原因,我认为如果使用计数,我需要在资源中的其他地方引用它。欣赏它
    • 我只需将其添加到输出中:output "main_ecs_id" { value = terraform.workspace != "qa" ? aws_ecs_cluster.main[0].id : null }
    猜你喜欢
    • 2022-01-23
    • 2020-11-17
    • 1970-01-01
    • 2020-06-02
    • 2017-09-21
    • 1970-01-01
    • 2018-01-17
    • 2021-02-19
    • 2019-07-22
    相关资源
    最近更新 更多