gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:37:51 25 4
gpt4 key购买 nike

我想通过一个 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,并在函数包选项中添加了包含和排除语句。

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。

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

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

最佳答案

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

以下是您的选择:

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

附注package.individually 属性是 serverless.yml 中的根级属性。它不应该位于 provider 或您的函数定义中。

关于node.js - 如何为多运行时 AWS Lambda 服务设置 serverless.yml 和 webpack.config,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53938737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com