Terraform - невозможно передать строковую переменную дочернему модулю

У меня есть установка terraform с несколькими вложенными модулями. Упрощенно это выглядит так

├── modules
│   ├── sec-groups
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── variables.tf
│   │   └── versions.tf
├── dev
│   ├── env.dev.tfvars
│   ├── main.tf
│   ├── versions.tf
│   └── variables.tf
└── prod
    ├── env.prod.tfvars
    ├── main.tf
    ├── versions.tf
    └── variables.tf



Где в dev:

main.tf

module "aws_dev_sec-groups" {
  source = "../modules/sec-groups"

  vpc_name   = aws_vpc.dev_bp_vpc
  vpc_id     = aws_vpc.dev_bp_vpc.id

  localip  = var.localip
}

variables.tf

variable "localip" {
  type = string
}

env.dev.tfvars

localip = "1.1.1.1/32"



А в модуле сек-группы:

main.tf

resource "aws_security_group" "servers_sg" {
  name = "servers_sg"
  description = "Traffic allowed to and from Servers"
  vpc_id = var.vpc_id
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = [var.localip]
  }
}

variables.tf

variable vpc_id {}
variable localip {
  type = string
}

-

'terraform init' дает ожидаемые результаты. Однако "план терраформирования" вызывает следующую ошибку. Для меня это означает пустую переменную localip, что означает, что я неправильно объявляю переменную, так ли это?

Error: "" is not a valid CIDR block: invalid CIDR address:

  on ../modules/sec-groups/main.tf line 63, in resource "aws_security_group" "servers_sg":
  63: resource "aws_security_group" "servers_sg" {
  }

заранее спасибо

-

% terraform -v
    Terraform v0.13.0
    + provider registry.terraform.io/hashicorp/aws v3.2.0
    + provider registry.terraform.io/hashicorp/random v2.3.0

1 ответ

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

Это означало, что некоторые подмодули пытались повторно создать экземпляр несколько раз в цикле, отсюда и сообщения об ошибках. Теперь я понимаю, что зверский подход заключается в том, что родительский модуль вызывает выходные значения подмодулей для передачи другим подмодулям, и что подмодули не должны ссылаться друг на друга с использованием тех же переменных, что и в родительском модуле.

Спасибо за все указатели с этим, извинения за отвлекающую ссылку на переменную localip.

Переменные из .tfvars файл назначается корневому модулю.

Если опубликованный вами код действительно находится на корневом уровне, он будет работать, если вы укажете -var-file.

Если он на самом деле не на корневом уровне, вы, скорее всего, не передадите localipvar правильно. Тот факт, что вы видитеError: "" is not a valid CIDR block: invalid CIDR address:указывает, что вы где-то передаете пустую строку. Если вы не загрузите.tfvars правильно, и приведенный выше код фактически находится на корневом уровне, вы получите другую ошибку (отсутствующая переменная), поскольку вы не указали значение по умолчанию для localip переменная.

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