模块化 terraform 代码想要销毁并重新创建 S3 存储桶

Posted

技术标签:

【中文标题】模块化 terraform 代码想要销毁并重新创建 S3 存储桶【英文标题】:Modularised terraform code wants to destroy and recreate an S3 bucket 【发布时间】:2021-12-11 00:20:11 【问题描述】:

为了便于理解,这是我的问题的简化示例。

我的团队过去通过module1 管理一个S3 存储桶,它调用了包含存储桶代码的module2

production_account/ --(invokes)--> module1/ --(invokes)--> module2/s3.tf

但后来他们决定重构代码,直接调用module2

production_account/ --(invokes)--> module2/s3.tf

因此,当我现在进行 terraform plan 时,我得到:

module.module1.module.module2.aws_s3_bucket.bucket will be destroyed  
...


module.module2.aws_s3_bucket.bucket will be created  
...


简而言之,terraform 想要重新创建 s3 存储桶。这样做的问题是所有数据都会丢失。

有没有办法将现有存储桶导入状态通过模块2对其进行管理?

terraform import module.module1.module.module2.aws_s3_bucket.bucket

解决了我问题的前半部分。

【问题讨论】:

【参考方案1】:

是的。使用terraform state mv 而不是import

terraform state mv module.module1.module2.aws_s3_bucket.bucket module.module2.aws_s3_bucket.bucket

【讨论】:

你已经import了吗? 如果是这样,您需要先使用terraform state rm module.module2.aws_s3_bucket.bucket 从该状态位置忘记它。 如果您使用terraform state list | grep "aws_s3_bucket.bucket",它是否存在于您所在州的任何地方?如果是这样,您应该可以移动它。 好的,但是资源应该还在,所以只要不在旧州地址也不是新州地址,你应该清楚的导入到新的位置和规划中。 没错。谢谢@theherk

以上是关于模块化 terraform 代码想要销毁并重新创建 S3 存储桶的主要内容,如果未能解决你的问题,请参考以下文章

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

如何销毁由 terraform transit-gateway 模块创建的附加 tgw 路由表

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

使用 Istio 模块销毁 Terraform

新AMI发布时,Terraform重新创建EC2实例

在同一资源组中创建两个 VM,但 Terraform 不希望销毁第一个