当代码移动到模块时,Terraform 正在破坏 AWS 资源

Posted

技术标签:

【中文标题】当代码移动到模块时,Terraform 正在破坏 AWS 资源【英文标题】:Terraform is destroying AWS resource when code moved to a module 【发布时间】:2020-04-01 21:25:21 【问题描述】:

最初我有创建 CloudWatch 日志组的 Terraform 脚本。

resource "aws_cloudwatch_log_group" "main_server_log_group" 
  name              = "server_name"
  retention_in_days = 60

我应用了它,后来我把它移到专用模块并重命名

resource "aws_cloudwatch_log_group" "server_log_group" 
  name              = "$var.server_name"
  retention_in_days = 60

main.tf中使用这个模块

module "main_server" 
  source = "./modules/server"
  server_name = "$local.main_server_name"

现在 Terrafrom 应用正在销毁原始 CloudWatch 组并创建新组。

module.main_server.aws_cloudwatch_log_group.main_server_log_group[0]: Creating...
aws_cloudwatch_log_group.main_server_log_group: Destroying... [id=xxxx]

我认为这是因为 Terraform 资源的名称已更改,不是吗? 这不是预期的。 CW组的名称没有改变。

在重构 Terraform 代码时保留现有资源的任何解决方法?

【问题讨论】:

【参考方案1】:

找到解决方案,显然可以将资源移动到模块。状态文件需要更新 - https://www.terraform.io/docs/commands/state/mv.html

更新 移动状态对我不起作用。但是删除状态和导入状态就可以了。

terraform state rm 'my_resource'
terraform import ...

【讨论】:

以上是关于当代码移动到模块时,Terraform 正在破坏 AWS 资源的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 在升级时会破坏 RDS 集群内的实例

Terraform 破坏抛出错误

将现有资源导入 Terraform 状态文件时出错

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

Terraform 模块 - 输出变量作为另一个模块的输入

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