До сих пор мы знали, как запустить наше бессерверное приложение в локальной среде. Мы можем протестировать его и даже сохранить в локальной DynamoDB.

Пришло время наконец развернуться на AWS!

Serverless Framework упрощает развертывание. Выполните одну команду, и (если в вашей локальной среде настроен ключ AWS) будут развернуты все ресурсы, необходимые для вашего приложения.

Однако есть еще несколько недостатков, которые нам необходимо устранить.

В предыдущих постах я, не осознавая, сказал полу-ложь: AWS поддерживает ES5 в NodeJS, но не полностью. В NodeJS 6.10 модули по-прежнему не поддерживаются.

В нашем приложении TacoGallery мы уже используем import вместо require для включения зависимостей. Ой ой.

К счастью, в Serverless есть плагины для использования Webpack и Babel для объединения и трансляции нашего приложения во что-то, что AWS может с комфортом выполнять.

Плагин serverless-webpack будет собирать наш код при развертывании нашего приложения. Установите его с помощью следующей команды:

npm install serverless-webpack --save-dev

Добавьте в файл serverless.yml следующее:

plugins:
  - serverless-webpack

У нас уже есть файл. babelrc из предыдущих сообщений, но если у вас его нет, создайте его:

{ "presets": ["es2015"] }

Чтобы убедиться, что в Webpack есть все необходимое для правильной трансляции нашего кода, установите следующие зависимости Babel:

npm i --save-dev babel-loader babel-core babel-preset-es2015

По умолчанию плагин будет искать файл webpack.config.js в корневой папке, поэтому давайте добавим его:

var nodeExternals = require('webpack-node-externals')

module.exports = {
   entry: './handler.js',
   target: 'node',
   externals: [nodeExternals()],
   output: {
      libraryTarget: 'commonjs',
      path: '.webpack',
      filename: 'handler.js', // this should match the first part of function handler in serverless.yml
   },
   module: {
      loaders: [
         {
            test: /\.jsx?$/,
            exclude: /node_modules/,
            loaders: ["babel-loader"]
         }
      ]
   }
};

Обратите внимание, что мы импортируем зависимость webpack-node-externals и помещаем ее во внешний раздел нашего файла. Это предотвратит объединение в Webpack зависимостей в node_modules, таких как AWS, которые уже включены в AWS Lambda.

Однако мы хотим, чтобы несколько зависимостей были объединены. Чтобы контролировать, что входит в пакет, а что нет, плагин serverless-webpack использует наш файл package.json для выполнения этой фильтрации: все в зависимостях будет в комплекте; все в devDependencies не будет:

"dependencies": {
  "babel": "^6.23.0",
  "babel-core": "^6.23.1",
  "babel-preset-es2015": "^6.22.0",
  "jsonschema": "^1.1.1",
  "serverless-dynamodb-client": "0.0.2",
  "uuid": "^3.0.1"
},
"devDependencies": {
  "aws-sdk": "^2.20.0",
  "babel-core": "^6.24.0",
  "babel-loader": "^6.4.1",
  "babel-preset-es2015": "^6.24.0",
  "chai": "^3.5.0",
  "dynalite": "^1.1.1",
  "jsonschema": "^1.1.1",
  "mocha": "^3.2.0",
  "serverless-dynamodb-local": "^0.2.19",
  "serverless-offline": "^3.10.2",
  "serverless-plugin-simulate": "0.0.10",
  "serverless-webpack": "^1.0.0-rc.4",
  "webpack-node-externals": "^1.5.4"
}

Мы можем настроить расположение нашего файла package.json, добавив следующее свойство в serverless.yml:

custom:
  webpackIncludeModules:
    packagePath: './package.json'

Перед развертыванием убедитесь, что ваш файл serverless.yml указывает на регион AWS, в котором вы хотите развернуть приложение; и поскольку мы все еще находимся в разработке, установите для свойства stage значение dev:

provider:
  name: aws
  runtime: nodejs6.10
  region: us-east-2
  stage: dev

Теперь вы готовы к развертыванию. Выполните следующую команду:

serverless deploy

После того, как в консоли отобразятся несколько строк журнала, вы увидите URL-адрес, по которому Serverless Framework развернула нашу AWS Lambda, предоставляемую шлюзом API.

У нас есть тестовая точка hello, которая позволит нам подтвердить, что приложение было развернуто правильно:

Чтобы убедиться, что все работает, перейдите в веб-консоль AWS, выберите службу Lambda (убедитесь, что вы находитесь в том же регионе, который вы выбрали для развертывания) и нажмите Тест:

Как и всегда, давайте перечислим все файлы, которые мы изменили в этом посте:

Здесь есть большое беспокойство, можете ли вы указать на это?

Наша конечная точка шлюза API не защищена! Любой, кто знает, какой у нас URL, может получить к нему доступ. Поскольку наша конечная точка подключается к DynamoDB, у нас есть открытая дверь для всех, кто хочет добавить данные в наше приложение.

В следующем посте мы узнаем, как защитить конечные точки шлюза API.