Answers:
我完全按照您的建议设计运行了多个Web应用程序,并提取了Gofaas(一款具有教育意义的Go和Lambda应用程序)来共享这些技术。
您需要两个单独的域,例如www.gofaas.net
S3 + CloudFront和api.gofaas.net
API 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);
});
以下是一些有关设置所有内容的指南:
您可以创建一个lambda函数,设置API网关,然后将CloudFront配置为将某些路径(例如/ rest / *)转发到API网关,并从S3存储桶提供其他服务。
这是展示如何执行此操作的完整指南:https : //www.codeengine.com/articles/process-form-aws-api-gateway-lambda/
从连接的角度来看,“某物”需要回答您的请求(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。
我可以想到的唯一方法可能是做这些事情:
因此,我的电话将是最后的选择-但这意味着您需要将客户端/浏览器指向所有静态资产(或所有POST请求)的单独子域。
听起来您想看看AngularJS或React这样的技术来在浏览器中构建真正的API驱动的应用程序。使用这种方法,您正在运行一个真实的API,该API正在使用API网关处理所有“动态”请求,并从S3作为静态资产交付应用程序本身。也许查看这些内容可能会帮助您找到自己的方式-即使您不使用它们,如何构建类似这样的东西的体系结构模式也是您要的恕我直言。
我有相同的设置。在S3上的静态资产,Lambda函数通过API网关提供服务,并且它们共享相同的域名。
我使用已经使用CloudFront并公开其某些功能(例如缓存)的API网关。然后,我配置映射到静态资产的URI。在API Gateway中,资源可以是Lambda函数,AWS函数,模拟或其他URL。我让他们指向我的S3 URL。
可以将URI设置为遍历子路径,例如/assets/*
。
/assets/*
。我必须删除部署,然后右键单击/assets/*
路径并从此处进行部署。