Я создал группу автоматического масштабирования EC2 в AWS, и я ищу лучший способ управлять развертыванием кода в моих экземплярах с минимальным прерыванием обслуживания (желательно без) и минимальным риском для человеческой ошибки. (желательно ни одного, хахаха) ...
Это для веб-сайта Magento. Первоначально я рассматривал возможность хранения всего веб-контента в EFS (эластичной файловой системе) и монтирования его при загрузке моих EC2, так что была просто одна централизованная база кода, к которой у каждого из них был доступ. Я быстро обнаружил, что это была очень плохая идея - обслуживание веб-контента сайта размером с Magento через общий сетевой ресурс в основном неработоспособно, а с задержкой на EFS это даже хуже, чем у среднего общего ресурса NFS.
Сейчас я пытаюсь добиться централизованной базы кода в EFS с синхронизацией оттуда в «локальный» (EBS) каталог в каждом экземпляре в режиме, близком к реальному времени.
Я попытался rsync
, используя подход "вытягивания", когда каждый экземпляр передает файлы rsync из EFS в себя. Сначала он выглядел хорошо, но, кажется, постепенно замедляется с каждым сканированием (более часа при последней проверке).
Я попытался find
, аналогичный результат.
Я экспериментировал с файловый конвейерс symlink_or_copy
транспортер, но это все еще кажется медленным - возможно, потому, что по той или иной причине он не может использовать inotify
чтобы обнаружить изменения и возвращается к опросу.
В конечном итоге цель состоит в том, чтобы позволить разработчику развертывать новые и измененные файлы в одном месте, а эти файлы быстро и автоматически реплицировать во всех запущенных экземплярах. Разработчику не нужно знать или заботиться о том, сколько запущенных экземпляров - это, вероятно, будет меняться каждый час.
Этот ответ на аналогичный вопрос довольно хорош, и это тот подход, который я использую в настоящее время - обновляется один защищенный экземпляр EC2, создается новый AMI, остальные экземпляры уничтожаются и замены загружаются на основе нового образа. EFS в основном становится избыточным.
Но ручное вмешательство действительно намного сложнее и больше подвержено человеческим ошибкам, чем я могу придерживаться в долгосрочной перспективе. Я не хочу создавать новый AMI и конфигурацию запуска и обновлять группу автоматического масштабирования для использования этого нового LC каждый раз, когда я выполняю развертывание.
Итак ... как мне быстро и автоматически синхронизировать EFS с несколькими EC2?
Если я получу fileconveyor, работающий в тандеме с inotify, решит ли это проблему? Или это охота на диких гусей, кто-нибудь знает?
Вот что бы я сделал:
Это не ракетостроение, чтобы заставить работать, но может занять некоторое время, если вы не знакомы с ним. Как только вы это сделаете, автоматизация может сэкономить много времени на тестирование и развертывание.
AWS CodeDeploy может быть вариантом для этого. Вы можете создать артефакт из одного экземпляра EC2, отправить его на S3 и развернуть его. используя CodeDeploy. Цитата:
Наконец, агент AWS CodeDeploy на каждом экземпляре извлекает целевую ревизию из указанной корзины Amazon S3 или репозитория GitHub и, используя инструкции в файле AppSpec, развертывает содержимое в экземпляре.
CodeDeploy поддерживает развертывания Blue / Green и позволяет вносить изменения и откаты, что может быть полезно в вашем случае.