Как правильно маштабировать проект на Amazon AWS?
Вообще то есть "best practices". Да, это использовать Load Balancer и Auto Scaling. 
А вот AMI можно приготовить или как говорят на западе в этом контексте "to bake the image". Есть очень удобный тул от Hashicorp - Packer. С его помощью можно сделать готовый AMI со свежей версией вашего проекта. Далее создаете новый ASG с этим AMI.
Делаем релиз:
Старый AS оставляем 100% и плавненько увеличиваем капасити нового AS, доходим до количества инстансов 100%. Трафик идет и на старые инстансы и на новые(со свежим кодом), смотрим логи, всё в порядке? Новая версия встала как надо? Тогда уменьшаем количество инстансов старого AS до нуля. Релиз закончился. Если что то не так с новой версией можно легко ролбекнутся на старую, и даже спустя время(час, день, неделя) можно сделать удобный и четкий роллбек на любой ваш релиз, благо все ASG у вас есть, капасити нужного релиза увеличиваем, не нужного уменьшаем. Это и есть zero downtime deployment. Кстати таким макаром удобно делать  A/B тестирование.  
P.S создавать AS тоже можно делать удобно: terraform
Новые инстансы никогда не будут подниматься за 1 наносекунду, да и за 1 секунду тоже. Для переживания пиков надо заранее увеличивать размер кластера.
По поводу ASG на основе своего AMI: образ надо регулярно обновлять дабы не отставать по системным пакетам и уменьшать время деплоя кода. Процесс простой: создаёте копию текущего Launch configuration с новым AMI ID, переключаете на него ASG (настройки терминации инстансов по-умолчанию сами выводят инстансы по старости их конфига).
Про деплой кода при старте: ваша мысль верная, с помощью User-Data (скрипт на баше или cloud-init - по вкусу), заодно избавляет от заморочек с уведомлением ASG о готовности инстанса т.к. является частью стандартного процесса запуска.