Построить выходную карту в terraform - PullRequest
1 голос
/ 05 марта 2019

У меня есть список пользователей для создания, список тем sns и политики для предоставления пользователям разрешений на темы. Все это пространство имен для пользователя ...

Дано:

main.tf


provider "aws" {
  region                  = "eu-west-1"
  profile                 = "terraform"
}

module "topics" {
  source = "./queues/topics"
}

module "users" {
  source = "./users"
}

module "policies" {
  source = "./policies"

  sns_topics = "${module.topics.sns_topics}"
}

. / Очередь / topics.tf

resource "aws_sns_topic" "svc_topic" {
  count = "${length(var.sns_topics)}"
  name = "${element(var.sns_topics, count.index)}"
}

. / Очередь / темы / vars.tf

# List of topics
variable "sns_topics" {
  type = "list"

  default = [
    "a-topic",
    "b-topic",
    "c-topic",
  ]
}

. / Очередь / темы / output.tf

output "sns_topics" {
  value = "${var.sns_topics}"
}

. / Пользователи / main.tf

resource "aws_iam_user" "usrs" {
  count = "${length(var.topic_user)}"
  name = "usr-msvc-${element(var.topic_user, count.index)}"
}

. / Пользователи / vars.tf

variable "topic_user" {
  type = "list"

  default =[
    "user-a",
    "user-b",
    "user-c",
  ]
}

. / Пользователи / output.tf

output "topic_user" {
  value = "${var.topic_user}"
}

. / Политика / main.tf

resource "aws_iam_policy" "sns_publisher" {
  count = "${length(var.sns_topics)}"

  name = "sns-${element(var.sns_topics, count.index)}-publisher"
  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:*:*:${element(var.sns_topics, count.index)}"
    }
  ]
}
POLICY
}

Здесь я хотел бы построить карту в выходных данных для привязать пользователя к теме

output "usr_topic_map" {
  value = {
    "user-a" = "a-topic
    "user-b" = "c-topic
    "user-c" = "c-topic
  }
}

Я могу передать список пользователей в модуль политики, но я не знаю, как сгенерировать эту карту в выводе.

Я хочу использовать это для присоединения политики к соответствующему пользователю.

Открыто и для улучшения структуры, если это упрощает задачи.

1 Ответ

1 голос
/ 05 марта 2019

Вы можете сделать это с помощью функции Terraform zipmap .Поскольку ваши ключи выводятся из модуля users в виде списка module.users.topic_user, а ваши значения выводятся из модулей topics в виде списка module.topics.sns_topics ( выходной документ модуля) , вы можете сделать ихаргументы функции в выходных данных:

output "user_topic_map" {
  value = "${zipmap(module.users.topic_user, module.topics.sns_topics)}"
}

Помните, что два списка аргументов для zipmap должны иметь одинаковую длину, поэтому, возможно, защитный код также находится где-то в ресурсе / переменной / выходеблоки.

...