【问题标题】:How to deploy next.js 9 to AWS Lambda without using Serverless Components如何在不使用无服务器组件的情况下将 next.js 9 部署到 AWS Lambda
【发布时间】:2021-01-22 17:53:00
【问题描述】:

我想简单地将我的 Next.js 9 部署到 AWS Lambdas,只使用前面的 API 网关,并为指向 S3 的静态路径做一个代理,但这是唯一可用的选项(无需从从头开始)是https://github.com/serverless-nextjs/serverless-next.js,它目前正在使用无服务器组件的测试版(非常错误,并且由于它不使用 CloudFormation 而对创建的资源缺乏控制),这个 SLS 组件也迫使用户使用我不需要的 CloudFront,我一直在创建 PR 环境,为此分配 CloudFront 只是浪费时间/金钱/资源。

我尝试使用旧版本的插件serverless-nextjs-plugin,但它似乎不适用于 Next.js 9,它无法为 .html 生成的页面创建 Lambda。

这条隧道的尽头有光吗?

https://github.com/serverless-nextjs/serverless-next.js/issues/296 在这个问题上看起来没有办法做到这一点。

【问题讨论】:

  • 嘿马塞洛,我很同情你并理解你在说什么。我在同一条船上..你最后做了什么?谢谢!

标签: aws-lambda next.js serverless


【解决方案1】:

我成功了

serverless.base.yml文件:

service: my-app

provider:
  name: aws
  runtime: nodejs12.x
  timeout: 10 # seconds
  memorySize: 1792 # Mb

custom:
  webpack:
    packager: yarn
    includeModules:
      forceInclude:
        - chalk

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

server.js:

const { parse } = require('url');
const next = require('next');
const serverless = require('serverless-http');

const app = next({
  dev: false
});

const requestHandler = app.getRequestHandler();

export const handler = serverless(async (req, res) => {
  const parsedUrl = parse(req.url, true);
  await requestHandler(req, res, parsedUrl);
});

wepback.config.js:

const CopyWebpackPlugin = require('copy-webpack-plugin');
const nodeExternals = require('webpack-node-externals');

module.exports = {
  ...

  externals: [nodeExternals()],
  plugins: [
    new CopyWebpackPlugin({
      patterns: [
        { from: '.next', to: '.next' },
        { from: 'public', to: 'public' }
      ]
    })
  ]
};

这里是使用 serverless 和 webpack 的技巧,使用 serverless.js 修改 serverless.base.yml 并将所有依赖项添加到要包含在包中的所需依赖项中:

const yaml = require('yaml-boost');
const minimist = require('minimist');
const path = require('path');

module.exports = (() => {
  const params = minimist(process.argv.slice(2));
  const serverless = yaml.load(path.join(__dirname, 'serverless.base.yml'), params);
  const packageJson = require(path.join(__dirname, 'package.json'));

  const dependencies = Object.keys(packageJson.dependencies);
  serverless.custom.webpack.includeModules.forceInclude.push(...dependencies);
  return serverless;
})();

【讨论】:

  • 嘿 Marcelo,你能解释一下为什么 webpack 配置和 serverless.js 依赖注入是必要的吗?对于 Lambdas,我知道 Next.js 应用程序必须有一个自定义服务器才能导出其处理程序,该处理程序包含在 serverless-http 中,但我不知道 webpack 必须进入哪里。我计划将我的 Next.js SSR/SSG 应用程序部署到一个带有 API 网关的 AWS Lambda,使用 AWS SAM 而不是使用serverless.yml。这让我想知道serverless.js 中的 webpack 依赖注入在做什么,以及我是否需要在我的 Next.js 应用程序中执行此操作,该应用程序由 SAM 模板提供服务。
  • 原因是 lambda 捆绑包是从下一个复制捆绑的资产,但出于未知原因,下一个捆绑包不包含对它的依赖项,所以我需要强制无服务器框架包含依赖于 lambda 包,以便下一个运行时可以访问它。
猜你喜欢
  • 2021-04-15
  • 1970-01-01
  • 2021-06-10
  • 2020-05-19
  • 1970-01-01
  • 2022-01-06
  • 2018-12-14
  • 1970-01-01
  • 2020-03-24
相关资源
最近更新 更多