首页 文章

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

提问于
浏览
0

我正在尝试在我的文件顶部配置一个列表,列出应订阅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 回答

  • 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 .

相关问题