【问题标题】:Preventing destroy of resources when refactoring Terraform to use indices重构 Terraform 以使用索引时防止破坏资源
【发布时间】:2019-10-17 12:15:26
【问题描述】:

当我刚开始使用 Terraform 时,我或多或少地天真地单独声明了资源,如下所示:

resource "aws_cloudwatch_log_group" "image1_log" {
  name              = "${var.image1}-log-group"
  tags              = module.tagging.tags
}

resource "aws_cloudwatch_log_group" "image2_log" {
  name              = "${var.image2}-log-group"
  tags              = module.tagging.tags
}

 resource "aws_cloudwatch_log_stream" "image1_stream" {
   name           = "${var.image1}-log-stream"
   log_group_name = aws_cloudwatch_log_group.image1_log.name
 }

 resource "aws_cloudwatch_log_stream" "image2_stream" {
   name           = "${var.image2}-log-stream"
   log_group_name = aws_cloudwatch_log_group.image2_log.name
 }

然后,在 10-20 个不同的日志组之后,我意识到随着基础设施的增长,这将无法正常工作。我决定定义一个变量列表:

variable "image_names" {
  type = list(string)
  default = [
    "image1",
    "image2"
  ]
}

然后我使用索引替换了资源:

resource "aws_cloudwatch_log_group" "service-log-groups" {
  name              = "${element(var.image_names, count.index)}-log-group"
  count             = length(var.image_names)
  tags              = module.tagging.tags
}

resource "aws_cloudwatch_log_stream" "service-log-streams" {
  name              = "${element(var.image_names, count.index)}-log-stream"
  log_group_name    = aws_cloudwatch_log_group.service-log-groups[count.index].name
  count             = length(var.image_names)
}

这里的问题是当我运行terraform apply 时,我得到4 resources to add, 4 resources to destroy。我用一个旧的日志组对此进行了测试,发现我的所有日​​志都被擦除了(显然,因为日志被销毁了)。

日志组/流的名称和其他属性是相同的- 我只是重构了基础架构代码以使其更易于维护。如何在不删除现有日志组的情况下维护现有日志组,但仍重构代码以使用列表?

【问题讨论】:

    标签: amazon-web-services terraform amazon-cloudwatch


    【解决方案1】:

    您需要在 Terraform 状态中移动现有资源。

    尝试运行terraform show 以获取存储资源的字符串,这将类似于[module.xyz.]aws_cloudwatch_log_group.image1_log ...

    您可以使用terraform state mv [module.xyz.]aws_cloudwatch_log_group.image1_log '[module.xyz.]aws_cloudwatch_log_group.service-log-groups[0]' 移动它。 您可以通过相应地更改[0] 来选择分配给每个资源的索引。

    删除每个移动资源的旧资源定义,否则 Terraform 会尝试创建新的组/流。

    在第一次导入时尝试一下,如果资源被正确移动,请检查terraform plan...

    还要检查您是否需要为image_names 列表选择一些索引以确保确定,但我认为这没有必要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 2022-10-24
      相关资源
      最近更新 更多