我把我的网站的静态资产放在S3上,并设置CloudFront来分发它们。 这些基本上保留了用户在我的站点上对于任何GET请求所需的内容,到现有的path,这些path是错误的。
我也有一些POST请求,我需要处理。 表单提交,发送电子邮件,通知,与数据库交互。
如何与同一个域的CloudFront并排设置Lambda(或API网关),以便CloudFront处理GET请求,并且API网关使用正文或POST请求处理请求。 或者我可以通过个人url以某种方式做到这一点?
我有相同的设置。 S3上的静态资产,通过API网关提供的Lambdafunction,它们共享相同的域名。
我使用已经使用CloudFront的API网关,并公开了一些function,例如caching。 然后我configuration映射到静态资产的URI。 在API网关中,资源可以是Lambda函数,AWS函数,模拟或其他URL。 我让他们指向我的S3url。
URI可以设置为遍历子path,例如/assets/* 。
从连接的angular度来看,“东西”需要回答你的请求(GET,POST,PUT,一切)。 首先,你有一个TCP连接,“东西”需要确保它理解第7层,并从客户端发送的字节中理解。 只有在这一点上,才能处理GET请求,而不是POST请求或一个URL而不是另一个URL。 所以最后你需要一个能够理解和路由HTTP的服务。 以下服务可以执行此操作:CloudFront ELB / ALB API网关(稍后会有限制)
API Gateway在内部使用CloudFront(没有给您在CloudFront级别上实际configuration任何内容的机会) – 这意味着无法同时运行CloudFront和API Gateway,因此最终这意味着您将使用CloudFront运行CloudFront并排侧。
CloudFront让您有机会根据模式select不同的来源 – 但您只能selectS3或ELB / ALB作为来源 – 而不能使用Lambdafunction(除了Lambda @ Edgefunction)。
ALB / ELB只能使用EC2实例作为后端 – 这里没有Lambda或S3。
我能想到的唯一方法就是可以做你想做的是这些:
所以我的电话将是最后一个选项 – 但这意味着您需要指向客户端/浏览器的所有静态资产(或所有POST请求)单独的子域。
这听起来像你想看看像AngularJS或React的技术在浏览器中构build一个真正的API驱动的应用程序。 使用这种方法,您正在运行一个真正的API,它使用API网关处理所有“dynamic”请求,并将应用程序本身作为静态资产从S3提供。 也许看这些可能会帮助你find自己的方式 – 即使你不使用它们,如何build立这样的事情的架构模式是你要求的imho。
您可以创build一个lambda函数,设置API网关,然后configurationCloudFront将某些path(例如/ rest / *)转发到API网关,并从S3存储桶中提供其他所有内容。
这是一个完整的步骤展示如何做到这一点: https : //www.codeengine.com/articles/process-form-aws-api-gateway-lambda/