我正在使用 next.js9 开发一个项目。我有一些问题和疑问。我想将我的 next.js 9 项目部署到 AWS lambda。
官方 next.js 9 文档告诉我“pages 目录中的每个页面都变成了无服务器 lambda。”上面的库不像文档那样工作。如何从每个页面部署到每个 lambda?
合理的部署方案是什么?请在生产级别使用 nextjs 9 的人帮助我。
我正在使用这个库 https://github.com/danielcondemarin/serverless-next.js 。 它运作良好。但所有选项都是固定的。我想将我的项目部署到东京地区。但我不知道如何更改区域。始终部署到弗吉尼亚北部地区。我已经检查过医生,但我认为他们没有选择。并像这个 yml 文件一样进行测试。
无服务器.yml
myNextApplication:
component: serverless-next.js
region: ap-northeast-1
但它不起作用。如果有人知道如何使用 serverless-next.js 更改区域。请帮助我。
提前谢谢
最佳答案
将 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
虽然无服务器框架仍然可能是目前最流行的选择,但我创建了一个简单易用的 Terraform用于此任务的模块。 Terraform 是一个开源 CLI 应用程序,用于管理 AWS 等提供商中的云资源。
安装 Terraform 后,就像这样简单:
转到您的 Next.js 应用并安装此帮助程序:
npm i -D tf-next # npm or yarn add -D tf-next # yarn
将以下脚本
tf-next
添加到 Next.js 应用的package.json
中:{ ... "scripts": { "dev": "next", "build": "next build", "start": "next start", + "tf-next": "tf-next build" } } ...
在
package.json
旁边创建一个新的main.tf
,其中包含以下内容:# 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" }
创建 AWS Access Key并将其暴露在终端中:
export AWS_ACCESS_KEY_ID=AKIAXXXXXXXXXXXXXX export AWS_SECRET_ACCESS_KEY=wJaXXXXXXXXXXXXXXXXXXXX
构建应用程序并使用 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 的任何 AWS 区域。 Lambda 和您定义的区域是您的 Lambda 部署到的区域。
有关更多信息,请参阅 GitHub 页面:AWS Next.js Terraform module on GitHub
关于reactjs - 如何将 next.js 9 部署到 aws lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58112093/