Terraform: инфраструктура на уровне кода | страница 45



В реальных условиях для создания веб-сервера использовался бы веб-фреймворк наподобие Ruby on Rails или Django. Чтобы не усложнять этот пример, мы запустим простейший веб-сервер, который всегда возвращает текст Hello,World29:

#!/bin/bash

echo "Hello, World" > index.html

nohup busybox httpd -f -p 8080 &

Рис. 2.6. Начнем с простой архитектуры: одного веб-сервера, запущенного в AWS, который отвечает на HTTP-запросы

Это bash-скрипт, записывающий текст Hello, World в файл index.html, который затем раздается на порте 8080 с помощью веб-сервера, запущенного с использованием инструмента под названием busybox (https://busybox.net/) (в Ubuntu установлен по умолчанию). Я указал команду busybox между nohup и &, чтобы веб-сервер постоянно работал в фоне, даже после завершения bash-скрипта.


Номера портов

В этом примере вместо стандартного HTTP-порта 80 используется 8080. Дело в том, что все порты меньше 1024 требуют администраторских привилегий. Это потенциальный риск безопасности, поскольку любой злоумышленник, которому удастся взломать ваш сервер, тоже получит привилегии администратора.

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

Как запустить этот скрипт на сервере EC2? Как уже упоминалось в подразделе «Средства шаблонизации серверов» на с. 31, для этого обычно применяется инструмент вроде Packer, который создает пользовательский образ AMI с предустановленным веб-сервером. Поскольку в этом примере в качестве веб-сервера используется однострочный скрипт на основе busybox, вы можете обойтись стандартным образом Ubuntu 18.04 и запустить скрипт Hello, World в рамках конфигурации пользовательских данных вашего сервера EC2. Вы можете передать параметру user_data в коде Terraform то, что будет выполнено при загрузке сервера: либо скрипт командной оболочки, либо директиву cloud-init. Вариант со скриптом показан ниже:

resource "aws_instance" "example" {

  ami                   = "ami-0c55b159cbfafe1f0"

  instance_type         = "t2.micro"

  user_data = <<-EOF

              #!/bin/bash

              echo "Hello, World" > index.html

              nohup busybox httpd -f -p 8080 &