Это руководство шаг за шагом проведет вас через настройку уровня сервисов с использованием NodeJS с Express и Typescript и возможность работать как функция AWS Lambda. Все начинается с настройки службы базирования. Во-вторых, в нем показано, как использовать AWS DynamoDBto в качестве уровня базы данных. После этого показано, как запустить этот уровень обслуживания как функцию AWS Lambda. Наконец, показано, как использовать DynamoDB Local для разработки без затрат на чтение и запись в DynamoDB.

Итак, давайте начнем с создания папки с именем «serverlessNodeExpressServices».

Откройте в этой папке командную строку / оболочку питания / оболочку bash.

Запустите «npm init» в этом каталоге.

Следуйте инструкциям по созданию базового проекта промежуточного программного обеспечения NodeJS. Вы можете выбрать значения по умолчанию.

Введите «да», чтобы сохранить конфигурацию:

Будет создан файл package.json

Теперь установите следующие зависимости, необходимые для серверных служб NodeJS:

«Npm install @ types / node angular2-template-loader awesome-typescript-loader сжатие cors css-loader express extract-text-webpack-plugin file-loader html-webpack-plugin minimist node-sass pug raw-loader sass-loader style -loader tslint typescript url-loader webpack webpack-dev-server - сохранить »

Теперь установите зависимости, необходимые для взаимодействия с сервисами AWS и запуска его как бессерверного:

«Npm install aws-sdk aws-serverless-express - save»

После установки этих зависимостей ваш package.json должен выглядеть примерно так:

Теперь откройте проект в Visual Studio Code (или в любом другом редакторе по вашему выбору). Создайте папку «src» и создайте файл «app.ts».

Добавьте следующий код в app.ts:

Строки №1–4 - это операторы импорта, необходимые для запуска этой службы. Строки № 12–14, мы создаем маршрут / путь по умолчанию для нашего API, который просто вернет это сообщение: «Поздравляем! Ваш Node Express API работает ».

в строке 16 мы запускаем экспресс-сервер на порту 3000.

Теперь давайте создадим tsconfig.json в корневом каталоге проекта (на том же уровне, что и package.json).

Добавьте в «tsconfig.json» следующее:

Мы устанавливаем исходный каталог (в данном случае «src»), выходной каталог (который в данном случае называется «build») и некоторые параметры компилятора, например, какой стандарт ES мы хотим, чтобы транспилятор следовал.

Затем мы добавим несколько команд в раздел сценариев в package.json, чтобы перенести наш код машинописного текста в javascript и запустить экспресс-сервер:

Здесь команда «tsc» преобразует машинописный текст в javascript. Команда «clearBuild» удаляет все из каталога сборки. Команда «build» объединяет команды «clearBuild» и «tsc». Наконец, команда startServer запускает app.js, который, в свою очередь, запускает экспресс-сервер на порту 3000.

Теперь откройте командную строку в папке проекта (где находится «package.json») и выполните команду «npm run build»:

После успешной сборки вы должны увидеть каталог build, а под ним - app.js:

Теперь мы готовы запустить нашу первую службу node Express. Выполните «npm start startServer» из командной строки. После успешного выполнения вы должны увидеть «готово на порту 3000»:

Теперь мы готовы вызвать наш API по умолчанию. Откройте браузер, введите http: // localhost: 3000 / и нажмите клавишу ВВОД.

Если вы посмотрите на консоль, вы должны увидеть «запрос получен»:

Браузер должен показать сообщение, которое мы ввели в "app.ts":

На данный момент мы настроили наш проект службы экспресс-доставки узлов и запустили его.

После успешной начальной настройки мы добавим AWS SDK для взаимодействия с одним из сервисов AWS - AWS DynamoDB. Я предполагаю, что вы знакомы с AWS DynamoDB и у вас есть учетная запись AWS. Для начала вам потребуются учетные данные AWS, настроенные в $ HOME / .aws / credentials. Этот файл содержит aws_access_key_id и aws_secret_access_key, соответствующие вашей учетной записи AWS и пользователю.

Затем создайте в своей учетной записи таблицу DynamoDB с именем «users» с двумя параметрами - «userId» и «name». Я добавил один элемент с «userId»: «1» и «name»: «John», как показано ниже:

Мы добавим API для извлечения этого пользователя из таблицы DynamoDB и возврата в браузер.

Давайте добавим оператор импорта для «aws-sdk»: «import * as AWS from« aws-sdk »;»

Теперь установите регион, в котором у нас есть «пользователи» в DynamoDB: «AWS.config.update ({region:’ us-east-1 '}); » . Вот мы обновляем регион конфигурации AWS на «us-east-1».

Пришло время добавить вызов API - «пользователи». Добавьте следующий код в app.ts:

let Dynamodb = new AWS.DynamoDB ();

app.get (‘/ users’, (req, res) = ›{

console.log («запрос получен, пользователь получает»);

let user = {};

let dbParams: AWS.DynamoDB.GetItemInput = {

TableName: «пользователи»,

Ключ: {

"Идентификатор пользователя" : {

S: ‘1’

}

}

};

// DynamoDB.GetItemInput

Dynamodb.getItem (dbParams, function (error, data) {

if (error) {

console.log («Пользователь не найден:», ошибка);

res.json (пользователь);

}еще{

if (data) {

console.log (‘пользователь:‘ + data);

пользователь = данные;

res.json (данные);

}

}

});

});

Теперь создадим и снова запустим сервер. Откройте веб-браузер и введите этот путь: http: // localhost: 3000 / users »и нажмите Enter. На этом этапе вы должны увидеть ответ, в котором отображается нужный элемент из таблицы пользователи из AWS DynamoDB:

Итак, теперь у нас есть сервер Node Express с AWS SDK, и мы успешно реализовали API для получения данных из AWS DynamoDB.

Затем мы собираемся развернуть наш API как функцию AWS Lamdba. Мы настроим AWS API Gateway, который будет находиться между потребителем API (мобильное приложение, веб-приложение или просто веб-браузер для нашей демонстрации). Потребитель вызывает наш вызов API через API-шлюз, а API-шлюз, в свою очередь, вызывает нашу лямбда-функцию. Таким образом, API Gateway - это просто прокси, скрывающий детали реализации от потребителей API.

Дополнительную информацию о AWS API Gateway можно найти по адресу: https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html

Нам нужна функция Javascript, которая будет вызываться AWS Lamdba. Давайте добавим файл -’lambda.js ’, который будет содержать обработчик Lambda:

Нам придется внести изменения в app.ts. Вместо того, чтобы запускать экспресс-сервер в app.ts, мы просто экспортируем приложение. Мы будем использовать app в lambda.js для обслуживания вызовов от lamdba.

Мы будем использовать aws-serverless-express, упаковывая «приложение» и передавая его в функцию-обработчик лямбда-выражений, как показано в строке № 25 ниже.

Теперь мы создадим файл конфигурации для нашего прокси API. Я назвал его «MyServerlesssDemoLambda-proxy-api.yaml». Этот файл содержит информацию, которую AWS будет использовать для создания прокси API.

(вы можете найти этот файл в моем репозитории git hub-).

Затем мы создаем файл шаблона, который ссылается на определение прокси-API и сообщает AWS о необходимости создания API-шлюза, а в качестве функции AWS Lambda - MyServerlesssDemoLambda-cloudformation-template.yaml.

На изображении выше показано, какие ресурсы мы собираемся создать в AWS. Мы создаем ApiGateway, лямбда-функцию (MyServerlessDemoLambda) и роли для выполнения лямбда-функции.

На изображении выше показаны подробности ресурса ApiGateway. ключевая деталь здесь находится в строке № 9 - «DefinitionUrl». Здесь мы говорим AWS получить определение APIGateway из файла с именем «MyServerlesssDemoLambda-proxy-api.yaml».

Теперь мы перенесем наш код и подготовим его к развертыванию.

Теперь используем AWS CLI и готовим пакет с помощью AWS Cloudformation:

После завершения пакета Cloudformation мы создадим все ресурсы, упомянутые в шаблоне Cloudformation:

После успешного создания стека мы можем увидеть API Gateway в консоли AWS:

Мы можем вызвать тот же API через AWS API Gateway:

В заключительной части я собираюсь настроить DynamoDB Local, который можно использовать так же, как AWS DynamoDB Service во время разработки и модульного тестирования. Это может сэкономить деньги, если не задействовать сервис AWS DynamoDB, где каждое чтение или запись может учитываться при ежемесячном выставлении счетов.

Сначала загрузите DynamoDB Local из Интернета: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html

Сохраните его на свой компьютер и разархивируйте содержимое. Содержимое будет выглядеть так:

Откройте командную строку в этой папке и запустите «java -jar. \ DynamoDBLocal.jar -help»

Это показывает вам варианты, которые вы можете предоставить при локальном запуске DynamoDB:

Я собираюсь указать каталог, в котором я хочу сохранить файл базы данных. Я также указываю, что это общая база данных.

Здесь я указал dbPath на папку внутри моего проекта Node-Express-Typescript. Идея здесь состоит в том, чтобы зарегистрировать файл базы данных вместе с кодом для репозитория кода, чтобы другие члены команды также могли его использовать. Поскольку команда работает над разными API, они могут сотрудничать и коллективно добавлять в общую базу данных.

На данный момент DynamoDB Local запущен и работает. Мы можем открыть оболочку по адресу http: // localhost: 8000 / shell в браузере. Это интерактивная оболочка, в которой вы можете выполнять вызовы DynamoDB API. Хотя вы можете использовать оболочку для создания таблиц, добавления элементов в таблицы и т. Д., Хотя вы можете использовать плагин npm для управления локальным DynamoDB. Запустите npm install Dynamodb-admin - only = dev (Подробнее о DynamoDB-Admin по адресу: https://www.npmjs.com/package/dynamodb-admin).

После установки плагина добавьте команду в package.json в разделе сценариев: «DynamoDbAdmin»: «node ./node_modules/dynamodb-admin/bin/dynamodb-admin.js»

Теперь мы готовы запустить DynamoDB Admin. Откройте командную строку и запустите сценарий DynamoDbAdmin: «npm run DynamoDbAdmin»

На данный момент у нас есть DynamoDB local, работающий на порту 8000, и DynamoDB Admin, работающий на порту 8001. Администратор DynamoDB подключен к DynamoDB Local через порт 8000. Теперь откройте «http: // localhost: 8001» в браузере и посмотрите DynamoDB Local :

Это гораздо более простой пользовательский интерфейс для создания таблиц и добавления тестовых данных.

Я создам таблицу «пользователи» с ключом «userId». Я добавлю еще один атрибут с именем «name». Это соответствует схеме, которую я создал ранее в сервисе AWS DynamoDB.

Как только я создаю таблицу, она появляется под таблицами:

Теперь я собираюсь добавить несколько элементов в эту таблицу.

Итак, теперь у меня есть данные для проверки моего вызова API. Прежде чем запустить код, я внесу небольшое изменение в код, чтобы использовать локальную конечную точку для DynamoDB:

С этим изменением наш код будет указывать на DynamoDB Local вместо AWS DynamoDB Servcie. Теперь просто перестройте и запустите проект:

Откройте браузер и введите «http: // localhost: 3000 / user». Это тот же вызов API, который получил результаты от AWS DynamoDB. На этот раз он получит результат из локального DynamoDB:

Это тот же элемент, который я ранее добавил в DynamoDB local.

Сейчас закрываю DynamoDB Local. Он сохраняет созданную мной таблицу и элементы, которые я добавил в файл shared-local-instance.db в dbPath, который я упомянул при запуске.

Если я снова запущу DynamoDB с теми же параметрами, что и в прошлый раз, он загрузит состояние базы данных из файла «shared-local-instance.db», и я готов пойти дальше.

Надеюсь, это может послужить отправной точкой для тех, кто планирует использовать Node.js, Express с TypeScript в качестве функции AWS Lambda и интегрироваться с AWS DynamoDB.

Репозиторий GitHub с примером кода: https://github.com/sk-saurabh/serverlessNodeExpressServices

На этом пока все. Удачного кодирования!