EC2

Материал из ALT Linux Wiki
Версия от 13:25, 13 октября 2024; Zorg (обсуждение | вклад) (добавлена секция с описанием создания AMI при помощи packer и mkimage-profiles)


Amazon EC2 AMI с использованием mkimage-profiles и packer

Создание и регистрация AMI из готового образа

Инструкции ниже упрощены и адаптированы под ALT Linux, их оригинал и дополнительные технические детали можно изучить в репозитории: archlinux-ec2.

Для сборки AMI используется уже развернутое окружение в Amazon AWS. Достаточно следующего минимального набора: VPC и subnet. Subnet должна иметь Internet Gateway, то есть инстансы в ней должны быть доступны публично (SSH достаточно).

В указанной subnet будет развернута временная EC2, к которой будет подключен дополнительный диск. На этот диск будет записан указанный образ ALT Linux и из полученного диска создан AMI.

Предположим, что образ ALT Linux из которого планируется создать EC2 instance уже готов. Автоматизировать создание и регистрацию EC2 можно с использованием packer. Содержится в одноименном пакете.

После установки packer, необходимо доустановить плагин, который поддерживает работу с Amazon:

 packer plugins install github.com/hashicorp/amazon

Необходимые файлы для сборки можно найти в репозитории: altlinux-ec2.

Точка входа это Makefile.

В Makefile переменные AWS_REGION, AWS_VPC, AWS_SUBNET необходимо изменить в соответствии с имеющимся AWS окружением. Можно отредактировать сам файл или задать параметры как переменные окружения.

SOURCE_AMI это идентификатор AMI, из которого будет создана временная EC2. Это может быть какой угодно Linux, поддерживаемый AWS. В примере выбран AMI с Debian из региона eu-central-2. Полный список для Debian можно найти здесь: AmazonEC2Image/Bookworm.

AMI_NAME и AMI_DESCRIPTION опциональны, но могут быть удобны, если создание AMI поставлено на поток.

В IMAGEPATH ожидается путь до образа диска (сжатого xz) из которого разворачивать AMI. Подробнее смотри следующий раздел.

Токены доступа к AWS ожидаются в окружении или в ~/.aws/credentials.

Makefile будет вызывать packer с конфигурацией заданной в JSON файле packer-cfg.json. Файл не требует изменений.

В JSON файле конфигурации можно заметить что после загрузки образа во временную EC2 будет вызван скрипт provision.sh. Именно он "прошивает" образ на дополнительный раздел. Как видно из скрипта, никаких дополнительных действий кроме команды dd не нужно.

Запуск сборки после установки переменных окружения предельно прост:

 make ami

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

В конце работы команды будет выведен идентификатор AMI, который далее можно использовать в разворачивании EC2.

Создание образа ALT Linux пригодного для EC2

В целом, достаточно образа vm/cloud-systemd.img.xz получаемого из Mkimage-profiles:

 make ROOTPW=myStrongPass DEBUG=1 vm/cloud-systemd.img.xz

На момент 2024-10-13 созданный EC2 instance загрузится, но не будет иметь сети. В следующем разделе описано как добавить поддержку сети самостоятельно.

Включение поддержки ENA в ядре std-def и сборка образа с ним

Для сборки собственного ядра достаточно внимательно и аккуратно следовать инструкциям на странице Kernel/build_packages.

Требуемое изменение в ядро вносится одной командой:

 scripts/config --file config --module ENA_ETHERNET

После выполнения всех инструкций из указанной выше статьи у вас должен быть готов пакет с ядром в каталоге hasher, допустим kernel-image-std-def-6.1.112-alt2.x86_64.rpm.

Для того чтобы собрать образ диска для AMI именно с этим ядром, нужно сделать следующее.

Внести изменения в сценарий mkimage-profiles:

 diff --git a/conf.d/vm.mk b/conf.d/vm.mk
 index 62984e79..7fad629b 100644
 --- a/conf.d/vm.mk
 +++ b/conf.d/vm.mk
 @@ -32,6 +32,7 @@ vm/cloud-systemd: vm/systemd-net mixin/cloud-init use/vmguest/kvm use/tty/S0 \
         @$(call add,BASE_PACKAGES,systemd-settings-disable-kill-user-processes)
         @$(call add,DEFAULT_SERVICES_ENABLE,getty@tty1 getty@ttyS0)
         @$(call add,DEFAULT_SERVICES_DISABLE,consolesaver)
 +       @$(call add,THE_PACKAGES,kernel-image-std-def#6.1.112-alt2)
  
  vm/cloud-sysv: vm/net mixin/cloud-init use/vmguest/kvm use/power/acpi/button; @:
  

Подготовить файл конфигурации для APT extra-apt.conf:

 Dir::Etc::main "/dev/null";
 Dir::Etc::parts "/var/empty";
 Dir::Etc::SourceParts "/var/empty";
 
 Dir::Etc::SourceList "/home/USER/ami/sources.list";

В соответствующем sources.list должен быть указан путь до репозитория hasher:

 rpm [alt] http://ftp.altlinux.org/pub/distributions/ALTLinux Sisyphus/x86_64 classic
 rpm [alt] http://ftp.altlinux.org/pub/distributions/ALTLinux Sisyphus/noarch classic
 
 rpm-dir file:/home/USER/hasher/repo x86_64 hasher

Тогда сборка образа будет выглядеть следующим образом:

 make ROOTPW=mySecretPass DEBUG=1 APTCONF=/home/USER/ami/extra-apt.conf vm/cloud-systemd.img.xz

Данный образ уже будет иметь поддержку сети в окружении AWS.

Внимание! Обновление ядра внутри запущенной EC2 (update-kernel) приведет к потери сети, если новое ядро не имеет модуля ena.ko.

Amazon EC2 при помощи ec2-api-tools / ec2-ami-tools и mkve

ALT Linux и Amazon EC2

В настоящий момент возможно запустить виртуальные машины, созданные из ALT Linux Sisyphus на EC2. Запуск машин, созданных на базе стабильных бранчей указанным ниже способом пока невозможен. Вы можете как использовать публичные образы, так и создавать свои собственные.

Public AMIs

В настоящий момент есть 2 public AMI:

  • ami-52ed4f3b (us-east-1, минимальный Сизиф от 20120618, EBS)
  • ami-caec4ea3 (us-east-1, минимальный Сизиф от 20120618, Instance store)

Как создать собственный AMI (instance store)

AMI бывают двух типов: с instance store и с EBS store. Instance store живёт до выключения машины, EBS перманентен. Для создания собственного AMI с instance store:

  • Устанавливаем ec2-api-tools, ec2-ami-tools
  • Настраиваем Hasher
  • Берём актуальную копию скриптов: git clone git://git.altlinux.org/people/vitty/packages/ec2.git
  • Устанавливаем следующие переменные окружения:
  • В склонированном каталоге ec2 выполняем:
    • ./create_ec2_tar.sh
    • sudo ./create_ec2_image.sh ./output-20120528.tar $((2*1024*1024*1024)) (где output-xxxxxxxx.tar - сгенерированный предыдущей командой образ, второй параметр - объём диска в байтах)
    • ./create_ami.sh ./output-20120528.img (где output-xxxxxxxx.img - сгенерированный предыдущей командой образ файловой системы).
  • Вывод последней команды расскажет о том, как запустить виртуальную машину из загруженного образа (потребуется ещё иметь зарегистрированный ssh-ключ). Т.к. это instance store, образ её диска будет жить до выключения.
  • Имя внутреннего пользователя для доступа по ssh - ec2-user

Как создать собственный AMI (EBS store)

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

  • Создать новый Volume, подключить его к какому-нибудь Instance
    • ec2-create-volume --size 10 --availability-zone us-east-1a
    • ec2-attach-volume vol-xxxxxxxx --instance i-xxxxxxxx --device /dev/sdh
  • Создать на /dev/xvdh ext3, подмонтировать куда-нибудь (/tmp/mnt)
  • Закачать тарбол в данный instance
  • Развернуть его на /dev/xvdh (/tmp/mnt)
  • Отмонтировать
  • Отсоединить от VM (ec2-detach-volume vol-xxxxxxxx --instance i-xxxxxxxx)
  • Создать снапшот ec2-create-snapshot vol-xxxxxxxx
  • Зарегистрировать AMI ec2reg -a x86_64 -d "Description" -n "fancy name" -s snap-xxxxxxxx --kernel "aki-825ea7eb" (PVGRUB для us-east-1)

Технические детали

Главных отличий у EC2-машины два:

  1. Она грузится через PVGRUB т.е. ей нужен файл /boot/grub/menu.lst от первого grub. Также нужно несжатое ядро (vmlinux). Сгодилось бы и сжатое будь оно сжато gz/bz2. Такое ядро содержится в подпакетах kernel-image-domU-<flavoir>.
  2. При инициализации нужно как минимум положить ssh-ключ. Для этого существует специальный пакет cloud-init.

Поддержка

Поддержка оказывается в списке рассылке sisyphus@ и в личной почте vitty@.