Хотя большинство разработчиков переходятся на неверные и контейнерные архитектуры для создания их приложений, экземпляры EC2 по-прежнему являются одними из самых популярных и использованных услуг AWS. В этом блоге я буду проходить через шаги, необходимые для развертывания ваших масштабируемых приложений Nodejs на Amazon EC2, используя AWS CodePipipeline, и упомянуть некоторые проблемы, которые вы можете столкнуться с тем, чтобы настроить это решение. Это может сначала казаться простыми, но поверь мне, это требует больше усилий, чем вы ожидаете, и это главная причина, по которой я пишу этот блог сегодня.
Хорошо, достаточно сказано, теперь давайте рок-н-ролл! 🎸
Услуги, покрытые в этом блоге:
- Amazon EC2.
- AWS CodePipieline EC2.
- AWS CodeBuild.
- AWS CODDEDOWLED
- Nodejs
- Упругая балансировка нагрузки
- Amazon Auto Scaling
- PM2.
- Nginx.
Предположим, что вы успешно настроили базовую инфраструктуру с помощью предпочтительного метода (вручную, CDK, CloudFormation, Terraform и т. Д.)
Итак, вы настроили свои экземпляры EC2, CodedePload Agent, AutoScaling Group, установили новейшие версии NGINX, NODEJS и PM2 в экземплярах EC2 и готовы развернуть приложение Nodejs через AWS CodePipiple. Во-первых, вы начинаете с создания нового проекта трубопровода, подключитесь к исходному провайдеру, например, GitHub, затем CodeBuild для компиляции исходного кода и выполнение некоторых модульных тестов, то, наконец, выбираете код AWS развертывающую для развертывания ваших последних выпусков на Amazon EC2 через Группа развертывания. Сложная часть поставляется с файлами BuildSpec.yml и appspec.yml, где вы можете установить коллекцию команд, используемых для создания и развертывания вашего кода. Первое, что приходит к уму, является создание ниже файлов BuildSpec и AppSSPEC.
buildspec.yml Файл
version: 0.2 phases: install: runtime-versions: nodejs: 10 commands: - echo Installing pre_build: commands: - echo Installing source NPM dependencies. - npm install build: commands: - echo Build started on `date` - echo Compiling the Node.js code - npm run build post_build: commands: - echo Build completed on `date` artifacts: files: - '**/*'
appspec.yml Файл
version: 0.0 os: linux files: - source: / destination: /usr/share/nginx/html
Вы нажимаете свой код в вашу систему управления версией (GitHub в нашем случае) и запускаете свой первый трубопровод CodePipipeline и угадаете, что? Трубопровод успешно завершится на этом этапе. Теперь мы рады запустить наш сценарий узла, используя «NPM Start», но вдруг мы получим ошибку ниже:
Ошибка: не могу найти модуль ‘../package.json’
Но как? Мы уверены, что наш Package.json файлы расположены под корневым каталогом и библиотеками в папке Node_Modules. Честно говоря, единственное исправление для этой проблемы — бежать NPM Rebuild
Или просто удалите папку Node_Modules и запустите NPM установить
снова на экземпляре EC2. После этого вы сможете начать скрипт узла. Замечательно Но это не соответствует нашим требованиям. Мы ищем полностью автоматизированное развертывание с нулевым человеческим вмешательством. К счастью, Крюки событий жизненного цикла Раздел «Умирот-файл». Вот как наши два файла выглядят сейчас:
buildspec.yml Файл
version: 0.2 phases: pre_build: commands: - echo Installing source NPM dependencies... - npm install build: commands: - echo Build started on `date` - echo Compiling the Node.js code - echo Running unit tests - npm test post_build: commands: - echo Build completed on `date` artifacts: files: - '**/*'
appspec.yml Файл
version: 0.0 os: linux files: - source: / destination: /usr/share/nginx/html hooks: BeforeInstall: - location: scripts/BeforeInstallHook.sh timeout: 300 AfterInstall: - location: scripts/AfterInstallHook.sh timeout: 300
- ForeInstall: Используйте для запуска задач до создания задач замены. Одна целевая группа связана с исходной задачей задач. Если указан необязательный прослушиватель тестирования, он связан с исходной задач задач. В этот момент откат невозможен.
#!/bin/bash set -e yum update -y pm2 update
- После завершения задачи: Используйте для запуска задач после создания задач замены, и с ним связано одна из целевых групп. Если указан необязательный прослушиватель тестирования, он связан с исходной задач задач. Результаты функции крюка на этом событии жизненного цикла могут вызвать откат.
#!/bin/bash set -e cd /usr/share/nginx/html npm install npm run build
Примечание: Мы устанавливаем множество флага, чтобы остановить выполнение наших скриптов в случае ошибки.
Другой вопрос, который вы можете столкнуться даже после обновления ваших файлов AppSPEC и BuildSpec: Развертывание не удалось, потому что указанный файл уже существует в этом месте:/usr/share/nginx/html/.cache/plugins/somefile.js
В нашем случае мы решим это, просто задавая кодовые недостатки, чтобы заменить уже существующие файлы, используя Перезаписать: правда
вариант.
Final appspec.yml Файл
version: 0.0 os: linux files: - source: / destination: /usr/share/nginx/html overwrite: true hooks: BeforeInstall: - location: scripts/BeforeInstallHook.sh timeout: 300 AfterInstall: - location: scripts/AfterInstallHook.sh timeout: 300
Идеально, мы достигли сцены, что после успешного завершения CodePipipeline AWS мы можем запустить наш сценарий NPM без проблем с любыми проблемами. Пришло время автоматически перезапустить наше приложение на каждое новое развертывание, используя PM2, который является инструментом управления процессом, ответственным за работу и управление нашими приложениями Node.js.
Просто беги Sudo NPM Установить PM2 @ Последние -G
В ваших экземплярах EC2, затем генерируйте файл PM2 ECOSYSTEM.config.js, чтобы объявить приложения/услуги, которые вы хотели бы развернуть свой код, выполнив эту команду ECOSYSTEM PM2
Отказ PM2 будет генерировать файл пример для вас, поэтому убедитесь, что он соответствует вашей структуре приложения.
Ecosystem.config.js Файл
module.exports = { apps : [{ name: "npm", cwd: '/usr/share/nginx/html', script: "npm", args: 'start', env: { NODE_ENV: "production", HOST: '0.0.0.0', PORT: '3000', }, }] }
На этом этапе вы можете просто запустить PM2 Запустить ECOSYSTEM.config.js
и PM2 начнут ваше приложение для вас. Но это не единственная сила PM2. Этот модуль может фактически перезапустить ваше приложение автоматически при каждом новом выпуске, просто включая параметр WatchSe в файле Ecosystem.config.js.
Final Ecosystem.config.js Файл
module.exports = { apps : [{ name: "npm", cwd: '/usr/share/nginx/html', script: "npm", args: 'start', watch: true, env: { NODE_ENV: "production", HOST: '0.0.0.0', PORT: '3000', }, }] }
Чудесно! Мы создали полностью автоматизированный трубопровод развертывания, который может запустить тесты, устанавливать, установить, сборку и развертывать модули узлов на экземплярах Amazon EC2, затем PM2 позаботится о перезапуске приложения для нас.
Хорошо, что если наш сервер по какой-то причине перезагрузил? Мы хотим, чтобы наше приложение начать автоматически, и это также может быть достигнуто с помощью PM2 Startup
Параметр, который можно выполнить после запуска вашего приложения.
До сих пор мы ничего не пропустили? О, да! Автоскалинг Мы хотим убедиться, что наша производственная среда достаточно масштабирована, чтобы вместить огромные нагрузки на наше приложение.
Это может быть легко установлено через AWS CodeDeDeploy, обновляя конфигурацию группы развертывания в групповой среде от экземпляров Amazon EC2 «Стратегия метки» на группы масштабирования Amazon EC2. Это отличная функция AWS CODDEDEDOPLE, где он может автоматически развернуть последние изменения в новых экземплярах, сохраняя желаемое количество экземпляров здоровых во всем развертывании. Однако мы столкнемся с другой проблемой здесь. PM2 Startup гарантирует, что ваше приложение запускается после того, как любой запрет запрещен, но, к сожалению, не работает так, когда AutoScaling Group запускает новые экземпляры, поэтому приложение не работает автоматически в случае горизонтального масштабирования. Но не волнуйтесь, я получил твою спину!
Чтобы решить эту проблему, перейдите к настройкам конфигурации запуска, а в разделе «UserData» добавьте его скрипт Bash.
#!/bin/bash -ex # restart pm2 and thus node app on reboot crontab -l | { cat; echo "@reboot sudo pm2 start /usr/share/nginx/html/ecosystem.config.js -i 0 --name \"node-app\""; } | crontab - # start the server pm2 start /usr/share/nginx/html/ecosystem.config.js -i 0 --name "node-app"
Там вы идете! Теперь у вас очень масштабируемое приложение NODEJS, которое полностью автоматизировано с помощью AWS CodePipeline.
Я надеюсь, что этот блог был информативным вам всем. Я пробовал как можно больше, чтобы этот блог выглядел как историю, потому что основной целью написания, чтобы показать вам множество проблем, которые работают в разработчиках и разработчиках, чтобы настроить этот раствор, и различные способы решения его. Я не буду перестать обновлять этот проект и убедиться, что он имеет план улучшения, потому что я знаю, что это может быть лучше!
Использованная литература:
- https://regbrain.com/article/node-nginx-ec2
- https://pm2.keymetrics.io/docs/usage/startup
- https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-ubuntu-20-04
- https://cloudnweb.dev/2019/12/a-complete-guide-to-aws-elastic-load-balancer-using-nodejs/
- https://pm2.keymetrics.io/docs/usage/watch-and-restart/
- https://pm2.keymetrics.io/docs/usage/application-declaration/#cli
Оригинал: «https://dev.to/aws-builders/deploying-nodejs-application-on-amazon-ec2-using-aws-codepipeline-20i1»