我正在使用next.js9开发一个项目。我有一些问题和疑问。我想将我的next.js 9项目部署到AWS lambda。
official next.js 9文档告诉我“页面目录中的每个页面都变成了无服务器lambda”。上面的库无法像doc一样工作。如何从每个页面部署到每个lambda?
什么是合理的部署解决方案?请在生产级别使用nextjs 9的人帮助我。
我正在使用此库https://github.com/danielcondemarin/serverless-next.js。 运行良好。但所有选项都是固定的。我想将我的项目部署到东京地区。但我不知道如何更改区域。始终部署到弗吉尼亚州北部地区。我已经检查过文件,但我认为他们没有选择权。并像这样的yml文件进行测试。
serverless.yml
myNextApplication:
component: serverless-next.js
region: ap-northeast-1
但是它不起作用。如果有人知道如何使用serverless-next.js更改区域。请帮助我。
提前谢谢
答案 0 :(得分:5)
将 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 进行部署。
虽然无服务器框架目前仍可能是最受欢迎的选择,但我为此任务创建了一个简单易用的 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"
}
}
...
在您的 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"
}
创建一个 AWS Access Key 并在终端中公开它:
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
使用 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。
答案 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)
2,3。 serverless-next.js是有一定理由的。我发出了问题github。贡献者回答我如下。我了解框架的概念。