我将我网站的静态资产放在 S3 上,并设置 CloudFront 来分发它们。这些基本上包含用户在我的站点上的任何 GET 请求所需的内容,以及现有路径,即包含错误的全部内容。
我还有一些需要处理的 POST 请求。表单提交、发送电子邮件、通知、与数据库交互。
如何为同一域设置 Lambda(或 API Gateway)和 CloudFront,以便 CloudFront 处理 GET 请求,而 API Gateway 处理带有正文或 POST 请求的请求。或者我可以通过个人网址以某种方式做到这一点吗?
您可以创建一个 lambda 函数,设置 API 网关,然后配置 CloudFront 以将某些路径(例如 /rest/*)转发到 API 网关,并从 S3 存储桶提供其他所有内容。
这是一个完整的演示如何执行此操作:https ://www.codeengine.com/articles/process-form-aws-api-gateway-lambda/
从连接的角度来看,“某事”需要回答您的请求(GET、POST、PUT、一切)。首先,您有一个 TCP 连接,并且“某事”需要确保它理解第 7 层并理解客户端发送的字节。只有在这一点上,才能以不同于 POST 请求或一个 URL 而不是另一个 URL 的方式处理 GET 请求。所以最终你需要一个能够理解和路由 HTTP 的服务。以下服务能够执行此操作: CloudFront ELB/ALB API 网关(稍后会有限制)
API Gateway 在内部使用 CloudFront(没有让您有机会在 CloudFront 级别上实际配置任何内容) - 这意味着无法同时运行 CloudFront 和 API Gateway,因为最终这意味着您将 CloudFront 与 CloudFront 一起运行并排。
CloudFront 让您有机会根据模式选择不同的来源 - 但您只能选择 S3 或 ELB/ALB 作为来源 - 而不是 Lambda 函数(除了 Lambda@Edge 功能)。
ALB/ELB 只能使用 EC2 实例作为后端——这里没有 Lambda 或 S3。
我能想到的唯一方法可能会做你想做的事情是这些:
所以我的电话将是最后一个选择 - 但这意味着您需要将客户端/浏览器指向所有静态资产(或所有 POST 请求)的单独子域。
听起来你想看看像 AngularJS 或 React 这样的技术来在浏览器中构建一个真正的 API 驱动的应用程序。使用这种方法,您正在运行一个真正的 API,它使用 API 网关处理所有“动态”请求,并将应用程序本身作为静态资产从 S3 交付。也许看看那些可能会帮助你找到自己的方式——即使你不使用它们,关于如何构建这样的东西的架构模式就是你所要求的恕我直言。
我有同样的设置。S3 上的静态资产,通过 API 网关提供的 Lambda 函数,它们共享相同的域名。
我使用已经使用 CloudFront 并公开其一些功能(例如缓存)的 API 网关。然后我配置映射到静态资产的 URI。在 API Gateway 中,资源可以是 Lambda 函数、AWS 函数、模拟或其他 URL。我让他们指向我的 S3 URL。
URI 也可以设置为全局子路径,例如
/assets/*
.我完全按照您提出的设计运行了多个 Web 应用程序,并提取了 gofaas(一个教育性的 Go 和 Lambda 应用程序)来分享这些技术。
您需要两个单独的域,例如
www.gofaas.net
S3 + CloudFront 和api.gofaas.net
API Gateway + Lambda。然后,您可以让您的静态站点通过 API Gateway CORS 配置和一些 JavaScript 与 API 交互:
以下是设置所有这些的一些指南:
使用 S3、CloudFront 和 ACM 的静态网站
使用 Lambda、API 网关、CORS 和 JWT 实现 API 安全性