我有以下核心模块基于这个official module:
module "sqs" {
source = "github.com/terraform-aws-modules/terraform-aws-sqs?ref=0d48cbdb6bf924a278d3f7fa326a2a1c864447e2"
name = "${var.site_env}-sqs-${var.service_name}"
}
我想创建两个队列:xyz和xyz_dead。 xyz将其死信发送给xyz_dead。
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.dead_queue.arn}"
,然后我收到此错误:
错误:data.aws_sqs_queue.thumbnail_requests_queue_dead:“name”:未设置必填字段错误:data.aws_sqs_queue.thumbnail_requests_queue_dead ::无效或未知密钥:filter
最好的方法是使用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也为它们正确构建依赖关系树,您也会好得多。