Используйте острый на lambda@edge - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь использовать Sharp на пару AWS lambda@edge. Идея состоит в том, чтобы изменить размер и кэшировать изображение при запросе ( см. ).

I ' Я также использую serverless с serverless-webpack для развертывания лямбд.

Я могу развернуть лямбды и все будет хорошо, если я протестирую их в AWS консоли.

Однако это lamda@edge, и они будут использоваться в качестве триггеров запроса / ответа в облачном хранилище. Следовательно, максимальный размер лямбды составляет 1 МБ.

Моя проблема в том, что я не могу приблизиться к этому размеру, лучшее, что я смог достичь - 11,6 Мб. И, кажется, это возможно, как видно из этой первой ссылки.

Это конфигурация без сервера, которая приводит к лямбде 34.7Mb:

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/**'

и это мой конфиг веб-пакета:

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 имеет острые и ее зависимости, кажется. Но самая большая папка острая.

Я подозреваю, что упаковываю вещи в острую папку, которая мне не нужна ... но я не могу понять, что.

Любая помощь?

Спасибо

ОБНОВЛЕНИЕ: Читая более внимательно, кажется, что функция, в которой мне нужен четкий (размер-ответ) предел размера, составляет 5 МБ. Мне просто нужно найти способ упаковать резкие только для этой функции. Кажется, Webpack помещает его в оба, хотя мне не нужно это для другой функции (запрос средства просмотра). Любая помощь в этом?

1 Ответ

1 голос
/ 07 февраля 2020

Я запустил скрипт в 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
...