Jim*_* M. 4 terraform terraform-provider-aws
我有一个非常令人沮丧的 Terraform 问题,我对我的 terraform 脚本进行了一些更改,但在应用该计划时失败了。我经历了一堆阴谋,可能使情况变得更糟,因为我最终手动删除了一堆 AWS 资源来尝试解决这个问题。
所以现在我根本无法使用 Terraform(刷新、计划、销毁)都得到相同的错误。
我有一个 Fargate 服务列表,以及一组关联 Fargate 服务不同功能的地图,例如负载均衡器的“目标组”(我在下面提供了一些代码)。问题似乎是 Terraform 没有发现这些资源已被手动删除,或者因为它们不存在而不知何故变得混乱。此时,如果我运行刷新、计划或销毁,我会收到一个错误,指出特定列表为空,即使它不是(或不应该是)。
在失败的运行中,我在下面的列表中添加了一个新服务以及一个新的 url(参见下面的代码)
在这一点上,我会满足于破坏整个环境(这是我的开发环境),但是;理想情况下,我只想让系统正常工作,以便 Terraform 能够检测到更改并正常工作。
我已将我的 Terraform 脚本恢复到最后一个已知的良好版本。我已经在我们的临时环境中运行了好的版本,它运行良好。
MacOS 莫哈韦沙漠 10.14.6 (18G103)
Terraform v0.12.24。
- provider.archive v1.3.0
- provider.aws v2.57.0
- provider.random v2.2.1
- provider.template v2.1.2
Terraform 状态文件存储在 S3 存储桶中,并
terraform init --reconfigure已被调用。
我最初遇到类似的错误,但它位于不同的位置,经过几个小时的谷歌搜索和尝试(我没有写下来),我决定手动删除与有问题的代码(ALB、目标组)相关的 AWS 资源, 安全组)
不幸的是,我无法发布实际的脚本,因为它是私人的,但我已经发布了我认为相关的部分,但已编辑了一些信息。我提到这一点的原因是您可能会看到的任何语法类型错误都是由这种编辑引起的,正如我上面所说的,脚本在我们的登台环境中运行时可以正常工作。
在根目录中。在 Terraform 运行失败的情况下,我向service_names( edd = "edd") 列表添加了一个新名称(我添加为第一个元素)。在service_name_map_2_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"
}
}
Run Code Online (Sandbox Code Playgroud)
在modules/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"
}
}
Run Code Online (Sandbox Code Playgroud)
这是 的输出,输出alb.tf其他东西,但这是对这个问题很重要的东西
output "target_group_arn_suffix" {
value = aws_alb_target_group.orchestration_tg.*.arn_suffix
}
Run Code Online (Sandbox Code Playgroud)
在modules/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
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行terraform refresh(或计划或销毁)时,我收到以下错误(我也收到与 alert-config 相同的错误)
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.
Run Code Online (Sandbox Code Playgroud)
我已经手动删除了ALB. Dashboard和所有Target Groups。我希望(并且这在过去有效)Terraform 会检测到这一点并适当更新其状态文件,以便在运行计划时它会知道它必须创建 ALB 和目标组。
谢谢
Terraform 相信其状态是唯一的事实来源。在手动更改的情况下使用 Terraform 是可能的,但有问题。
如果您手动移除基础设施,则需要terraform state rm [resource path]在手动移除的资源上运行。
Gruntwork 有他们所谓的 Terraform 黄金法则:
实时存储库的主分支应该是生产中实际部署内容的 1:1 表示。
| 归档时间: |
|
| 查看次数: |
2531 次 |
| 最近记录: |