无服务器框架和 next.js lambda 函数超出解压大小限制

问题描述 投票:0回答:1

我正在尝试找出如何减小 ssr 应用程序(next.js 和无服务器框架)的包大小,使其低于 250MB AWS 限制:

An error occurred: ServerLambdaFunction - Unzipped size must be smaller than 262144000 bytes (Service: AWSLambdaInternal; Status Code: 400;
该应用程序是通过运行
next build && sls deploy

来部署的

解压后的存档大小为 600MB 以上,是 AWS 允许 lambda 的 250MB 的两倍多。以下是 node_modules 中最大依赖项的列表。我可以看到,我可以通过将几个依赖项移至开发依赖项来稍微减少它,但这并不能解决问题。

如果有人能指出我正确的方向,我将不胜感激。

这是我的package.json:

{
  "name": "ssr-ui",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "next build",
    "deploy": "next build && sls deploy",
    "start": "next start",
    "dev": "next dev"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@aws-amplify/api": "^3.2.4",
    "@aws-amplify/auth": "^3.4.4",
    "@aws-amplify/core": "^3.5.4",
    "@aws-amplify/storage": "^3.3.4",
    "@aws-amplify/ui-react": "^0.2.21",
    "antd": "^4.6.4",
    "antd-img-crop": "^3.10.0",
    "axios": "^0.20.0",
    "country-state-picker": "^1.1.1",
    "echarts": "^4.9.0",
    "echarts-for-react": "^2.0.16",
    "express": "^4.17.1",
    "next": "^9.5.3",
    "next-react-svg": "^1.1.2",
    "path-match": "^1.2.4",
    "query-string": "^6.13.2",
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "react-router-dom": "^5.2.0",
    "react-share": "^4.2.1",
    "sass": "^1.26.11",
    "serverless-apigw-binary": "^0.4.4",
    "serverless-domain-manager": "^4.2.0",
    "serverless-http": "^2.5.0",
    "url": "^0.11.0"
  },
  "devDependencies": {
    "@types/jest": "^26.0.14",
    "@types/node": "^14.10.3",
    "@types/react": "^16.9.49",
    "@types/react-dom": "^16.9.8",
    "@types/react-router-dom": "^5.1.5",
    "typescript": "^4.0.2"
  }
}

我的 serverless.yml 是:

service: ssr-react-next

provider:
  name: aws
  runtime: nodejs12.x
  region: ap-southeast-2
  stage: ${self:custom.secrets.NODE_ENV}
  environment:
    NODE_ENV: ${self:custom.secrets.NODE_ENV}

functions:
  server:
    handler: index.server
    events:
      - http: ANY /
      - http: ANY /{proxy+}

plugins:
  - serverless-apigw-binary
  - serverless-domain-manager

custom:
  secrets: ${file(secrets.json)}
  apigwBinary:
    types:
      - '*/*'
  customDomain:
    domainName: ${self:custom.secrets.DOMAIN}
    basePath: ''
    stage: ${self:custom.secrets.NODE_ENV}
    createRoute53Record: true

谢谢!

webpack aws-lambda next.js server-side-rendering serverless-framework
1个回答
0
投票

有几种方法可以解决您的问题:

  1. 将运行时不使用的
    dependencies
    移动到
    devDependencies

    无服务器在创建要上传的 zip 文件时会忽略

devDependencies

  1. aws-sdk
    添加到
    devDependencies

    直到 Node.js v16,

aws-sdk
v2
已在 Lambda 中可用。所以不要捆绑它。

    此外,如果您使用的是 Node.js v18,最好更新到最新版本的 AWS SDK (

@aws-ask/*
)

  1. 由于您使用的是
    webpack
    捆绑器,因此您可以单独打包您的函数。

    这意味着,无服务器应为每个 lambda 函数创建一个单独的 zip 文件。

    您可以通过在

serverless.yml
文件中添加以下内容来启用该功能:

package:
  individually: true
  1. 忽略 zip 文件中不必包含的文件

    您可以通过在

serverless.yml
文件中包含以下内容来做到这一点:

package:
  individually: true
  patterns:
    - '!.github'
    - '!.husky'
    - '!node_modules/aws-sdk/**'
    - '!node_modules/@aws-sdk/**'
    - '!package-lock.json'
    - '!README.md'

    您可以根据您的用例添加更多模式。

© www.soinside.com 2019 - 2024. All rights reserved.