Express.js и AWS Lambda – бессерверная история любви

1656676692 expressjs i aws lambda – besservernaya istoriya lyubvi

Слободан Стоянович

Если вы разработчик Node.js или вы создали API с помощью Node.js, есть большой шанс, что вы использовали Express.js. Экспресс есть где факто самый популярный фреймворк Node.js.

Экспресс-программы легко создавать. Для простого приложения вам просто нужно добавить несколько маршрутов и обработчиков маршрутов. Это оно.

jPiykM308q60-GoIAAHpb29s8rCZwICxw8Ql
Простая, традиционно размещенная программа Express.js с одним запросом.

Например, самая простая программа Express выглядит как такой фрагмент кода:

'use strict'
const express = require('express')const app = express()
app.get('/', (req, res) => res.send('Hello world!'))
const port = process.env.PORT || 3000app.listen(port, () =>   console.log(`Server is listening on port ${port}.`))

Если вы сохраните этот фрагмент кода как app.js в новой папке, вы всего в трех шагах от простой программы Express:

  1. Создайте новый проект Node.js. Для этого запустите npm init -y в вашем терминале. Просто убедитесь, что вы перешли в папку, содержащую app.js сначала.
  2. Установите модуль Express с NPM, запустив npm install express --save команда из терминала.
  3. Запустите node app.js и вы должны увидеть «Сервер прослушивающий порт 3000». как ответ.

Вуаль! У вас есть приложение Express. Перейдите в свой браузер, и вы увидите Hello world! сообщения.

Развертывание программы

Теперь наступает сложное: как вы можете показать это своим друзьям или семье? Как сделать его доступным для всех?

Развертывание может быть длительным и болезненным процессом, но представим, что вам удается сделать это быстро и успешно. Ваше приложение доступно для всех, и он жил долго и счастливо.

Пока однажды им не начала пользоваться неожиданная пользовательская армия.

У сервера были проблемы, но он работал.

ueApaQnpCr59fOa5uoPBwHQsJRTHcbzr9FHn
Простая, традиционно размещенная программа Express.js под нагрузкой.

По крайней мере, на некоторое время. А потом он умер. ☠️

S4odA9NYozNbrZ1hHjZ3avcFeo2SO15oVJah
Простой, но мертвый, традиционно размещенный Express.js, вышедший из строя из-за того, что много пользователей обращались к нему.

Армия пользователей разгневана (по крайней мере, они не заплатили за программу — не заплатили ли?) Вы в отчаянии и пытаетесь найти решение в Google. Может облако помочь?

ExXxV2mNOs2LIgwTyPX1svo1xZkdEQQ6ycWi
Облако должно решить ваши проблемы с масштабированием, не правда ли?

И вы снова встретили одного из своих раздражающих друзей. Она снова говорит о бессерверной штучке. Но давайте у вас все еще есть сервер. Он просто принадлежит кому-то другому, и у вас нет над ним контроля.

xZJgWMPLs-Mi-hsYtrp6vps2HQyI6h3uA8Wf
Но есть серверы!

Но вы отчаялись, вы бы попробовали все, включая черную магию и даже без сервера. «Что это за бессерверная вещица?»

Вы получили много ссылок, включая ссылку на бесплатный первый раздел «Бессерверные программы с Node.js» от Manning Publications.

В этом разделе объясняется бессерверное использование стиральных машин! Звучит безумно, но это имеет смысл. ? уже стал фанатом, потому вы решили попробовать.

Сделать вашу программу Express.js бессерверной

Эта глава была посвящена бессерверному режиму AWS. И теперь вы знаете, что бессерверный API состоит из функций API Gateway и AWS Lambda. Но как вы можете работать без сервера с помощью Express?

Это звучит так же многообещающе, как тот фильм о том, как Мэтт Дэймон уменьшается…

CAukVX9EmOszN8MqqTioMl6ARqgdrJQHu3pv
Как вставить свою программу Express.js в AWS Lambda?

Клаудия может помочь вам развернуть ваше приложение на AWS Lambda – давайте попросим его о помощи!

Перед выполнением команд Claudia убедитесь, что вы настроили свои учетные данные доступа к AWS, как описано в данном руководстве.

Ваш код следует изменить, чтобы поддерживать AWS Lambda и развертывание через Claudia. Вам нужно экспортировать свой app вместо запуска сервера с помощью app.listen. ваш app.js должен выглядеть следующий список кодов:

'use strict'
const express = require('express')const app = express()
app.get('/', (req, res) => res.send('Hello world!'))
module.exports = app

Это нарушит работу локального сервера Express, но вы можете добавить app.local.js файл такого содержимого:

'use strict'
const app = require('./app')
const port = process.env.PORT || 3000app.listen(port, () =>   console.log(`Server is listening on port ${port}.`))

Затем запустите локальный сервер с помощью такой команды:

node app.local.js

Чтобы ваша программа правильно работала с AWS Lambda, необходимо создать оболочку AWS Lambda для своей программы Express. С Claudia вы можете сделать это, выполнив такую ​​команду в вашем терминале:

claudia generate-serverless-express-proxy --express-module app

где app это имя файла входа вашего приложения Express, только без .js расширение.

Этот шаг создал файл с названием lambda.jsтакого содержания:

'use strict'const awsServerlessExpress = require('aws-serverless-express')const app = require('./app')const binaryMimeTypes = [  'application/octet-stream',  'font/eot',  'font/opentype',  'font/otf',  'image/jpeg',  'image/png',  'image/svg+xml']const server = awsServerlessExpress  .createServer(app, null, binaryMimeTypes)exports.handler = (event, context) =>  awsServerlessExpress.proxy(server, event, context)

Это! Теперь вам нужно только развернуть свою программу Express (с lambda.js файл) в AWS Lambda и API Gateway с помощью claudia create команда.

claudia create --handler lambda.handler --deploy-proxy-api --region eu-central-1

Через несколько секунд команда завершилась и напечатала ответ:

{  "lambda": {    "role": "awesome-serverless-expressjs-app-executor",    "name": "awesome-serverless-expressjs-app",    "region": "eu-central-1"  },  "api": {    "id": "iltfb5bke3",    "url": "  }}

И если вы перейдете по ссылке из этого ответа в своем браузере, он напечатает Hello world! Это сработало! ?

tp2YxJ0FlE5CNYnsNVXd9wvQnvPolDGI-8kR
Программа Express без сервера.

Благодаря бессерверной программе, ваша армия пользователей может продолжать расти, а ваша программа будет работать.

Это возможно, поскольку AWS Lambda автоматически масштабирует до 1000 одновременных запусков по умолчанию. Новые функции готовы через несколько минут после того, как шлюз API получит запрос.

IXjAf4zo1k645HGOC9P-YSPqmYlss6wXRTUf
Бессерверное приложение Express.js под большой нагрузкой.

Но это не единственная ваша польза. Вы также сэкономили деньги, кроме того, чтобы иметь стабильную программу под более высокой нагрузкой. С AWS Lambda вы платите только за использованные запросы. Кроме того, первый миллион запросов ежемесячно являются бесплатными как часть бесплатного уровня.

iAe-5ys7ROwR1NJ7vZIEOhNMmBhIVY89wdU3
Ваше бессерверное приложение также экономит ваши деньги!

Чтобы узнать больше о преимуществах вашего бизнеса благодаря бессерверному режиму, просмотрите статью.

Ограничение бессерверных программ Express.js

Программы Express без сервера звучат отлично, но они имеют некоторые ограничения.

WfoHBlMIEMr7Z84f3r9XWili4O3zUy0DwmyX
Бессерверная, ограниченная версия.

Некоторые из важных ограничений бессерверных программ Express:

  • Веб-сокеты не работают с AWS Lambda. Это потому, что сервер не существует, когда нет запросов. Некоторая ограниченная поддержка веб-сокетов доступна через веб-сокеты AWS IOT через протокол MQTT.
  • Загрузить в файловую систему также не будет работать, если вы не загружаете в /tmp папку. Это потому, что функция AWS Lambda доступна только для чтения. Даже если вы загружаете файлы в /tmp папки, они будут существовать недолго, пока функция еще «теплая». Чтобы убедиться, что функция загрузки работает нормально, необходимо загрузить файлы в AWS S3.
  • Пределы выполнения может также повлиять на бессерверную программу Express. Поскольку API Gateway имеет время ожидания 30 секунд, максимальное время выполнения AWS Lambda составляет 5 минут.

Это только начало бессерверной истории любви между программами и AWS Lambda. Скоро ждите больше историй!

Как всегда, большое спасибо моим друзьям Александру Симовичу и Миловану Йовичичу за помощь и отзывы о статье.

Все иллюстрации созданы с помощью программы SimpleDiagrams4.

Если вы хотите узнать больше о бессерверном Express и бессерверных программах в целом, посмотрите книгу «Бессерверные программы с Node.js», которую я написал вместе с Александром Симовичем для Manning Publications:

Бессерверные программы с Node.js
Убедительное вступление в бессерверное развертывание с помощью Claudia.js.www.manning.com

Эта книга научит вас больше о бессерверных программах Express, но вы также узнаете, как создать и наладить реальный бессерверный API (с БД и аутентификацией) с помощью Node и Claudia.js. И как создавать чат-боты для Facebook Messenger и SMS (с помощью Twilio), а также навыки Alexa.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *