我正在尝试为特定环境禁用资源,在这种情况下为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.
知道我可能做错了什么吗? 谢谢
答案 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仅允许您处理在资源块之外已知的事情(例如,字符串串联)。如果您想要某种依赖于资源块中的count
或each
的东西,那么您将无法使用它。有existing issue涵盖了资源范围内的本地人,作为出色的功能请求。