Построить карту вывода в терраформе

У меня есть список пользователей для создания, список тем 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}"
}

./queues/topics.tf

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

./queues/topics/vars.tf

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

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

./queues/topics/output.tf

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

./users/main.tf

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

./users/vars.tf

variable "topic_user" {
  type = "list"

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

./users/output.tf

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

./policies/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
  }
}

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

Я хочу использовать это, чтобы прикрепить политику к соответствующему пользователю.

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


person MardyDev    schedule 05.03.2019    source источник


Ответы (3)


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

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

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

person Matt Schuchard    schedule 05.03.2019

Вы также можете использовать этот подход.

output "outputs" {
  value       = {
    vpc_id        = aws_vpc.vpc.id
    pub_sbnt_ids  = aws_subnet.public.*.id
    priv_sbnt_ids = aws_subnet.private.*.id
  }
  description = "VPC id, List of all public, private and db subnet IDs"
}
person tmetodie    schedule 08.12.2020

Сделать это можно так:

output "iam_user" {
  value = map(
    "key", aws_iam_access_key.user.id,
    "secret", aws_iam_access_key.user.secret
  )
}
person Anton Yurchenko    schedule 01.07.2020