Как настроить serverless.yml и webpack.config для многоразовой службы AWS Lambda - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу развернуть функции AWS Lambda с рабочими средами Node8.10 и Ruby2.5 из одного файла serverless.yml.

Я настроил следующую структуру папок, где / node и / ruby ​​содержат соответствующие обработчики.

 -/nodeRubyLambdas
  -/node
    -handler.js
    -package.json, package-lock.json, /node_modules
  -/ruby
    -rubyRijndaelEncryption.rb
    -Gemfile, Gemfile.lock, /vendor
  -serverless.yml
  -webpack.config.js
  -package.json for serverless-webpack

Вот мой serverless.yml

service: nodeRubyLambdas

plugins:
  - serverless-webpack
  - serverless-offline

custom:
  webpack:
    webpackConfig: ./webpack.config.js
    includeModules: true

provider:
  name: aws
  stage: dev
  region: us-west-2
  iamRoleStatements:
    - Effect: Allow
      Action:
        - lambda:InvokeFunction
      Resource: "*"

  package:
    individually: true

functions:
  nodeMain:
    handler: node/handler.main
    runtime: nodejs8.10
    events:
      - http:
          path: main
          method: get
    package:
      individually: true
  rubyEncryption:
    handler: ruby/rubyRijndaelEncryption.lambda_handler
    runtime: ruby2.5
    environment:
      RIJNDAEL_PASSWORD: 'a string'
    package:
      individually: true

Моя конфигурация веб-пакета: (Это базовый пример, я просто добавил бит для игнорирования файлов ruby, когда получил свой первыйошибка.)

const slsw = require("serverless-webpack");
const nodeExternals = require("webpack-node-externals");

module.exports = {
  entry: slsw.lib.entries,
  target: "node",
  // Generate sourcemaps for proper error messages
  devtool: 'source-map',
  // Since 'aws-sdk' is not compatible with webpack,
  // we exclude all node dependencies
  externals: [nodeExternals()],
  mode: slsw.lib.webpack.isLocal ? "development" : "production",
  optimization: {
   // We do not want to minimize our code.
   minimize: false
  },
  performance: {
    // Turn off size warnings for entry points
    hints: false
  },
  // Run babel on all .js files and skip those in node_modules
  module: {
    rules: [
      {
        test: /\.js$/,
        loader: "babel-loader",
        include: __dirname,
        exclude: [/node_modules/, /\.rb$/]
      }
    ]
  }
};

Ошибка № 0: [Ошибка компиляции веб-пакета] Ошибка синтаксического анализа модуля

Ошибка № 1: По сути, веб-пакет предполагаетвсе функции .js и пытается упаковать их как таковые.Исходя из этого предложения , я заставил мою точку входа в конфигурации webpack быть моим handler.js

 module.exports = {
  entry: "./node/handler.js",
  target: "node",
  ...

Это упаковывает ТОЛЬКО Node Lambda.В AWS создается пустой заполнитель для Ruby Lambda.

Ошибка № 2: Я закомментировал веб-пакет из serverless.yml и добавил операторы include и exclude в опциях пакета функций.

functions:
  nodeMain:

    package:
      individually: true
      include:
        - node/**
        - handler.js
      exclude:
        - ruby/**
        - rubyLambda/**
  rubyEncryption:

    package:
      individually: true
      include:
        - vendor/**
        - rubyRijndaelEncryption.rb
      exclude:
        - Gemfile
        - Gemfile.lock
        - node/**

Получается [ENOENT: такого файла или каталога нет] для node/node_modules/@babel/core/node_modules/.bin/parser.Этого файла нет, но я не понимаю, почему он его ищет, поскольку веб-пакет не вызывается.

Вроде успеха?: Мне удалось доставить Lambdas вразвертывание, если я закомментировал веб-пакет и использовал

    serverless deploy function -f <function name here>

для развертывания Ruby Lambda, а затем раскомментировал веб-пакет и использовал то же самое для развертывания Node Lambda.

Я убежденчто есть лучший способ заставить их развернуться;Я что-то пропустил в моей настройке?Есть ли другой вариант, который я не пробовал?

PS Я видел этот запрос на получение https://github.com/serverless-heaven/serverless-webpack/pull/256,, но он, похоже, был отклонен с 2017 года.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Для тех, кто может искать варианты для нескольких сред выполнения, отличных от serverless-webpack, я в итоге переключился на этот плагин: https://www.npmjs.com/package/serverless-plugin-include-dependencies.
Он работает с моими средами выполнения (Ruby и Node) и позволяет использовать пакет.indivually с package.include / exclude на корневом уровне и уровне функций, если плагин что-то пропустил.

0 голосов
/ 28 декабря 2018

serverless-webpack не рассчитано на время работы без JS.Он захватывает serverless упаковку и развертывает ТОЛЬКО выходные данные веб-пакета.

Вот ваши варианты:

  1. Не используйте serverless-webpack и просто используйте serverless 'встроенныйпакетирование.
  2. Вы можете использовать webpack напрямую (не serverless-webpack) и изменить процесс сборки для компиляции, сначала используя webpack, а затем разрешить serverless развернуть выходную папку.

PS Свойство package.individually является свойством корневого уровня в serverless.yml.Оно не должно быть в provider или в ваших определениях функций.

...