Повторите создание инфраструктуры с Terraform

Я изучаю Terraform как инструмент для управления многоразовыми группами экземпляров AWS EC2. Я не очень хорошо знаком с инструментами инфраструктуры и ищу совета о том, что делать в этом случае.

  1. Я хочу многократно создавать несколько экземпляров EC2 - скажем, когда я впервые вызываю terraform apply, моей инфраструктуре требуется 3 экземпляра. Через некоторое время я хочу создать 100 экземпляров - возможно, не уничтожая 3 экземпляра, которые я создал ранее. Как мне это сделать в Terraform? Должен ли я вообще это делать? Если мне не следует использовать Terraform для повторной подготовки, какой хороший инструмент может это сделать?

  2. Какие инструменты позволяют удаленно выполнять сценарии bash или Python в созданной инфраструктуре Terraform? Я знаю, что Terraform имеет remote-exec, но команды, которые мне нужно запускать в этих экземплярах, требуют много времени для выполнения (3-5 часов), и я бы предпочел не иметь ресурсов в том состоянии, в котором они все еще инициализируются, потому что я не могу отслеживать их.


person boltthrower    schedule 22.10.2018    source источник
comment
Долгосрочные задачи: они предназначены для начальной загрузки экземпляра или это длительные задачи?   -  person Nathan Smith    schedule 23.10.2018
comment
Они предназначены для начальной загрузки экземпляра - необходимо загрузить и установить некоторое программное обеспечение для обработки данных.   -  person boltthrower    schedule 23.10.2018


Ответы (2)


Пользовательский AMI с предустановленным программным обеспечением поможет вам сократить время загрузки. Пакер Hashicorp https://www.packer.io/intro/ - хороший инструмент для создания AMI.

  1. Создайте один экземпляр ec2 с помощью terraform.
  2. Либо сценарий пользовательских данных, либо запустите remote-exec для запуска сценария, который устанавливает необходимые пакеты / программное обеспечение.
  3. Создайте AMI из указанного выше экземпляра ec2.
  4. Запустите столько экземпляров ec2, сколько вам нужно, чтобы использовать только что созданный AMI.

By Ansible также предлагает очень хорошие функции для управления инфраструктурой как кодом.

person Giri Chintala    schedule 23.10.2018
comment
Это то, что я делаю прямо сейчас (хотя без Пакера я уже сделал AMI). Однако - шаг настройки отличается для каждого экземпляра - он принимает определенный набор переменных, а затем загружает некоторые данные на их основе. Это один нестандартный шаг, который я не могу добавить в AMI. Кроме того, я загружаю экземпляр, создавая каталоги и настраивая их через remote-exec. - person boltthrower; 23.10.2018

Это очень частый вариант использования terraform, и было бы хорошо, если бы вы сделали это через terraform.

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

resource "aws_instance" "web" {
  ami           = "${data.aws_ami.ubuntu.id}"
  instance_type = "t2.micro"
  count = 3
  availability_zone = "${element(var.az, count.index)}"

  tags {
    Name = "${count.index}"
  }
}

Кроме того, если вы хотите выполнить какую-либо команду во время загрузки экземпляра. Для этого вы можете использовать скрипт пользовательских данных.

resource "aws_instance" "..." {
  user_data = "${file("../../tmp/aws/userdata.sh")}"
  ...
}

Для повторяемости можно использовать модуль terraform. Например: если вы хотите использовать код для нескольких инфраструктур, скажем, для разработки, подготовки, производства. В случае модулей вам не нужно снова и снова писать один и тот же код для запуска экземпляра ec2. Вы можете передавать разные переменные для разной инфраструктуры.

Пример:

module "dev" {
  source = "./modules/dev"
  count  = 2
  region = "us-east-1"
}

module "production" {
  source = "./modules/production"
  count  = 5
  region = "us-east-1"
}

Ссылка: https://www.terraform.io/docs/modules/usage.html < / а>

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

Ниже перечислены многие политики прекращения действия.

Amazon EC2 Auto Scaling поддерживает следующие настраиваемые политики завершения:

OldestInstance. Terminate the oldest instance in the group. This option is useful when you're upgrading the instances in the Auto Scaling group to a new EC2 instance type. You can gradually replace instances of the old type with instances of the new type.

NewestInstance. Terminate the newest instance in the group. This policy is useful when you're testing a new launch configuration but don't want to keep it in production.

OldestLaunchConfiguration. Terminate instances that have the oldest launch configuration. This policy is useful when you're updating a group and phasing out the instances from a previous configuration.

ClosestToNextInstanceHour. Terminate instances that are closest to the next billing hour. This policy helps you maximize the use of your instances and manage your Amazon EC2 usage costs.

Default. Terminate instances according to the default termination policy. This policy is useful when you have more than one scaling policy for the group.

Вы можете перейти по ссылке ниже для получения дополнительной информации.

Ссылка: https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-instance-termination.html.

person m0hit    schedule 23.10.2018
comment
Это не отвечает на мой вопрос о многократном развертывании инфраструктуры с другим счетчиком без уничтожения предыдущих экземпляров (если явно не требуется). - person boltthrower; 23.10.2018
comment
Вы должны использовать модули terraform, если хотите реализовать один и тот же сценарий для нескольких инфраструктур. - person m0hit; 28.10.2018