如何像 Vercel 一样在 AWS 上部署 NextJS?

Vig*_*aut 10 amazon-web-services next.js vercel aws-cdk

我想使用 AWS CDK 在 AWS 上部署 NextJS 进行 POC,并且正在寻找选项。在 NextJS 文档中,它说我们只需创建一个实例并运行npm run build && npm start,它就会为我们启动服务。然而,这并不是最优化的部署方式。

Vercel 以尽可能最优化的方式部署它: 在此输入图像描述

我如何使用 AWS 做同样的事情?如何通过 Cloudfront CDN 提供静态资产和页面,以及如何通过 Lambda 或 ECS 提供服务器端呈现的页面和 API?是否有我可以遵循的分步指南来拆分相同的构建文件?

我探索过的其他选择

  • AWS Amplify:由于它是一项高级服务,我觉得自己做这一切会便宜很多,并且在 CDK 中给我更大的灵活性(我不确定 Amplify 在幕后如何工作以在 S3 + 上部署 nextjs 资产) Cloudfront + Lambda 堆栈)
  • 无服务器框架:有一个插件可以部署nextjs。但是,我想完全控制部署,并且不想依赖任何外部框架。想要使用 AWS CDK 在本地完成此操作。

任何使用 AWS CDK 本地执行此操作的指示都会有所帮助。谢谢。

ofh*_*use 14

当您不想将整个 Next.js 服务器打包到单个 Lambda 中时,将 Next.js 部署为无服务器应用程序需要大量服务。

我当前为实现此目的而设置的 AWS 服务如下所示: 在此输入图像描述

它由 3 个主要资源组成:

  1. CloudFront
    它充当无服务器反向代理,将流量从 Internet 路由到 S3(JavaScript、预渲染页面)或 Lambda(服务器渲染页面)。
    使用Next.js 的图像优化功能时,您还需要一个为其提供 API 的额外服务。
  2. S3
    由于您不想仅调用 Lambda 来提供静态内容,因此您需要一个 S3 存储桶来存储和提供这些文件。
  3. Lambda
    然后,Lambda 用于为服务器生成的页面(SSR 和 API)提供服务。它们包含 Next.js 服务器的最小版本(例如,没有从 S3 提供的静态文件)。

我使用 Terraform 构建了此设置,因此目前没有可用的本机 CDK 解决方案。但其中大部分都可以简单地转换为 CDK,因为 Terraform 和 CDK 背后的模型几乎相同。

Terraform 模块的源代码可在 GitHub 上获取: https: //github.com/milliHQ/terraform-aws-next-js