Настроить интерполированный список в переменной Terraform для создания подписок SNS - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь настроить список в верхней части моего файла, чтобы перечислить все ресурсы SQS, которые должны подписаться на тему SNS. Выдает «переменные ресурса должны состоять из трех частей: 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]

Терраформе это тоже не понравилось. Как мой файл должен быть настроен для поддержки этого или он может поддерживаться?

1 Ответ

0 голосов
/ 04 июля 2018

Здесь есть две проблемы с конфигурацией:

  • Имя объекта для доступа к локальным значениям называется 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.

...