基于此official module,我具有以下核心模块:
'report_'
我想创建两个队列:xyz和xyz_dead。 xyz将其死信发送给xyz_dead。
module "sqs" {
source = "github.com/terraform-aws-modules/terraform-aws-sqs?ref=0d48cbdb6bf924a278d3f7fa326a2a1c864447e2"
name = "${var.site_env}-sqs-${var.service_name}"
}
如何指定module "xyz_queue" {
source = "../helpers/sqs"
service_name = "xyz"
redrive_policy = <<POLICY {
"deadLetterTargetArn" : "${data.TODO.TODO.arn}",
"maxReceiveCount" : 5
}
POLICY
site_env = "${var.site_env}"
}
module "xyz_dead_queue" {
source = "../helpers/sqs"
service_name = "xyz_dead"
site_env = "${var.site_env}"
}
依赖性?
如果我这样做:
deadLetterTargetArn
并将data "aws_sqs_queue" "dead_queue" {
filter {
name = "tag:Name"
values = ["${var.site_env}-sqs-xyz_dead"]
}
}
设置为deadLetterTargetArn
,然后出现此错误:
错误:data.aws_sqs_queue.thumbnail_requests_queue_dead:“名称”: 未设置必填字段错误: data.aws_sqs_queue.thumbnail_requests_queue_dead::无效或未知 键:过滤器
答案 0 :(得分:3)
执行此操作的最佳方法是使用outputted ARN from the module:
module "xyz_queue" {
source = "../helpers/sqs"
service_name = "xyz"
site_env = "${var.site_env}"
redrive_policy = <<POLICY
{
"deadLetterTargetArn" : "${module.xyz_dead_queue.this_sqs_queue_arn}",
"maxReceiveCount" : 5
}
POLICY
}
module "xyz_dead_queue" {
source = "../helpers/sqs"
service_name = "xyz_dead"
site_env = "${var.site_env}"
}
注意:由于you normally need to remove the indentation with these,我还在这里更改了您的HEREDOC的缩进。
这会将SQS队列的ARN直接从xyz_dead_queue
模块传递到xyz_queue
。
对于您遇到的错误,aws_sqs_queue
data source仅接受一个name
参数,而不像其他某些数据源那样接受filter
块。
如果您想使用aws_sqs_queue
数据源,则只想使用:
data "aws_sqs_queue" "dead_queue" {
name = "${var.site_env}-sqs-${var.service_name}"
}
也就是说,如果您同时创建两个对象,那么除非首先创建第一个资源,否则使用数据源引用其中一个对象会遇到问题。这是因为数据源在资源之前运行,因此如果两个队列都不存在,则数据源将运行并且找不到死信队列,从而失败。如果死信队列确实存在,那就可以了。通常,尽管最好避免使用这样的数据源,而仅使用它们来引用在单独的terraform apply
中创建的事物(甚至可能是在Terraform之外创建的事物)。
将资源或模块的输出传递到其他资源/模块,并允许Terraform也为它们正确构建依赖关系树,您会得到更好的结果。