очень, очень странно что за год никто не ответил на этот вопрос, даже и не знаю, чувствую себя некромантом.
В общем-то, если не учитывать бестпрактисез - вы делаете единственно доступным вам правильным способом.
Snapshot - это резервное копирование диска, не виртуальной машины.
Бэкапить машину полностью, включая kernelid и другие настройки - это image (AMI)
Бестпрактиc, правда, не такой
Подготовка кода + скрипты настройки -> подготовка артефактов -> запуск машины
Подготовка кода + скрипты и подготовка артефактов
Здесь вы или подготавливаете артефакты(например zip архив в S3) с кодом и соответствующими ему скриптами, которые заставляют этот код работать на машине
И, опционально, подготавливаете AMI
Это рекомендованный способ во многих случаях. По сути вы сейчас делаете практически то же самое, но создаете AMI после публикации и стабилизации кода и настроек (правильно - до, и тестировать что получилось) . Кроме того ваш способ может привести к сюрпризам в будущем, поскольку вы накатываете изменения на уже существующую машину и какие-то настройки сделанные сейчас будут мешать работать будущим версиям.
Еще одна альтернатива - вообще не готовить AMI. Фиксировать версию кода и настроек(настроечных скриптов). Готовить из них артефакты(или просто git clone из репозитория по версии) и проводить все действия по настройке прямо на старте машины. У вас не будет некоей AMI которая привязана к вашему аккаунту - у вас будут скрипты которые можно запустить на любом аккаунте без промежуточного шага.
Инструменты:
подготовка AMI: packer, cloudformation
запуск инстанса: terraform, cloudformation
скрипты настройки: все что нравится, от банальных bash скриптов до ansible,chef,puppet, etc..
Настройка машины при запуске: cloud-init
CloudFormation - встроенный инструмент в AWS, но он сложноват в сравнении с packer и terraform