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

s3fp2yjn  于 2023-05-22  发布在  其他
关注(0)|答案(4)|浏览(237)

我正在使用next.js9开发一个项目。我有一些问题和疑问。我想将我的next.js 9项目部署到AWS lambda。
1.官方的next.js 9文档告诉我“pages目录中的每个页面都变成了一个无服务器的lambda。”上面的库不像文档那样工作。如何从每个页面部署到每个lambda?
1.什么是合理的部署方案?请在生产级别使用NextJS 9的人帮助我。
1.我正在使用https://github.com/danielcondemarin/serverless-next.js库。效果很好。但所有选项都是固定的。我想把我的项目部署到东京地区。但我不知道如何改变地区。总是部署到N。弗吉尼亚州。我已经问过医生了但我觉得他们没有选择。像这个yml文件一样测试。
serverless.yml

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

但没起作用如果有人知道如何使用serverless-next.js更改区域。请帮帮我
先谢谢你了

mwngjboj

mwngjboj1#

将Next.js部署到AWS Lambda需要一个抽象层,因为Next.js首先被设计为作为Node.js服务器工作。
Vercel通过一个名为now-node-bridge的东西来实现这一点,它基本上是在Lambda函数中启动本地Node.js http-server,然后从Lambda invoke事件中创建一个请求。
下面是一个简化的流程图,当你对部署在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

1.将以下脚本tf-next添加到Next.js应用的package.json中:

{
  ...
  "scripts": {
    "dev": "next",
    "build": "next build",
    "start": "next start",
+   "tf-next": "tf-next build"
   }
}
...

1.在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"
}

1.创建一个AWS Access Key并在终端中公开它:

export AWS_ACCESS_KEY_ID=AKIAXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=wJaXXXXXXXXXXXXXXXXXXXX

1.使用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 Lambdas的任何AWS区域,并且您在其中定义的区域就是部署Lambdas的区域。
有关更多信息,请参阅GitHub页面:AWS Next.js Terraform module on GitHub

vddsk6oq

vddsk6oq2#

有一个webpack插件,可以帮助next-aws-lambda-webpack-plugin
1.此插件为每个页面生成一个目录,其中包含Next.JS的无服务器代码
1.此插件不使用Serverless framwork,因此您可以为您的基础设施使用本地AWS部署解决方案,例如:AWS SAMAWS cloudformation,让您的部署受益于AWS支持。
1.借助AWS本地解决方案部署,您可以自由选择任何想要的区域。

dfuffjeb

dfuffjeb3#

这个插件你正在使用的部署是使用lambda@edge和这操作region-less:
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html
Lambda@Edge是AWS Lambda的扩展,AWS Lambda是一种计算服务,可让您执行自定义CloudFront交付的内容的功能。您可以在一个区域(US-East-1(N))中编写Node.js或Python函数。Virginia),然后在全球更接近查看者的AWS位置执行它们,而无需配置或管理服务器。Lambda@Edge可自动扩展,从每天几个请求到每秒数千个请求。
如果你想在无服务器部署中有更大的灵活性,请使用线程中提到的webpack插件:
https://github.com/vincent-herlemont/next-aws-lambda-webpack-plugin
与无服务器框架一起,您可以为每个NextJs页面手动定义一个lambda函数(而不是Lambda@Edge),并将其部署到您所在地区的AWS帐户。

ni65a41a

ni65a41a4#

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

相关问题