使用API​​ Gateway,Lambda,Cognito,S3,Dynamodb部署AWS Global基础架构

时间:2016-09-30 08:59:40

标签: amazon-web-services aws-lambda aws-api-gateway amazon-route53

假设我需要一个运行Lambdas的API网关,并且我希望创建最佳的全球分布式执行基础架构。此外,我将使用Cognito进行身份验证,Dynamodb和S3用于用户数据和前端静态。

我的应用位于myapp.com

首先,用户从最近的位置获取静态前端:

user ===> CloudFront的边缘位置< ---任何地区的S3(带静态前端)

之后我们需要与API网关通信。

user ===> API网关---> Lambda ---> S3 || Cognito || Dynamodb

API网关可以位于多个区域,即使与CloudFront一起分发,每个端点也指向位于给定区域的Lambda:假设我在eu-west-1部署API。如果从美国发送请求,即使我的API在CloudFront上,它运行的Lambda也位于eu-west-1,因此延迟也会很高。

为了避免这种情况,我需要在us-east-1和我所有的Lambdas上部署另一个API。该API将指向那些Lambdas

如果我为每个区域部署一个API,我需要为每个区域配置一个端点,并且前端应该决定请求哪个端点。但我们怎么知道哪一个是最近的位置?

理想情况是api.myapp.com处的单个全局端点,它将转到最近的API网关,该网关也运行位于该区域的Lambdas。我可以使用路由53延迟路由配置多个A记录指向每个api网关吗?

如果这不是正确的方法,你能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:2)

AWS最近宣布支持区域API端点,您可以使用它来实现此目的。

以下是一个AWS博客,解释了如何实现这一目标:

Building a Multi-region Serverless Application with Amazon API Gateway and AWS Lambda

摘自博客:

  

API Gateway中的默认API端点类型是边缘优化的API   端点,使客户端能够通过亚马逊访问API   CloudFront分发。这通常可以缩短连接时间   地理位置多样化的客户。默认情况下,自定义域名是   全局唯一且边缘优化的API端点将调用a   在Lambda集成的情况下,Lambda函数在单个区域中。   您不能将此类型的端点与Route 53主动 - 主动一起使用   设置和故障转移。

     

API Gateway中的新区域API端点移动API端点   进入该区域,每个区域的自定义域名是唯一的。这个   使得可以在每个区域中运行API的完整副本然后   使用Route 53使用主动 - 主动设置和故障转移。

答案 1 :(得分:0)

不幸的是,这目前不可能。这里的主要阻止者是CloudFront。 MikeD @ AWS 在其论坛上提供信息:

  

创建自定义域名时,它会为域名创建关联的CloudFront分配,CloudFront会对域名强制实施全局唯一性。

     

如果已存在具有域名的CloudFront分配,则CreateCloudFrontDistribution将失败,并且API Gateway将返回错误,而不保存域名或允许您定义其关联的API。

     

因此,目前(2016年6月29日)无法在多个地区获取API网关来处理相同的域名。

自2016年7月4日确认存在开放功能请求后,AWS没有提供必要的更新。AWS Form thread for updates

答案 2 :(得分:0)

结帐Lambda@Edge

  

问:什么是Lambda @ Edge? Lambda @ Edge允许您跨AWS运行代码   全局位置,无需配置或管理服务器,   以最低的网络延迟响应最终用户。你只需上传   您的Node.js代码到AWS Lambda并配置您的功能   触发响应Amazon CloudFront请求(即,当a   当请求被转发或接收回来时,查看者请求登陆   从原点开始,然后在回复最终用户之前)。   然后,当a时,代码可以在全球范围内的AWS位置执行   收到内容请求,并按体积缩放   CloudFront全局请求。在我们的文档中了解更多信息。

用例,最大限度地减少全球分布式用户的延迟

  问:我什么时候应该使用Lambda @ Edge? Lambda @ Edge针对延迟进行了优化   敏感用例,您的最终查看者是全球分布的。   理想情况下,您可以获得做出决定所需的所有信息   在CloudFront边缘,在函数和请求中。这个   表示您希望就如何做出决定的用例   基于用户特征(例如,位置,客户端)来提供内容   设备等)现在可以从边缘执行并提供服务   Node.js-6.10无需路由回中央服务器。