Terraform: Как дополнительно назначить статический частный IP-адрес в aws_network_interface? - PullRequest
0 голосов
/ 18 октября 2018

Как сделать модуль Terraform, определяющий ресурс aws_network_interface, для необязательного назначения статического частного IP?

В модуле ресурс определяется как

# Use this block if private_ips have been provided
resource "aws_network_interface" "management_interface" {
  count = "${var.count}"

  subnet_id = "${var.management_net}"
  # Workaround, see https://github.com/hashicorp/terraform/issues/12472
  private_ips = [ "${compact(list(element(split(",",var.private_ips), count.index)))}" ]

  tags {
    Name = "if-management"
  }
}

private_ips является либо пустой строкой, если запрашивается динамический частный IP-адрес, либо списком, разделенным запятой (один элемент на экземпляр), если назначается статический частный IP-адрес.

Модуль называется так

module "dns" {
  count          = 2
  source         = "./modules/linux-system"
  […]
  private_ips    = "${cidrhost(var.management_subnet_cidr, 12)},${cidrhost(var.management_subnet_cidr, 13)}"
  […]
}

или

module "jumphost" {
  source         = "./modules/linux-system"
  […]
}

Это решение не кажется идемпотентным: хотя первый terraform apply завершается успешно,следующий запуск вызывает

* module.jumphost.aws_network_interface.management_interface: 1 error(s) occurred:

* aws_network_interface.management_interface: Failure to unassign Private IPs: InvalidParameterValue: Value (10.128.16.139) for parameter privateIpAddress is invalid. The primary IP address of an interface cannot be unassigned.
        status code: 400, request id: 672b6d7d-6396-48bf-8bd0-77ce764709be

У кого-нибудь есть идеи, как это сделать правильно?Похоже, что-то вроде Ansible / Jinja2 omit необходимо здесь.

...