在 Terraform 变量中配置插值列表以创建 SNS 订阅



我正在尝试在文件顶部配置一个列表,以列出应订阅 SNS 主题的所有 SQS 资源。它抛出一个"资源变量必须是三个部分:TYPE.NAME。阿特尔">

我使用局部变量,因为它们似乎支持内插值,而变量不支持。

locals {
update-subscribers = [
"${var.prefix}-${terraform.workspace}-contribution-updates"
]
}

这是我的 sns 主题订阅的一个片段。

resource "aws_sns_topic_subscription" "subscription" {
count = "${length(locals.update-subscribers.*)}"
topic_arn = "${aws-sns-update-topic.topic.arn}"
protocol = "sqs"
endpoint = "arn:aws:sqs:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:${element(locals.update-subscribers, count.index)}"
endpoint_auto_confirms = true
}

能够使用我的变量列表会很好,这样我就可以在工作区中切换,而不会在 AWS 站点上遇到任何问题。我能找到的所有示例都指向 CIDR 设置的静态列表,而我希望我的列表基于内插字符串。我也试过

locals.contribution-update-subscribers[count.index]

Terraform也不喜欢这样。我的文件应该如何设置以支持此功能,或者是否可以支持?

这里给出的配置有两个问题:

  • 用于访问局部值的对象名称称为local,而不是locals
  • 您不需要(目前也不能(使用 splat 语法来计算已经是列表中的元素数量。

解决这两个问题将给出以下配置,我认为应该有效:

resource "aws_sns_topic_subscription" "subscription" {
count = "${length(local.update-subscribers)}"
topic_arn              = "${aws_sns_update_topic.topic.arn}"
protocol               = "sqs"
endpoint               = "arn:aws:sqs:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:${local.update-subscribers[count.index])}"
endpoint_auto_confirms = true
}

尽管 Terraform语言中的标识符中允许使用破折号以允许在其他系统中使用不同的命名 schems,但惯用样式是对 Terraform 本身中定义的名称使用下划线,例如您的本地值名称update-subscribers

最新更新