До сих пор мы знали, как запустить наше бессерверное приложение в локальной среде. Мы можем протестировать его и даже сохранить в локальной 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.