Как извлечь атрибуты из разнотипной карты в terraform11

Я пытаюсь извлечь атрибут cidr_blocks из ingress правило aws_security_groupресурс. В моем проекте terraform запущена версияv0.11.13.

moduleA / main.tf:

terraform {
  backend          "s3"             {}
  required_version = "0.11.13"
}

provider "aws" {
  region  = "us-east-1"
  version = "2.2.0"
}

...
# Create security group for CPS alb
resource "aws_security_group" "test" {
  name        = "test-sg"
  vpc_id      = "vpc-0xxxxxx"
  description = "Test security group"

  lifecycle {
    create_before_destroy = true
  }

  ingress {
    protocol    = "tcp"
    from_port   = 443
    to_port     = 443
    cidr_blocks = ["124.154.1.4/32","124.189.1.4/32"]
    description = "HTTPS access"
  }

  ingress {
    protocol    = "tcp"
    from_port   = 80
    to_port     = 80
    cidr_blocks = ["124.154.1.4/32","124.189.1.4/32"]
    description = "HTTP access"
  }

  egress {
    protocol    = -1
    from_port   = 0
    to_port     = 0
    cidr_blocks = ["0.0.0.0/0"]
  }
}

moduleA / outputs.tf

output "cidrs_allowed_ingress"{
  value = "${aws_security_group.test.ingress[0]}"
}

Это дает мне результат, подобный следующему:

cidrs_allowed_ingress = {
 cidr_blocks = ["124.154.1.4/32","124.189.1.4/32"]
 description = "HTTPS access"
 from_port = "443"
 to_port = "443"
 protocol = "tcp"
 ...
}

Однако я не могу извлечь только cidr_blocksс использованием функции поиска в terraform, поскольку значения карты не одного типа (некоторые из них являются списками, а некоторые - строками). Я не могу использовать другие расширенные функции в terraform12, потому что проект работает в terraform11.

Предложите способ извлечь только cidr_blocks из вышеприведенного вывода, как показано ниже.

Ожидаемый результат:

cidrs_allowed_ingress = ["124.154.1.4/32","124.189.1.4/32"]

или

cidrs_allowed_ingress = "124.154.1.4/32","124.189.1.4/32"

Заранее спасибо.

1 ответ

Я нашел способ получить ожидаемый результат, используя следующее:

output "cidrs_allowed_ingress"{
  value = "${element(split("\"cidr_blocks\":[", element(split("\"],", 
    jsonencode(aws_security_group.test.ingress[0])),0)),1)}\""
}

Здесь я сначала конвертирую карту в объект json и выполняю несколько операций разделения и элементов списка, чтобы получить следующее.

cidrs_allowed_ingress = "124.154.1.4/32","124.189.1.4/32"

Я был бы признателен, если бы у кого-нибудь было лучшее и более чистое решение.

Другие вопросы по тегам