Terraform 销毁在删除依赖资源之前删除提供程序

Terraform destroy removes provider before removing dependent resource

提问人:user3683706 提问时间:10/31/2023 更新时间:10/31/2023 访问量:30

问:

背景: 我正在努力销毁 AWS 中包含跨域依赖项的功能分支(us-west-2 部署依赖项对 us-east-1 资源)该项目依赖于本地区域 SQS 队列的 SNS 主题订阅,因此我添加了一个 us-east-1 提供程序以允许部署完成而不会出错。

问题: 当不再需要功能分支时,我想对创建的 AWS 资源(lambda、queue 和 east-1 主题订阅)执行 terraform 销毁,但 tf 错误并出现以下错误:

│ Error: Provider configuration not present
│ 
│ To work with aws_sns_topic_subscription.els_event_subscription (orphan) its
│ original provider configuration at
│ provider["registry.terraform.io/hashicorp/aws"].sns2sqs is required, but it
│ has been removed. This occurs when a provider configuration is removed
│ while objects created by that provider still exist in the state. Re-add the
│ provider configuration to destroy
│ aws_sns_topic_subscription.els_event_subscription (orphan), after which you
│ can remove the provider configuration again.

terraform 代码

provider "aws" {
  alias  = "sns2sqs"
  region = "us-east-1"

    default_tags {
        tags = {
          "<some-tags>" = ""
        }
    }

    ignore_tags {
        key_prefixes = ["<some_prefix>"]
    }
}

# The failing topic subscription
resource "aws_sns_topic_subscription" "els_event_subscription" {
  provider               =  aws.sns2sqs
  topic_arn              = "${var.environment}" == "prod" ? "${var.els_sns_topics["prod"]}" : "${var.els_sns_topics["dev"]}"
  protocol               = "sqs"
  endpoint               = "${some-endpoint.arn}"
  endpoint_auto_confirms = true
  filter_policy          = jsonencode(var.event_filter_policy)
}
amazon-web-services Terraform 提供程序

评论

1赞 Mark B 10/31/2023
您是否在运行之前删除了该文件?terraform destroy
0赞 user3683706 10/31/2023
仅运行 terraform destroy 即可删除任何文件。我已经尝试过的事情:添加depends_on,添加生命周期{prevent_destroy=true},并使用cli -target=aws_sns_topic_subscription.els_event_subscription,这些都不起作用。
0赞 Mark B 10/31/2023
这个错误真的很奇怪,因为 Terraform 不会“删除”提供程序。提供程序只是一个配置块,而不是由 Terraform 创建/更新/删除的基础结构资源。我阅读错误消息的方式,并不是说 Terraform 删除了提供程序,Terraform 实际上是在指责您删除它。就好像您已从 .tf 文件中专门删除了块一样,而仍在 .tf 文件(以及 Terraform 状态文件中)中的资源引用了该提供程序。provider
0赞 user3683706 10/31/2023
我找到了解决这个问题的方法,我们使用 cake 脚本来运行 tf cli 命令,并将我们的销毁设置为在临时目录中运行。好吧,有人将 providers.tf 文件命名为没有“s”“provider.tf”,脚本寻找一个名为 providers.tf 的文件,因此没有 providers.tf 文件,也没有 us-east-1 提供程序,所以 Mark B 很幸运,你几乎钉住了它。泰
0赞 Mark B 10/31/2023
听起来我完全搞定了,你正在移除块。我显然无法知道你有一个脚本像这样移动 .tf 文件,这遗漏了整个文件,因为你在问题中没有提到那个脚本。我的第一条评论询问您是否在运行前删除文件实际上是您正在做的事情。providerterraform destroy

答: 暂无答案