如何将 next.js 9 部署到 aws lambda

hah*_*aha 10 deployment reactjs aws-lambda next.js

我正在使用 next.js9 开发一个项目。我有一些问题和疑问。我想将我的 next.js 9 项目部署到 AWS lambda。

  1. 官方 next.js 9 文档告诉我“页面目录中的每个页面都变成了无服务器 lambda。” 上面的库不像文档那样工作。如何从每个页面部署到每个 lambda?

  2. 什么是合理的部署方案?请在生产级别使用nextjs 9的人帮助我。

  3. 我正在使用这个库https://github.com/danielcondemarin/serverless-next.js。它运行良好。但所有选项都是固定的。我想将我的项目部署到东京地区。但我不知道如何更改区域。始终部署到弗吉尼亚北部地区。我已经检查过 doc 但我认为他们没有选择。并像这个 yml 文件一样进行测试。

无服务器.yml

myNextApplication:
  component: serverless-next.js
region: ap-northeast-1
Run Code Online (Sandbox Code Playgroud)

但它不起作用。如果有人知道如何使用 serverless-next.js 更改区域。请帮我。

先感谢您

Le *_*det 7

有一个 webpack 插件,可以帮助next-aws-lambda-webpack-plugin

  1. 该插件为每个页面生成一个包含Next.JS 的无服务器代码的目录
  2. 此插件不使用无服务器框架,因此您可以为您的基础设施使用原生 AWS 部署解决方案,例如:AWS SAMAWS cloudformation用于您的部署并从 AWS 支持中受益。
  3. 通过 AWS 本地解决方案部署,您可以自由选择任何想要的区域。

  • 请不要仅仅发布一些工具或库作为答案。至少在答案本身中证明[它如何解决问题](http://meta.stackoverflow.com/a/251605)。 (3认同)

ofh*_*use 6

将 Next.js 部署到 AWS Lambda 需要一个抽象层,因为 Next.js 最初旨在用作 Node.js 服务器。

Vercel 使用一个叫做的东西来实现这一点now-node-bridge,它基本上在 Lambda 函数内启动一个本地 Node.js http 服务器,然后从 Lambda 调用事件创建一个请求。

这是一个简化的流程图,当您针对部署在 Vercel 上的 Next.js 应用程序运行请求时会发生什么: 在此处输入图片说明

虽然 Next.js 是开源的,但在 Vercel 上进行从 HTTP 请求到 Lambda 事件的转换的代理不是。这就是为什么将无服务器部署到 AWS 仍然是一项棘手的任务,而 Vercel 在内部也使用 AWS Lambda 进行部署。

部署到 AWS Lambda

虽然 Serverless 框架目前可能仍然是最受欢迎的选择,但我为此任务创建了一个简单易用的Terraform模块。Terraform 是一个开源 CLI 应用程序,用于管理 AWS 等提供商中的云资源。

安装 Terraform 后,它就像这样简单:

  1. 转到您的 Next.js 应用程序并安装此帮助程序:

    npm i -D tf-next     # npm or
    yarn add -D tf-next  # yarn
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将以下脚本添加tf-next到您package.json的 Next.js 应用程序中:

    {
      ...
      "scripts": {
        "dev": "next",
        "build": "next build",
        "start": "next start",
    +   "tf-next": "tf-next build"
       }
    }
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. main.tf在您的 旁边创建一个具有以下内容的新内容package.json

    # main.tf
    
    terraform {
      required_providers {
        aws = {
          source  = "hashicorp/aws"
          version = "~> 3.0"
        }
      }
    }
    
    # Main region where the resources should be created in
    provider "aws" {
      region = "us-east-1"
    }
    
    module "tf_next" {
      source  = "dealmore/next-js/aws"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 创建一个AWS 访问密钥并在终端中公开它:

    export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
    export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使用 terraform 构建应用程序并将其部署到 AWS:

     terraform init    # Only needed on the first time running Terraform
    
     yarn tf-next      # Build the next.js app
     terraform plan    # See what resources Terraform will create
     terraform apply   # Deploy the App to your AWS account
    
    Run Code Online (Sandbox Code Playgroud)

您可以将 中的区域更改为支持Lambda 的main.tf任何 AWS 区域,您定义的区域是您的 Lambda 部署到的区域。

有关更多信息,请参阅 GitHub 页面:GitHub 上的AWS Next.js Terraform 模块


hah*_*aha -2

  1. 我还是没有想法。

2,3。serverless-next.js 有点合理。我在github上发布了问题。贡献者回答我如下。我理解了框架的概念。

https://github.com/danielcondemarin/serverless-next.js#my-lambda-is-deployed-to-us-east-1-how-can-i-deploy-it-to-another-region