如何将next.js 9部署到AWS Lambda

时间:2019-09-26 07:57:36

标签: reactjs deployment aws-lambda next.js

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

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

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

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

serverless.yml

myNextApplication:
  component: serverless-next.js
region: ap-northeast-1

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

提前谢谢

4 个答案:

答案 0 :(得分:5)

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

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

以下是一个简化的流程图,当您针对部署在 Vercel 上的 Next.js 应用程序运行请求时会发生什么: enter image description here

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

部署到 AWS Lambda

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

安装 Terraform 就这么简单:

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

    npm i -D tf-next     # npm or
    yarn add -D tf-next  # yarn
    
  2. 将以下脚本 tf-next 添加到 Next.js 应用程序的 package.json 中:

    {
      ...
      "scripts": {
        "dev": "next",
        "build": "next build",
        "start": "next start",
    +   "tf-next": "tf-next build"
       }
    }
    ...
    
  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"
    }
    
  4. 创建一个 AWS Access Key 并在终端中公开它:

    export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
    export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    
  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
    

您可以将 main.tf 中的区域更改为 supports Lambda 所在的任何 AWS 区域以及您在其中定义的区域是您的 Lambda 部署到的区域。

有关更多信息,请参阅 GitHub 页面:AWS Next.js Terraform module on GitHub

答案 1 :(得分:4)

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

  1. 此插件为每个页面生成一个带有the serverless code of the Next.JS的目录
  2. 此插件不使用Serverless framwork,因此您可以为基础架构使用本机AWS部署解决方案,例如:AWS SAMAWS cloudformation进行部署,并从AWS支持中受益。
  3. 通过AWS本机解决方案部署,您可以自由选择任何需要的区域。

答案 2 :(得分:1)

您用于部署的该插件正在使用lambda @ edge,并且可以在无区域的情况下运行:

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html

Lambda @ Edge是AWS Lambda的扩展,该计算服务使 您执行自定义CloudFront内容的功能 交付。您可以在一个Region中编写Node.js或Python函数, US-East-1(弗吉尼亚北部),然后在AWS位置执行它们 在全球范围内更接近查看者,无需配置或 管理服务器。 Lambda @ Edge可以自动缩放 每天的请求数量达到每秒数千个。

如果您希望在无服务器部署中拥有更大的灵活性,请使用线程中此处提到的webpack插件:

https://github.com/vincent-herlemont/next-aws-lambda-webpack-plugin

您可以与无服务器框架一起为每个NextJs页面手动定义一个lambda函数(而不是Lambda @ Edge)并将其部署到您所在区域的AWS账户中。

答案 3 :(得分:0)

  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