使用带有Terraform的特定环境的计数禁用资源

时间:2020-08-13 09:19:33

标签: terraform

我正在尝试为特定环境禁用资源,在这种情况下为qa环境,我只希望为生产和登台创建该资源。 我有通过管道运行以进行质量检查,登台和生产的terraform代码。

我有一些用于创建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禁用质量检查环境,并且可行:


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.

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

1 个答案:

答案 0 :(得分:2)

您的问题与禁用具有数量的资源无关,只是您不能引用其内部的资源(此处使用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涵盖了资源范围内的本地人,作为出色的功能请求。