【问题标题】:How to deploy NextJS on AWS, the same way Vercel does?如何像 Vercel 一样在 AWS 上部署 NextJS?
【发布时间】:2022-04-08 00:39:35
【问题描述】:

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

Vercel 以最优化的方式部署它:

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

我探索的其他选项

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

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

【问题讨论】:

  • 我一直在 AWS amplify 上部署我的 Next.js 应用程序,它运行良好。构建/部署时间比 Vercel 长一点,我觉得 Amplify 上的日志记录与 Vercel 相比有所欠缺,但我发现它是一个易于使用且很好的替代方案
  • 是的。放大很容易。但是,它很贵。此外,我们必须等待 Amplify 支持更新版本的 NextJS(我认为目前它支持 10.x)。因此,我想通过 AWS Cloudformation 或 CDK 自己完成 Amplify 所做的所有事情,而无需使用 AWS Amplify CDK 构造。
  • 我不能说它在 Next 12 中的表现如何,我使用的是最新版本的 Next,但没有使用许多新功能,一个是新的编译器。但是我正在尝试更改为 Vercel 的案例,在其上部署 Next 应用程序真是太好了
  • 小心放大,就像其他“罐装”AWS 服务(例如 Beanstalk)一样,您无法配置/自定义专业项目所需的许多区域。例如,我上次使用它时,您的路由 + 重写选项有限,而且它们不支持查询字符串。除了非常基本的博客/静态网站用例之外,我不推荐它。

标签: amazon-web-services next.js aws-cdk vercel


【解决方案1】:

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

我当前为实现此目的而设置的 AWS 服务如下所示:

它由 3 个主要资源组成:

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

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

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

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 2022-08-21
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多