Terraform 地形不';我似乎不喜欢手工修改

Terraform 地形不';我似乎不喜欢手工修改,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我有一个非常令人沮丧的地形问题,我对我的地形脚本做了一些更改,但在应用该计划时失败了。我经历了一系列的阴谋,可能使情况变得更糟,因为为了解决这个问题,我最终手动删除了一堆AWS资源。 所以现在我根本无法使用Terraform(刷新、计划、销毁),所有这些都会出现相同的错误 形势 我有一个Fargate服务列表和一组映射,它们关联Fargate服务的不同功能,例如负载平衡器的“目标组”(我在下面提供了一些代码)。问题似乎是Terraform没有意识到这些资源已经被手动删除,或者因为它们不存在而变得

我有一个非常令人沮丧的地形问题,我对我的地形脚本做了一些更改,但在应用该计划时失败了。我经历了一系列的阴谋,可能使情况变得更糟,因为为了解决这个问题,我最终手动删除了一堆AWS资源。
所以现在我根本无法使用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状态文件存储在S3存储桶中,并且调用了
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.