如何为多运行时AWS Lambda服务设置serverless.yml和webpack.config

时间:2018-12-27 01:10:40

标签: node.js ruby aws-lambda serverless-framework serverless-webpack-plugin

我想从一个serverless.yml文件中使用Node8.10和Ruby2.5运行时部署AWS Lambda函数。

我设置了以下文件夹结构,其中/ 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

我的webpack配置:(这是基本示例,我刚遇到第一个错误时就添加了忽略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:     [Webpack编译错误]模块解析失败

失败#1: 基本上,webpack假定所有功能都是.js并尝试将其打包。基于this suggestion,我强制将webpack配置中的入口点设置为我的handler.js

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

这仅打包Node Lambda。在AWS上为Ruby Lambda创建了一个空的占位符。

失败#2: 我从serverless.yml中注释掉了webpack,并在功能包选项中添加了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/**

这将为node/node_modules/@babel/core/node_modules/.bin/parser获取一个[ENOENT:没有这样的文件或目录]。该文件不存在,但我不明白为什么要查找它,因为未调用webpack。

成功排序?  如果我注释掉webpack并使用

,则能够部署Lambda。
    serverless deploy function -f <function name here>

先部署Ruby Lambda,然后再取消注释Webpack,然后使用同一件事部署Node Lambda。

我坚信,有更好的方法来部署它们;我错过了设置中的某些内容吗?还有我没有尝试过的另一种选择吗?

P.S。我确实看到了此拉取请求https://github.com/serverless-heaven/serverless-webpack/pull/256,但自2017年以来似乎已被放弃。

2 个答案:

答案 0 :(得分:0)

serverless-webpack不适用于非JS运行时。它劫持serverless打包,仅部署Webpack输出。

以下是您的选择:

  1. 不要使用serverless-webpack,而只需使用serverless的内置包装即可。
  2. 您可以直接使用webpack(而不是serverless-webpack),并更改构建过程以首先使用webpack进行编译,然后让serverless部署输出文件夹。
  3. li>

P.S。 package.individually属性是您的serverless.yml中的根目录级属性。它不应出现在provider或您的函数定义中。

答案 1 :(得分:0)

对于那些可能正在寻找除无服务器Webpack之外的多个运行时选项的人,我最终切换到此插件:https://www.npmjs.com/package/serverless-plugin-include-dependencies
它可以与我的运行时(Ruby和Node)一起使用,并且如果插件遗漏某些东西,则可以在根和功能级别上单独使用package.include / exclude。