amazon-web-services - 重构 Terraform 以使用索引时防止资源破坏

标签 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              = "${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个资源要添加,4个资源要销毁。我用旧的日志组对此进行了测试,发现我的所有日​​志都被删除了(显然,因为日志已被破坏)。

日志组/流的名称和其他属性是相同的 - 我只是重构基础设施代码以使其更易于维护。如何维护现有的日志组而不删除它们,同时仍然重构我的代码以使用列表?

最佳答案

您需要移动 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选择一些索引列出来是为了确定,但我认为没有必要。

关于amazon-web-services - 重构 Terraform 以使用索引时防止资源破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56401984/

相关文章:

amazon-web-services - 用于 Lambda 无服务器架构的 AWS DynamoDB 与 RDS

python - 使用 Boto3 (Python) 向 AWS Glacier 进行高级分段上传?

amazon-web-services - AWS - EC2 实例未显示在控制台中

kubernetes - 您可以在 Terraform 中使用 YAML 定义 Kubernetes 服务/Pod吗?

amazon-web-services - Terraform:将 CloudFormation 模板写入磁盘

api - AmazonEC2-可以以编程方式创建 EC2 帐户吗?

postgresql - 了解 Postgres provider/terraform registry - 升级 v0.13

amazon-web-services - 使用 Cloudformation 针对 Kinesis Firehose 的 AWS Put 订阅筛选器 - 检查给定的 Firehose 流是否处于 ACTIVE 状态

amazon-web-services - 将 Kinesis Firehose 设置为 CloudFormation 中 CloudWatch Events 规则的目标

amazon-web-services - 使用 AWS CloudWatch 监控 EC2 Windows 实例的服务