Алибаба и Terraform — Раскатываем большую сеть ВМ в Alibaba Cloud — Часть 1

На днях было решено что поднимаем наш проект в Alibaba Cloud. Около 100 однотипных виртуалок, из них 10 — это ядро.

Руками это делать нереально. Все виртуалки должны быть размазаны по 15-и различным регионам (Азия, Америка, Европа). Должны быть какие-никакие правила для фаерволла. Быть прокинуты ключи. Было решено использовать Terraform.

Подготовка

Terraform инструмент прекрасный, но из-за ограничений с их стороны для RU сегмента, немного мешает.

Очень приятно встречать данную надпись, когда нужно регулярно гуглить.

Сначала надо установить Terraform. У нас много ВМ в разных регионах, никаких проблем что бы что-то скачать.

И закинуть по SCP.

Распаковываем с помощью unzip и закидываем куда вам удобно.

Теперь нужно подготовить провайдер, которым будем управлять. Для Alibaba Cloud есть провайдер aliyun/alicloud. Вот с его установкой уже могут возникнуть проблемы.

УПС, 403 Forbidden, кто бы мог подумать…

Что-ж, скачаем на другой машине архив с этим provider и перекинем через SCP и установим вручную.

Скачаем версию и для коллег с MacOS.

Перекинем себе помощью SCP.

Подготовим каталог, в котором будем все хранить и потом запушим в GitLab (или кто чем пользуется).

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

Создадим.

И распакуем архивы.

Должно получиться вот так

Можно добавить провайдеров под любую ОС_Архитектуру

Теперь можно создавать первую десятку ВМ!

Развертывание

Сразу отступление. Есть пример от Alibaba Cloud, о том, как развернуть ресурсы в нескольких регионах одним манифестом.

https://www.alibabacloud.com/blog/deploy-mongodb-instances-in-multiple-regions-automatically-using-terraform_598069

НО! При попытке провернуть тоже самое, задав провайдеру alias, ловил ошибку как на скриншоте ниже

Не знает, говорит, ни о каких опциях, кроме тех что вывел. Я попробовал перебрать множество версий провайдера, но там везде такая же ошибка.

Придется делать для каждой ВМ отдельный каталог и управлять отдельно каждой виртуалкой, что не очень удобно, но с другой стороны — надежнее. Ядро из 10 ВМ — самое важное.

Создаю каталог под ВМ — mgd00

Создаю манифест main.tf. Заполняю данными для провайдера.

Первая ВМ будет в регионе India (Mumbai).

Коды регионов и зон можно найти тут: https://www.alibabacloud.com/help/en/elastic-container-instance/latest/regions-and-zones

Создаю variables.tf. Добавляю переменные с access_key и secret_key.

Где взять ключи? В RAM Account (Alibaba Cloud рекомендуется завести отдельного пользователя под именем Terraform) в профиле есть пункт AccesKey Management.

Там можно создать ключи.

При создании будет сказано, что их нужно сохранить в надежном месте и никуда не выкладывать. Повторно значения ключей посмотреть не получится.

Теперь проинициализируем провайдера, с указанием путей до плагинов, из каталога mgd00.

На скриншоте не тот каталог, но скоро он тоже будет существовать

Теперь создаем resource.

Что нам нужно:

  • VPC (Virtual Private Cloud).
  • vSwitch.
  • Security Group.
  • Правила для Security Group (22, ICMP, специфичный порт).
  • Открытый ключ, что бы подключаться к ВМ.
  • Монтирование ключа к ВМ.
  • Внешний IP.
  • Сам инстанс (ВМ).

Начнем с сети. VPC и vSwitch.

Alibaba Cloud не дает создать сетевой интерфейс с внешним IP и только. Придется делать локальную сеть. Мне бы хватило 1 IP, но взял сеть чуть больше, с запасом. Ядро из 10 ВМ являются ведущими нодами, они будут раздавать с себя информацию в интернет.

Теперь Security Groups и правила к ней.

По умолчанию, весь исходящий трафик открыт, никаких доп. правил не нужно.

Теперь нужно решить вопрос с ключами. Оказалось, что нельзя взять пачку ключей и привязать к ВМ. 1 ключ — 1 ВМ. Спасибо, Alibaba!

Спасибо, Alibaba!

Добавим ключ и привязку. Переменную с ключом можно будет увидеть дальше.

Теперь сам инстанс (ВМ) и дополним переменные к нему.

Переменные в variables.tf

Важные пояснения по всем опциям.

  • image_id — я не нашел список всех ID образов, придется смотреть в веб-морде Alibaba Cloud.
  • instance_type — Как можно заметить, в переменных у меня есть type_a, type_b, type_c. Все потому, что мне нужна самая дешевая ВМ, но не во всех регионах есть одинаковый тип инстансов. Для Dubai и London пришлось использовать другие.
  • instance_charge_type — Оплата. Для тестов, рекомендую ставить PostPaid (Pay-as-you-go, плати потихоньку). Для прода уже поставил PrePaid, оплата сразу и так выходит чуть дешевле.
  • period — Требуется только при типе оплаты PrePaid, нужно указать число (месяцы, по умолчанию), на сколько покупается инстанс.
  • system_disk_category — Тип диска. Почитать о типах можно тут: https://www.alibabacloud.com/help/en/elastic-compute-service/latest/disk-categories
  • system_disk_size — Размер диска. Минимум 20. Его и выбрал.
  • internet_charge_type — Оплата внешнего канала. C объявлением данной опции автоматом получаем внешний IP. PayByTraffic — за 1 GB трафика отдаем 0.5-1 Юань. PayByBandwidth — за 1 Мбит безлимитного интернета отдаем 30 Юаней (!!!).
  • internet_max_bandwidth_out — Ширина внешнего канала. Их у меня опять 2 типа, т.к некоторые инстансы не поддерживают 100 Мбит. Можно догадаться, что будет если выбрать оплату PayByBandwidth и указать ширину канала как 100 Мбит.

Для удобства, еще сделаем output.tf, что бы сразу видеть внешний IP.

Все готово. Попробуем запустить. Хотя лучше, сначала сделайте terraform plan.

От другого запуска скриншот, но и не важно

Все внимательно проверяем и печатаем yes.

Скриншота не осталось, но все должно пройти гладко.

Теперь осталось все продублировать еще 9 раз, сменить регион и развернуть ВМки.

Получилось что то по итогу такое

Красота

Дополнение. Я в каждом манифесте менял название региона в имени ресурса. Хотя можно было сделать одинаковое имя для всех ресурсов и просто копипастить. Я так делать не стал из-за того что работаю не один. Другой человек может не заметить в каком регионе он что-то делает, и совершить ошибку, и она может быть фатальной. Лучше в манифесте будет мельтешить название региона почаще.

Нужно запушить всё это добро в репозиторий. Рекомендация создать .gitignore и заполнить следующим образом.

В корне репозитория оставить variables.tf.example без ключей. Передать ключи коллегам можно по более надежным каналам.

В следующей статье будем разворачивать следующие 90 ВМ, уже в более правильном виде, в одном манифесте будет по 10 ВМ, в одном регионе.

Оставьте комментарий