如果 Terraform 重新创建在另一个状态中引用的资源怎么办?

Posted

技术标签:

【中文标题】如果 Terraform 重新创建在另一个状态中引用的资源怎么办?【英文标题】:What if Terraform recreates a resource that is referenced inside another state? 【发布时间】:2021-12-26 15:28:06 【问题描述】:

TL;DR:如果 Terraform 销毁并重新创建在另一个状态文件中的另一个资源中引用的资源会怎样。在我对另一个状态文件运行应用程序之前,它会破坏云中的引用并导致停机吗?

嗨。我正在使用 Terraform 和谷歌云平台。我在每个应用程序存储库中都有与我的应用程序和微服务相关的 Terraform 文件,并且我还有一些其他存储库专门用于 VPC、负载均衡器和 IAM 等基础设施资源。

假设运行我的一个微服务的 Cloud Functions 服务由位于特定微服务存储库中的 Terraform 文件提供,该存储库具有自己的隔离远程状态。

在负载均衡器存储库中,我有引用该微服务远程状态的数据对象,因此我可以从该状态引用资源,例如在创建其网络端点组和负载均衡器后端时需要引用的 Cloud Functions 服务。

在上面的示例之后,我想知道如果我更改微服务文件中的某些内容导致某些资源被销毁并重新创建会发生什么。由于引用它的其他资源位于不同的存储库和状态文件中,我想我需要运行 terraform init 并在两个存储库中应用,我是对的还是我想多了?您会采取什么措施来解决此问题?

【问题讨论】:

进展如何?仍然不清楚为什么这是一种不好的做法? 【参考方案1】:

如果您的设置需要管理来自两个不同 TF 状态文件的相同资源,那么您做错了。这不是 TF 的使用方式,当然会导致问题。

给定资源只能由一个 TF 状态文件管理。

【讨论】:

我没有管理来自两个不同 TF 状态文件的相同资源。重点是,例如,我需要传递 Cloud Functions 服务的标识符(在应用程序状态中管理)来创建负载均衡器资源(负载均衡器资源在它自己的状态文件中管理)。

以上是关于如果 Terraform 重新创建在另一个状态中引用的资源怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 如何在另一个资源中使用来自一个资源的每个值

在另一个模块中为 EC2 添加指定子网 - AWS Terraform -

如何使用 terraform 在多个区域进行设置?

在另一个模板中包含一个 terraform 模板

创建谷歌云存储桶并使用相同的 terraform 脚本将 terraform 状态保存到其中?

Terraform 初始状态文件创建