【问题标题】:Use sharp on lambda@edge在 lambda@edge 上使用Sharp
【发布时间】:2020-05-22 13:40:24
【问题描述】:

我正在尝试在几个 AWS lambda@edge 上使用Sharp。这个想法是在请求时调整图像大小并缓存图像 (see this)。

我还使用 serverlessserverless-webpack 来部署 lambda。

如果我在 AWS 控制台中测试它们,我可以部署 lambdas 并且一切顺利。

但是,这些是 lamda@edge,它们将用作 cloudwatch 请求/响应触发器。因此,最大 lambda 大小为 1Mb。

我的问题是我似乎无法接近那个大小,我能达到的最佳值是 11.6Mb。而且,从第一个链接中可以看出,这似乎是可能的。

这是导致 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 文件夹似乎很清晰及其依赖项。但最大的文件夹是锋利的。

我怀疑我将不需要的东西包装在尖锐的文件夹中......但我似乎无法理解。

有什么帮助吗?

谢谢

更新: 仔细阅读,似乎我需要尖锐(原始响应)大小限制的功能是 5Mb。 我只需要找到一种方法为该功能打包尖锐。 Webpack 似乎将它放在两者中,即使我在其他功能(查看器请求)上不需要它。 有什么帮助吗?

【问题讨论】:

    标签: serverless-framework sharp aws-lambda-edge


    【解决方案1】:

    我最终在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
    

    【讨论】:

    • 应该发布脚本来做到这一点,我最终在 docker 容器中运行我的构建来解决这个问题。
    猜你喜欢
    • 2021-07-21
    • 2022-01-25
    • 2019-07-25
    • 2023-01-04
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多