Как обычно получается в жизни, очевидные вещи часто неочевидны. Даже создание и настройка пользователя для AWS - отдельная наука. Но рассказ про это будет в другой статье. А в этой я уже изначально исхожу что вы уже создали пользователя и зашли на AWS.
Отдельно хочу сказать, что волшебники из AWS иногда обновляют ту или иную вещь. Поэтому, если вдруг у вас что-то не получается следуя моему руководству - пишите мне, попробуем вместе. Может быть эту статью уже пора обновить.
Переходим в сервис EC2 и в левом меню находим Instances.Справа вверху жмём на кнопку Launch instances. В опциях выбираем Amazon Linux. Вы можете брать и другой Linux, но я думаю, если уж вы решили пользоваться амазоном - нужно максимально использовать платформу. Можно выбрать ARM - я выбираю х86. Там есть тир t2.micro - он околобесплатный. Но мне кажется его для NodeJS маловато, поэтому я беру t2.small - суммы несущественные, можно смело брать.
После чего создаётся инстанс и мы получаем pem сертификат для коннекта к нашему серверу по ssh. Не потеряйте его, потому что, не знаю как сейчас - раньше такой сертификат перевыпустить было целой историей, то есть, невозможно. У каждого свои методы где хранить такие вещи - кто в хранилищах, кто на дисках - ваше дело. Берём этот сертификат и кладём в директорию ssl внутри нашего пользователя (я так делаю).
Чтобы сертификат сработал на него обязательно нужно выдать права:
chmod 400 ssl/certs/your-website.pem
Теперь мы возвращаемся в браузер и находим наш публичный dns.
Копируем его и пробуем законнектиться по этому адресу через ssh, используя наш сертификат:
ssh -i ssl/certs/your-website.pem [email protected]
ec2-user перед собакой так и пишется - это ваш корневой пользователь в инстансе. хотя там есть отдельно root - он вам не понадобится. Законнектились? Выходите (написав exit) и идём дальше.
Подключать домен не обязательно. Если у вас не веб сайт - вы можете пользоваться публичным dns, описаным выше. Для этого есть разные кейсы - у нас будет сайт, поэтому подключаем.
Заходим в сервис Route53 и регаем новую hosting zone для нашего домена. Каждая hosting zone будет стоить пол доллара в месяц. Там всё просто - забиваем домен, она создаётся. Попадаем в нашу зареганную зону. Если домен регали не на aws - нужно прописать адреса NS-ов.
Копируем их все и закидываем в NS-записи на сайте вашего регистратора.
Чтобы открыть порты на сервере, нам нужно открыть их в Security Group'ах, подключеных к нашему инстансу. В общем, переходим в EC2 и в левом меню находим Security Groups. Создаём нашу группу. Нас интересуют Inbound Rules. Откроем http и https порты на вход.
Осталось добавить это правило к уже существующим на инстансе.
Добавляем нашу новую Security Group'пу к уже подключенным. В теории там у нас будет группа для ssh подключения. Если удалите её - не подключитесь по ssh, пока не созданите новую.
Последним гвоздём станет подключение статического IP и переход на www. И, если делать переход с www - дело, сугубо, вкуса. То наличие статического адреса для вебсайта сегодня обязательно. Это не бесплатно - что делать. В левом меню EC2 находим Elastic IPs - это они и есть. В настройках указываем наш EC2 инстанс. Если вы всё делали правильно - публичный IP у инстанса должен смениться на ваш статический.
Копируем его и идём в Route53. Теперь нам нужно сделать две вещи.
В итоге у нас получается что-то такое. Мы закончили с AWS - переходим к настройкам сервера.
Для начала запустим наш сайт. Для этого нам понадобятся git, NodeJs и pm2. Установим их.
sudo yum install git -y
В гайдах рекомендуют часто устанавливать nodejs из snap'a или из через nvm - по мне это излишне.
sudo yum install -y nodejs
Скачиваем гитом наш сайт и устанавливаем зависимости:
npm install --only=production
Для запуска приложения я рекомендую использовать pm2. В нём очень удобные мониторы чтобы смотреть статусы приложения
npm i -g pm2
Если вдруг где-то у вас нехватает прав - посмотрите официальное руководство npm.
Запускаем сайт и проверяем что он запустился через curl
curl http://localhost:3000
Завершающий шаг - устанавливаем и настраиваем NGINX. Кто-то пользуется Apachi - мне как-то он со времён php казался неоправданно сложным.
sudo amazon-linux-extras install nginx1
Идём в /etc/nginx и создаём там директорию для конфигов сайта
cd /etc/nginx
sudo mkdir sites-available
Создаём конфиг - открываем для редактирования файл в nano или vim - мне роднее vim.
cd sites-available
sudo vim my-website.ru.conf
Закидываем туда простой конфиг на 80 порт с редиректом на www
server {
listen 80;
listen [::]:80;
server_name your-website.ru;
return 301 http://www.your-website.ru$request_uri;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name www.your-website.ru;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Не забываем в proxy_pass подправить порт под нужный нам. Сохраняем и закидываем конфиг в активные.
cd ..
sudo mkdir sites-enibled
sudo ln -s /etc/nginx/sites-available/my-website.ru.conf /etc/nginx/sites-enabled/my-website.ru.conf
Включаем папочку. Для этого нам нужно подправить базовый конфиг nginx.
sudo vim /etc/nginx/nginx.conf
Инклюдим все конфиги из sites-enabled и выключаем дефолтный сайт.
Рестартуем nginx и идём на наш домен с http вначале (http://your-website.ru). Если у вас всё настроено правильно вы увидите ваш сайт в браузере.
Самый простой способ перекинуть ваш домен в https - использовать либу для nginx с автоматической регистрацией. Установим её.
sudo yum install -y python-certbot-nginx
Пропишем наш домен.
sudo certbot --nginx -d your-website.ru -d www.your-website.ru
sudo systemctl restart nginx
Если вы всё сделали правильно - ваш конфиг должен обновиться до конфига, который работает с https. Но я иногда нахожу в них небольшие опечатки в редиректах - их легко поправить ручками. Не забудьте только перезагрузить сервер. В браузере убеждаемся, что наш сайт по-прежнему открывается.
Последним штрихом будет утвердить в вебе что у вашего сайта есть годный ssl сертификат. Оно может и само пройдёт - но я всё же думаю надо это делать самостоятельно. Копируем наш домен и забиваем его в SSL Server Test.
В заключение хочу сказать что это самый простой и примитивный способ деплоя на AWS. Безусловно, сегодня все нормальные сайты, как минимум, закручены в контейнеры. Поэтому, если вы планируете пользоваться AWS и дальше - вам придётся изучить Docker с ECS - без этого никак. Но, для первого сайта - этого хватит.