Terraform – 解决资源重复多次问题

85次阅读
没有评论

问题描述

在使用Terraform时遇到了一个问题,他的Terraform计划中包含多个aws_sqs_queue资源,这些资源在配置上大部分是相同的。在去除重复的配置和使用变量之前,他希望运行terraform plan来查看是否可以正常工作。然而,他一直遇到以下错误:

module root: 1 error(s) occurred:
* data.template_file.ep_match_result_queues: resource repeated multiple times

尽管他尝试了搜索解决方法,但可用的信息不多。他希望能够得到帮助。他的Terraform计划大致如下(请忽略多余的括号和拼写错误,这只是一个大致的骨架,用于给你一个计划结构的概要):

data "template_file" "ep_match_result_queues" {
  template = "${var.namespace}-sm-ep"
}

resource "aws_sns_topic" "sns_topic_name" {
  name          = "ep_sm_match_result_topic${var.environment}"
  display_name  = ""
  policy        = <<POLICY
{
  #policy
}
POLICY
}

resource "aws_sqs_queue" "queue1" {
  #config
}

resource "aws_sqs_queue" "queue2" {
  #config
  redrive_policy = <<POLICY
{
  #policy
}
POLICY
}

# ... (其他的 aws_sqs_queue 资源)

resource "aws_sqs_queue_policy" "queue_policy" {
  queue_url = [ ... ]
  policy    = "${data.aws_iam_policy_document.match_result_queues_policy.json}"
}

data "aws_iam_policy_document" "match_result_queues_policy" {
  #policy
}

解决方案

请注意以下操作注意版本差异及修改前做好备份。

当遇到类似的问题时,需要检查配置文件中是否存在重复定义的资源,以及是否存在命名冲突。Terraform会扫描以.tf结尾的所有文件,并将它们合并成单个配置。如果存在重复定义的资源,就会出现类似的错误。以下是解决该问题的一些步骤:

  1. 检查工作目录中是否有其他.tf文件,确保这些文件的名称在所有文件中是唯一的。如果有文件名称相似,但不是同一个文件,也会导致这个问题。用户已经通过修改文件名来解决了这个问题。
  2. 确保所有资源的定义都是唯一的,不要在多个文件中定义相同的资源,否则Terraform会认为这些资源重复定义,导致错误。

修改配置文件

用户应该修改配置文件以确保资源的定义不会重复。在Terraform计划中,他可以使用Terraform模块或者将重复的配置抽取为变量来避免这个问题。在他的具体情况下,如果他需要多个相似的aws_sqs_queue资源,可以考虑将这些资源的配置提取为一个模块,然后在主配置中使用这个模块来创建多个队列。

示例修改后的配置文件:

# main.tf
module "sqs_queues" {
  source = "./sqs_queues_module"
  # 这里可以传递一些变量给模块,用于控制队列的数量和配置
}

# sqs_queues_module/main.tf
variable "namespace" {
  type    = string
}

variable "environment" {
  type    = string
}

resource "aws_sqs_queue" "queue1" {
  # 使用变量来定制队列的配置
  name          = "queue1-${var.namespace}-${var.environment}"
  # ...
}

# ... (其他的 aws_sqs_queue 资源)

通过这种方式,用户可以在模块中定义一个通用的aws_sqs_queue资源配置,并在主配置中根据需要创建多个队列,而不会出现资源重复定义的问题。同时,他可以通过调整变量的值来自定义队列的配置。

注意: 在实际应用中,用户可能需要根据自己的需求调整模块的结构和变量,确保满足实际情况。

正文完