Символы -/+ в выводе плана означают «заменить». Чтобы понять, чем продиктовано то или иное изменение, поищите в выводе плана словосочетание forces replacement. Изменение многих аргументов ресурса aws_instance приводит к замене. Это означает, что имеющийся сервер EC2 будет удален, а его место займет совершено новый сервер. Это пример парадигмы неизменяемой инфраструктуры, которую мы обсуждали в подразделе «Средства шаблонизации серверов» на с. 31. Стоит отметить, что, несмотря на замену веб-сервера, ни один из его пользователей не заметит перебоев в работе; в главе 5 вы увидите, как с помощью Terraform выполнять развертывания с нулевым временем простоя.
Похоже, с планом все в порядке, поэтому введите yes, и вы увидите, как развертывается новый сервер EC2 (рис. 2.8).
Если щелкнуть на новом сервере, внизу страницы, на панели с описанием, можно увидеть его публичный IP-адрес. Дайте ему минуту или две, чтобы он загрузился, и затем сделайте HTTP-запрос по этому адресу на порте 8080, используя браузер или утилиту вроде curl:
$ curl http://
Hello, World
Ура! Теперь у вас есть рабочий веб-сервер, запущенный в AWS!
Рис. 2.8. Вместо старого сервера EC2 мы получаем новый, с кодом веб-сервера
Сетевая безопасность
Чтобы не усложнять примеры в этой книге, развертывание происходит не только в VPC по умолчанию (как упоминалось ранее), но и в стандартные подсети этого VPC. VPC состоит из одной или нескольких подсетей, каждая из которых имеет собственные IP-адреса. Все подсети в VPC по умолчанию являются публичными — их IP-адреса доступны из Интернета. Благодаря этому вы можете проверить работу своего сервера EC2 на домашнем компьютере.
Размещение сервера в публичной подсети подходит для быстрого эксперимента, но в реальных условиях это потенциальный риск безопасности. Хакеры со всего мира постоянно сканируют IP-адреса случайным образом в надежде найти какие-нибудь уязвимости. Если ваши серверы доступны снаружи, достаточно лишь оставить незащищенным один порт или воспользоваться устаревшим кодом с известной уязвимостью — и кто-то сможет проникнуть внутрь.
Таким образом, в промышленных системах все серверы и уж точно все хранилища данных следует развертывать в закрытых подсетях, IP-адреса которых доступны только внутри VPC, но не из публичного Интернета. Все, что должно находиться в публичных подсетях, — это небольшое количество обратных прокси и балансировщиков нагрузки, в которых закрыто все, что только можно (позже в этой главе вы увидите пример того, как развернуть балансировщик нагрузки).
Развертывание конфигурируемого веб-сервера
Вы, наверное, заметили, что код веб-сервера дублирует порт 8080 в группе безопасности и конфигурации пользовательских данных. Это противоречит принципу
Чтобы можно было сделать ваш код более конфигурируемым и отвечающим принципу DRY, Terraform позволяет определять
variable "NAME" {
[CONFIG ...]
}
Тело объявления переменной может содержать три необязательных параметра.
•description. Этот параметр всегда желательно указывать для документирования того, как используется переменная. Ваши коллеги смогут просмотреть это описание не только при чтении кода, но и во время выполнения команд plan или apply (пример этого показан чуть ниже).
• default. Вы можете присвоить значение переменной несколькими способами, в том числе через командную строку (с помощью параметра -var), файл (указывая параметр -var-file) или переменную среды (Terraform ищет переменные среды вида TF_VAR_<имя_переменной>). Если переменная не инициализирована, ей присваивается значение по умолчанию. Если такого нет, Terraform запросит его у пользователя в интерактивном режиме.
•type. Позволяет применить к переменным, которые передает пользователь,
Вот пример входной переменной, которая проверяет, является ли передаваемое значение числом:
variable "number_example" {
description = "An example of a number variable in Terraform"
type = number
default = 42
}
А вот пример переменной, которая проверяет, является ли значение списком:
variable "list_example" {
description = "An example of a list in Terraform"
type = list
default = ["a", "b", "c"]
}
Ограничения типов можно сочетать. Например, вот входная переменная, которая принимает список и требует, чтобы все значения этого списка были числовыми:
variable "list_numeric_example" {
description = "An example of a numeric list in Terraform"
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии