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

时间:2018-07-03 17:15:57

标签: terraform terraform-provider-aws

我正在尝试在文件顶部配置一个列表,以列出应订阅SNS主题的所有SQS资源。它抛出“资源变量必须由三部分组成:TYPE.NAME.ATTR”

我使用本地变量是因为它们似乎支持插值,而变量不支持。

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也不喜欢。应该如何设置我的文件以支持此功能?

1 个答案:

答案 0 :(得分:2)

此处给出的配置存在两个问题:

  • 用于访问局部值的对象名称称为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语言的标识符中允许使用破折号以允许在其他系统中使用不同的命名方式,但是惯用风格是对在Terraform本身中定义的名称使用下划线,例如您的本地值名称update-subscribers