Terraform - AWS - создать несколько экземпляров - разные AZ (где количество экземпляров превышает длину списка AZ) - PullRequest
0 голосов
/ 22 сентября 2019

Я столкнулся с проблемой с Terraform (v0.12), чтобы создать несколько экземпляров, используя переменную count и список идентификаторов подсети, где число превышает длину списка идентификаторов подсети.

Например;

resource "aws_instance" "main" {
  count                     = 20
  ami                       = var.ami_id
  instance_type             = var.instance_type
  # ...
  subnet_id                 = var.subnet_ids_list[count.index]
}

Где мой счетчик равен '20', а length(var.subnet_ids_list) равен 2. Он выдает следующую ошибку:

count.index is 2
    var.instance_subnet_id is tuple with 2 elements

The given key does not identify an element in this collection value.

Я попытался создать "subnet_ids_list" как строку с запятой-separated и использовал «split», но он тоже выдает ту же ошибку.

Позже подумал добавить элементы подсети в «subnet_ids_list», чтобы сделать его «20».что-то вроде;

Python 2.7
>>> subnet_ids_list = subnet_ids_list * 10

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

Оригинально как;

subnet_ids_list = ["sub-1", "sub-2"]

Преобразовано в - соответствует значению, предоставленному для подсчета;

subnet_ids_list = ["sub-1", "sub-2", "sub-1", "sub-2",....., "sub-1", "sub-2",] (length=20).

Я не хочу использовать для этого группы автоматического масштабирования AWS.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Вы можете использовать функцию element , если вам нужно вернуться к списку вещей, как упомянуто в связанной документации:

Индекс начинается с нуля,Эта функция выдает ошибку, если используется с пустым списком.

В большинстве случаев используйте список синтаксиса встроенного индекса [index].Используйте эту функцию только для специального дополнительного поведения "обхода", описанного ниже.

> element(["a", "b", "c"], 3)
a
0 голосов
/ 22 сентября 2019

Нет смысла создавать новую подсеть, когда вам нужно раскрутить новый EC2.Я бы рекомендовал вам взглянуть на официальную документацию об основах VPC и подсетях: https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html#vpc-subnet-basics

Например, если вы создаете VPC с блоком CIDR 10.0.0.0/24,он поддерживает 256 IP-адресов.Вы можете разбить этот блок CIDR на две подсети, каждая из которых поддерживает 128 IP-адресов.В одной подсети используется блок CIDR 10.0.0.0/25 (для адресов 10.0.0.0 - 10.0.0.127), а в другой используется блок CIDR 10.0.0.128/25 (для адресов 10.0.0.128 - 10.0.0.255).

В вашем примере с Terraform похоже, что у вас есть 2 подсети (частная и открытая?), Поэтому ваш счетчик должен быть 0 или 1 при доступе к subnet_ids_list.Еще лучшим решением было бы пометить ваши подсети: https://www.terraform.io/docs/providers/aws/r/subnet.html#inner

Возможно, у вас есть другой счетчик для контроля количества экземпляров.Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Исходя из ваших комментариев, карта будет лучшей структурой данных для управления экземпляром / подсетью.Ключом может быть экземпляр или сама подсеть, например, { "aws_instance" = "sub-1" }

Ссылка: https://www.terraform.io/docs/configuration-0-11/variables.html#maps

...