Первый подход, использующий развертывание кода, означает, что вам доступно много конфигураций развертывания.
Это может быть либо для изменений, связанных с приложением, либо для изменений в инфраструктуре.
Как вы упомянули, артефакты развертываемых приложений загружаются на S3, а CodeDeploy делает все остальное в зависимости от конфигурации развертывания. Это дает вам возможность автоматически откатывать изменения и т. Д.
Кроме того, я считаю, что ssh-доступ не требуется при работе с инфраструктурами, связанными с CodeDeploy, поэтому это уменьшает некоторые проблемы с обслуживанием и безопасностью, связанные с ключами и т. Д.
Со стороны инфраструктуры. Относительно легко построить некоторую инфраструктуру с балансировкой нагрузки (ELB + ASG) в AWS и связать ее с CodeDeploy. Агент - это все, что требуется. Однако, если вам нужно настроить инфраструктуру, то есть масштабировать или увеличить ее. Эти изменения можно относительно легко внедрить с помощью CodeDeploy и его конфигураций развертывания.
Кроме того, из корзины S3 вместо прямого перехода на CodeDeploy можно включить CodePipeline, состоящий из этапов развертывания, которые развертываются в различных средах, подключенных к CodeDeploy. Это означает, что, возможно, некоторые задачи тестирования, выполняемые Jenkins, можно было бы делегировать CodeDeploy или этапу CodePipeline, который ведет к завершающему этапу CodeDeploy.
Это всего лишь причины, по которым, на мой взгляд, первый вариант лучше. Подводя итог, я думаю, что первый вариант стратегически более полезен в долгосрочной перспективе, если предположить, что ваши требования могут измениться. Используя CodeDeploy, вы можете позже адаптировать и расширить свой подход.
Надеюсь, это поможет!
Patrick