Terraform 地形不';我似乎不喜欢手工修改
我有一个非常令人沮丧的地形问题,我对我的地形脚本做了一些更改,但在应用该计划时失败了。我经历了一系列的阴谋,可能使情况变得更糟,因为为了解决这个问题,我最终手动删除了一堆AWS资源。Terraform 地形不';我似乎不喜欢手工修改,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我有一个非常令人沮丧的地形问题,我对我的地形脚本做了一些更改,但在应用该计划时失败了。我经历了一系列的阴谋,可能使情况变得更糟,因为为了解决这个问题,我最终手动删除了一堆AWS资源。 所以现在我根本无法使用Terraform(刷新、计划、销毁),所有这些都会出现相同的错误 形势 我有一个Fargate服务列表和一组映射,它们关联Fargate服务的不同功能,例如负载平衡器的“目标组”(我在下面提供了一些代码)。问题似乎是Terraform没有意识到这些资源已经被手动删除,或者因为它们不存在而变得
所以现在我根本无法使用Terraform(刷新、计划、销毁),所有这些都会出现相同的错误 形势 我有一个Fargate服务列表和一组映射,它们关联Fargate服务的不同功能,例如负载平衡器的“目标组”(我在下面提供了一些代码)。问题似乎是Terraform没有意识到这些资源已经被手动删除,或者因为它们不存在而变得混乱。此时,如果我运行刷新、计划或销毁,我会收到一个错误,指出特定列表为空,即使它不是(或不应该是)。
在失败的运行中,我在下面的列表中添加了一个新服务以及一个新的url(请参阅下面的代码) 客观的 然而,在这一点上,我会满足于破坏整个环境(我的开发环境);理想情况下,我只想让系统正常工作,以便Terraform能够检测到变化并正常工作 地形脚本是有效的 我已经将我的Terraform脚本恢复到最后一个已知的良好版本。我已经在我们的登台环境下运行了这个好版本,它运行得很好 配置信息 马科斯莫哈韦10.14.6(18G103) 地形v0.12.24
- provider.archive v1.3.0
- provider.aws v2.57.0
- provider.random v2.2.1
- provider.template v2.1.2
Terraform init--reconfigure
我所做的
我最初收到了一个类似的错误,但它在不同的位置,在谷歌搜索和尝试了很多小时后(我没有写下来),我决定手动删除与问题代码相关的AWS资源(ALB、目标组、安全组)
地形脚本示例
不幸的是,我不能发布实际的脚本,因为它是私有的,但我已经发布了我认为是相关的部分,但已经编辑了一些信息。我提到这一点的原因是,您可能看到的任何语法类型错误都将由该修订引起,正如我在上面所述,在我们的登台环境中运行时,脚本工作正常。globalvars.tf 在根目录中。在Terraform运行失败的情况下,我在
服务名称(edd=“edd”
)列表中添加了一个新名称(我添加为第一个元素)。在service\u name\u map\u 2\u url
中,我添加了新条目(edd=“edd”
)作为最后一个条目。我不确定我以不同的“顺序”添加这些元素是否是问题所在,尽管这确实不应该,因为我通过名称而不是索引访问地图
variable "service_names" {
type = list(string)
description = "This is a list/array of the images/services for the cluster"
default = [
"alert",
"alert-config"
]
}
variable service_name_map_2_url {
type = map(string)
description = "This map contains the base URL used for the service"
default = {
alert = "alert"
alert-config = "alert-config"
}
}
alb.tf
在模块/alb
中。在这个模块中,我们为每个服务创建一个ALB,然后创建一个目标组,如下所示。globalvars.tf中的项目被传递到此脚本中
locals {
numberOfServices = length(var.service_names)
}
resource "aws_alb" "orchestration_alb" {
name = "orchestration-alb"
subnets = var.public_subnet_ids
security_groups = [var.alb_sg_id]
tags = {
environment = var.environment
group = var.tag_group_name
app = var.tag_app_name
contact = var.tag_contact_email
}
}
resource "aws_alb_target_group" "orchestration_tg" {
count = local.numberOfServices
name = "${var.service_names[count.index]}-tg"
port = 80
protocol = "HTTP"
vpc_id = var.vpc_id
target_type = "ip"
deregistration_delay = 60
tags = {
environment = var.environment
group = var.tag_group_name
app = var.tag_app_name
contact = var.tag_contact_email
}
health_check {
path = "/${var.service_name_map_2_url[var.service_names[count.index]]}/health"
port = var.app_port
protocol = "HTTP"
healthy_threshold = 2
unhealthy_threshold = 5
interval = 30
timeout = 5
matcher = "200-308"
}
}
output.tf
这是alb.tf
的输出,输出了其他内容,但这是与此问题相关的内容
output "target_group_arn_suffix" {
value = aws_alb_target_group.orchestration_tg.*.arn_suffix
}
cloudwatch.tf
在模块/cloudwatch
中。我尝试创建一个仪表板
data "template_file" "Dashboard" {
template = file("${path.module}/dashboard.json.template")
vars = {
...
alert-tg = var.target_group_arn_suffix[0]
alert-config-tg = var.target_group_arn_suffix[1]
edd-cluster-name = var.ecs_cluster_name
alb-arn-suffix = var.alb-arn-suffix
}
}
错误
当我运行terraform refresh
(或plan或destroy)时,我得到以下错误(对于警报配置,我也得到相同的错误)
AWS环境
我已手动删除了ALB
<代码>仪表板
和所有目标群体
。我希望Terraform能够检测到这一点,并适当更新其状态文件,以便在运行计划时知道必须创建ALB和目标组。
谢谢大地形态相信它的状态是唯一的真理之源。在人工改变的情况下使用地形是可能的,但有问题
如果手动删除基础结构,则需要在手动删除的资源上运行terraform state rm[resource path]
:
实时存储库的主分支应该是实际部署在生产中的内容的1:1表示
然而,我认为你的回答是正确的;根据一位同事的建议,我最终(暂时)解决了这个问题,在受影响的对象中添加或修改“count”变量,以便它首先检查数组大小,如果是0,则我将count设置为0(这会导致Terraform跳过元素)。
Error: Invalid index
on modules/cloudwatch/cloudwatch.tf line 146, in data "template_file" "Dashboard":
146: alert-tg = var.target_group_arn_suffix[0]
|----------------
| var.target_group_arn_suffix is empty list of string
The given key does not identify an element in this collection value.