我正在使用具有serverless.com框架的nodeJs回购上的webpack来部署到AWS Lambda函数。由于AWS上的Lambda容器已经包含aws-sdk,因此我试图将其从包装中排除。
构建过程中的输出实际上将aws-sdk标识为已排除:
[41] ./src/controller/queue.ts 2.57 KiB {3} [built]
[43] ./src/controller/auth.ts 3.76 KiB {1} [built]
+ 30 hidden modules
Serverless: Excluding external modules: aws-sdk@^2.309.0
Serverless: Package lock found - Using locked versions
Serverless: Packing external modules: @hapi/joi@^16.1.5, moment-timezone@^0.5.23, axios@^0.19.0, chrome-aws-lambda@^2.0.1, puppeteer-core@^2.0.0, uuid@^2.0.3, memorystream@^0.3.1, lambda-warmer@^1.2.1, jsonwebtoken@^8.5.1, typeorm@0.2.9, js-yaml@^3.12.0
Serverless: Packaging service...
但是,被构建为要上载到Lambda的zip文件仍然包含aws-sdk,并使该软件包接近60MB。在构建过程中,我还查看了.webpack中的文件夹,并注意到node_modules文件夹既位于依赖文件夹中,又位于服务文件夹中,而aws-sdk位于服务文件夹中。我真的不知道那是什么意思。
感谢您的帮助。令人沮丧的是,它公然地说它正在排除它,但无论如何它都会在拉链中缠绕。
我的webpack.config.js如下:
const webpack = require("webpack");
const path = require("path");
const serverlessWebpack = require("serverless-webpack");
const nodeExternals = require("webpack-node-externals");
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
entry: serverlessWebpack.lib.entries,
target: 'node',
mode: serverlessWebpack.lib.webpack.isLocal ? "development" : "production",
node: {
__dirname: true
},
devtool: 'source-map',
externals: [nodeExternals()],
module: {
rules: [
{
test: /\.ts$/,
use: [
{
loader: "ts-loader"
}
],
include: [__dirname],
exclude: /node_modules/
}
]
},
resolve: {
extensions: [".ts", ".tsx", ".js"]
},
output: {
libraryTarget: "commonjs",
path: path.join(__dirname, ".webpack"),
filename: "[name].js"
},
plugins: [
new webpack.EnvironmentPlugin({
NODE_ENV: "development"
}),
new CopyWebpackPlugin([
{ from: 'ormconfig.yml' },
])
]
};
在serverless-webpack插件的serverless.yml自定义部分中,我的配置是:
webpack:
webpackConfig: webpack.config.js
includeModules:
forceExclude:
- aws-sdk
packager: 'yarn'
答案 0 :(得分:2)
您是否有缩进问题。看到forceExclude
和includeModules
是否处于同一水平?
应该,
webpack:
webpackConfig: webpack.config.js
includeModules: true
forceExclude:
- aws-sdk
packager: 'yarn'
参考:
答案 1 :(得分:0)
我有同样的问题,我不明白为什么aws-sdk仍包含在部署程序包中,该程序包大约有50MB! 我的解决方法是
webpack:
webpackConfig: webpack.config.js # Name of webpack configuration file
packager: 'yarn'
includeModules:
forceExclude:
- aws-sdk
packagerOptions:
scripts:
- rm -rf node_modules/aws-sdk
答案 2 :(得分:0)
也许你可以把你的webpack.config.js
改成这个form:
const slsw = require('serverless-webpack');
// const nodeExternals = require('webpack-node-externals');
module.exports = {
target: 'node',
mode: slsw.lib.webpack.isLocal ? 'development' : 'production',
entry: slsw.lib.entries,
externals: { 'aws-sdk': 'commonjs2 aws-sdk' },
...
}
这对我有用。
答案 3 :(得分:0)
还有另一种方法可以在使用 aws sdk 时减小函数的大小。您所要做的就是改变导入内容的方式。
例如这个导入:
import AWS from 'aws-sdk';
改成这样:
import CognitoIdentity from '@aws-sdk/client-cognito-identity';
aws 称之为 "Modular packages"。
他们在那里展示的示例将函数大小从 ~817KB 减少到 ~23KB!