1

我想从一个 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 并尝试将它们打包。根据这个建议,我强制我在 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: no such file or directory]。该文件不存在,但我不明白它为什么要查找它,因为没有调用 webpack。

有点成功?: 如果我注释掉 webpack 并使用,我就能部署 Lambdas

    serverless deploy function -f <function name here>

部署 Ruby Lambda,然后取消注释 webpack 并使用相同的东西来部署 Node Lambda。

我相信有更好的方法让他们部署;我是否错过了设置中的某些内容?还有其他我没有尝试过的选择吗?

PS 我确实看到了这个拉取请求https://github.com/serverless-heaven/serverless-webpack/pull/256,但它似乎自 2017 年以来就被放弃了。

4

2 回答 2

1

serverless-webpack不是为非 JS 运行时设计的。它劫持serverless打包并仅部署 webpack 输出。

以下是您的选择:

  1. 不要使用serverless-webpack并简单地使用serverless' 内置包装。
  2. 您可以webpack直接使用(不是serverless-webpack),并将构建过程更改为先编译使用webpack,然后再serverless部署输出文件夹。

PS 该package.individually属性是您的serverless.yml. 它不应该provider在您的函数定义中或函数定义中。

于 2018-12-27T23:25:05.747 回答
0

对于那些可能正在寻找除 serverless-webpack 之外的多个运行时选项的人,我最终切换到了这个插件:https ://www.npmjs.com/package/serverless-plugin-include-dependencies 。
它适用于我的运行时(Ruby 和 Node),如果插件遗漏了什么,您可以在根和函数级别使用 package.individually 和 package.include/exclude。

于 2019-01-09T15:26:30.053 回答