如何针对同一个域并排使用AWS CloudFront和API网关?


9

我将网站的静态资产放在S3上,并设置CloudFront进行分发。这些本质上是用户对我的网站上的任何GET请求所需的内容,都包含到现有路径中,并且包含所有错误。

我也有一些POST请求需要处理。表单提交,发送电子邮件,通知,与数据库交互。

如何在同一域中与CloudFront并排设置Lambda(或API网关),以便CloudFront处理GET请求,而API Gateway处理带有正文或POST请求的请求。还是我可以通过单个URL做到这一点?

Answers:


2

我完全按照您的建议设计运行了多个Web应用程序,并提取了Gofaas(一款具有教育意义的Go和Lambda应用程序)来共享这些技术。

您需要两个单独的域,例如www.gofaas.netS3 + CloudFront和api.gofaas.netAPI Gateway + Lambda。

然后,您可以让您的静态站点通过API Gateway CORS配置和一些JavaScript与API交互:

fetch(`https://api.gofaas.net/work`, {
    method: "POST",
    mode: "cors",
    headers: {
        "Accept": "application/json",
        ...
    },
    body: JSON.stringify(...)
})
    .then(function(response) {
        return response.json();
    })
    .then(function (json) {
        // use response
    })
    .catch(function (err) {
        console.log("fetch error", err);
    });

以下是一些有关设置所有内容的指南:

带有S3,CloudFront和ACM的静态网站

Lambda,API网关,CORS和JWT的API安全性


在这里测试站点始终变得很有趣。很难在本地复制AWS基础架构,以便可以在本地进行集成测试。我使用路由而不是子域。这有助于部分测试。还消除了CORS的挑战。然后,API网关成为该路由的CloudFront的来源。
哥斯达黎加


2

从连接的角度来看,“某物”需要回答您的请求(GET,POST,PUT,一切)。首先,您有一个TCP连接,“某些东西”需要确保它能够理解第7层并从客户端发送的字节中弄清楚。仅在这一点上,才有可能以不同于POST请求的方式处理GET请求,或者以不同的方式处理一个URL。因此,最终您需要一种能够理解和路由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。

我可以想到的唯一方法可能是做这些事情:

  • 您使用API​​网关并将特定的“资产”路径路由到Lambda函数,该函数为S3做反向代理(因此通过lambda传递静态资产)-请在此处了解Lambda的成本!
  • 您可以执行相同的操作,但不必通过Lambda通过管道传输资产,而只是在Lambda中生成一个已签名的URL,然后直接重定向到S3进行投放(可能更具成本效益)
  • 为您的资产使用与应用程序其余部分不同的子域-这是一种非常常见的模式,因为您可以轻松地在DNS级别进行拆分,并针对不同的用例使用不同的服务(针对资产的CloudFront和针对非静态的API Gateway部分)

因此,我的电话将是最后的选择-但这意味着您需要将客户端/浏览器指向所有静态资产(或所有POST请求)的单独子域。

听起来您想看看AngularJS或React这样的技术来在浏览器中构建真正的API驱动的应用程序。使用这种方法,您正在运行一个真实的API,该API正在使用API​​网关处理所有“动态”请求,并从S3作为静态资产交付应用程序本身。也许查看这些内容可能会帮助您找到自己的方式-即使您不使用它们,如何构建类似这样的东西的体系结构模式也是您要的恕我直言。


2

我有相同的设置。在S3上的静态资产,Lambda函数通过API网关提供服务,并且它们共享相同的域名。

我使用已经使用CloudFront并公开其某些功能(例如缓存)的API网关。然后,我配置映射到静态资产的URI。在API Gateway中,资源可以是Lambda函数,AWS函数,模拟或其他URL。我让他们指向我的S3 URL。

可以将URI设置为遍历子路径,例如/assets/*


因此,给我带来麻烦的部分是部署API。在您的情况下,它通常没有引导路径就可以部署/assets/*。我必须删除部署,然后右键单击/assets/*路径并从此处进行部署。
哥斯达黎加

1
我应该深入研究命令行工具,并从那里学习如何创建和编辑api和lambda。
哥斯达黎加
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.