Amazon web services 在重构地形以使用索引时防止资源破坏

Amazon web services 在重构地形以使用索引时防止资源破坏,amazon-web-services,terraform,amazon-cloudwatch,Amazon Web Services,Terraform,Amazon Cloudwatch,当我刚开始使用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

当我刚开始使用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)
}
这里的问题是,当我运行
terraformapply
时,我得到了
4个要添加的资源,4个要销毁的资源。我用一个旧的日志组对此进行了测试,发现我所有的日志都被删除了(显然,因为日志被销毁了)


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

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

尝试运行
terraformshow
获取存储资源的字符串,这类似于
[module.xyz.]aws\u cloudwatch\u log\u group.image1\u log

您可以使用
地形状态mv[module.xyz.]aws\u cloudwatch\u log\u group.image1\u log'[module.xyz.]aws\u cloudwatch\u log\u group.service log groups[0]
移动它。 您可以通过相应地更改
[0]
来选择分配给每个资源的索引

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

在第一次导入时尝试,并使用
terraform plan
检查资源是否正确移动

还要检查您是否需要为
image\u name
list jsut选择一些索引,以确保这一点,但我认为这是不必要的