问题描述
在使用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
结尾的所有文件,并将它们合并成单个配置。如果存在重复定义的资源,就会出现类似的错误。以下是解决该问题的一些步骤:
- 检查工作目录中是否有其他
.tf
文件,确保这些文件的名称在所有文件中是唯一的。如果有文件名称相似,但不是同一个文件,也会导致这个问题。用户已经通过修改文件名来解决了这个问题。 - 确保所有资源的定义都是唯一的,不要在多个文件中定义相同的资源,否则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
资源配置,并在主配置中根据需要创建多个队列,而不会出现资源重复定义的问题。同时,他可以通过调整变量的值来自定义队列的配置。
注意: 在实际应用中,用户可能需要根据自己的需求调整模块的结构和变量,确保满足实际情况。
正文完