在 lambda@edge 上使用 sharp
Use sharp on lambda@edge
我正在尝试在几个 AWS lambda@edge 上使用 sharp。这个想法是在请求时调整和缓存图像 (see this)。
我也在使用 serverless with serverless-webpack 来部署 lambda。
我可以部署 lambda,如果我在 AWS 控制台中测试它们,一切都会顺利。
但是,这些是 lamda@edge,它们将用作 cloudwatch request/response 触发器。因此,最大 lambda 大小为 1Mb。
我的问题是我似乎无法接近那个大小,我能达到的最大大小是 11.6Mb。而且,从第一个 link.
中可以看出,这似乎是可能的
这是产生 34.7Mb lambda 的无服务器配置:
custom:
webpack:
includeModules:
forceExclude:
- aws-sdk
packagerOptions:
scripts:
- rm -rf node_modules/sharp && docker run -v "$PWD":/var/task lambci/lambda:build-nodejs10.x npm install sharp
package:
exclude:
- .env
- .git/**
- .gitlab-ci.yml
- tests*
excludeDevDependencies: true
individually: true
有了这个,我得到了 11.6Mb:
custom:
webpack:
includeModules:
forceExclude:
- aws-sdk
packagerOptions:
scripts:
- npm rebuild sharp --target=10.15.0 --target_arch=x64 --target_platform=linux
package:
exclude:
- .env
- .git/**
- .gitlab-ci.yml
- tests*
excludeDevDependencies: true
individually: true
我也玩过 package.exclude,但运气不好:
- node_modules/**
- '!node_modules/sharp/**'
这是我的 webpack 配置:
const path = require('path');
const slsw = require('serverless-webpack');
const nodeExternals = require('webpack-node-externals');
const entries = {};
Object.keys(slsw.lib.entries).forEach(key => (entries[key] = ['./source-map-install.js', slsw.lib.entries[key]]));
module.exports = {
mode: slsw.lib.webpack.isLocal ? 'development' : 'production',
entry: slsw.lib.entries,
devtool: 'source-map',
resolve: {
extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'],
},
// externals: ['sharp'], #tried that too
externals: [nodeExternals()],
output: {
libraryTarget: 'commonjs',
path: path.join(__dirname, '.webpack'),
filename: '[name].js',
},
target: 'node',
module: {
rules: [
// all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
{ test: /\.ts?$/, loader: 'ts-loader', options: { happyPackMode: true } },
],
},
};
当 运行 在本地时,我可以看到它的包装... node_modules 文件夹似乎有 sharp 及其依赖项。但是最大的文件夹是锋利的。
我怀疑我在 sharp 文件夹中打包了我不需要的东西...但我似乎无法理解是什么。
有什么帮助吗?
谢谢
更新:
更仔细地阅读,似乎我需要尖锐(原始响应)大小限制的功能是 5Mb。
我只需要找到一种只为该功能打包 sharp 的方法。 Webpack 似乎将它放在两者中,即使我在另一个函数(查看器请求)上不需要它。
有什么帮助吗?
我最终 运行 custom.webpack.packagerOptions.scripts
中的一个脚本,它会在不需要的地方忽略尖锐。
这是我使用的脚本:
custom:
webpack:
includeModules:
forceExclude:
- aws-sdk
packagerOptions: # uncomment this block if invoking locally
scripts:
- if [ -f "src/handlers/myfunction.js" ]; then rm -rf node_modules/sharp && docker run -v "$PWD":/var/task lambci/lambda:build-nodejs10.x npm install sharp; else rm -rf node_modules; fi
我正在尝试在几个 AWS lambda@edge 上使用 sharp。这个想法是在请求时调整和缓存图像 (see this)。
我也在使用 serverless with serverless-webpack 来部署 lambda。
我可以部署 lambda,如果我在 AWS 控制台中测试它们,一切都会顺利。
但是,这些是 lamda@edge,它们将用作 cloudwatch request/response 触发器。因此,最大 lambda 大小为 1Mb。
我的问题是我似乎无法接近那个大小,我能达到的最大大小是 11.6Mb。而且,从第一个 link.
中可以看出,这似乎是可能的这是产生 34.7Mb lambda 的无服务器配置:
custom:
webpack:
includeModules:
forceExclude:
- aws-sdk
packagerOptions:
scripts:
- rm -rf node_modules/sharp && docker run -v "$PWD":/var/task lambci/lambda:build-nodejs10.x npm install sharp
package:
exclude:
- .env
- .git/**
- .gitlab-ci.yml
- tests*
excludeDevDependencies: true
individually: true
有了这个,我得到了 11.6Mb:
custom:
webpack:
includeModules:
forceExclude:
- aws-sdk
packagerOptions:
scripts:
- npm rebuild sharp --target=10.15.0 --target_arch=x64 --target_platform=linux
package:
exclude:
- .env
- .git/**
- .gitlab-ci.yml
- tests*
excludeDevDependencies: true
individually: true
我也玩过 package.exclude,但运气不好:
- node_modules/**
- '!node_modules/sharp/**'
这是我的 webpack 配置:
const path = require('path');
const slsw = require('serverless-webpack');
const nodeExternals = require('webpack-node-externals');
const entries = {};
Object.keys(slsw.lib.entries).forEach(key => (entries[key] = ['./source-map-install.js', slsw.lib.entries[key]]));
module.exports = {
mode: slsw.lib.webpack.isLocal ? 'development' : 'production',
entry: slsw.lib.entries,
devtool: 'source-map',
resolve: {
extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'],
},
// externals: ['sharp'], #tried that too
externals: [nodeExternals()],
output: {
libraryTarget: 'commonjs',
path: path.join(__dirname, '.webpack'),
filename: '[name].js',
},
target: 'node',
module: {
rules: [
// all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
{ test: /\.ts?$/, loader: 'ts-loader', options: { happyPackMode: true } },
],
},
};
当 运行 在本地时,我可以看到它的包装... node_modules 文件夹似乎有 sharp 及其依赖项。但是最大的文件夹是锋利的。
我怀疑我在 sharp 文件夹中打包了我不需要的东西...但我似乎无法理解是什么。
有什么帮助吗?
谢谢
更新: 更仔细地阅读,似乎我需要尖锐(原始响应)大小限制的功能是 5Mb。 我只需要找到一种只为该功能打包 sharp 的方法。 Webpack 似乎将它放在两者中,即使我在另一个函数(查看器请求)上不需要它。 有什么帮助吗?
我最终 运行 custom.webpack.packagerOptions.scripts
中的一个脚本,它会在不需要的地方忽略尖锐。
这是我使用的脚本:
custom:
webpack:
includeModules:
forceExclude:
- aws-sdk
packagerOptions: # uncomment this block if invoking locally
scripts:
- if [ -f "src/handlers/myfunction.js" ]; then rm -rf node_modules/sharp && docker run -v "$PWD":/var/task lambci/lambda:build-nodejs10.x npm install sharp; else rm -rf node_modules; fi