AWS API Gateway + Lambda + SQS + EC2 + MYSQL + RedShift

时间:2017-06-28 22:22:00

标签: mysql api amazon-web-services amazon-sqs

我正在开发一个项目,需要针对我希望如何与AWS合作制定新的基础架构提案。

我需要支持以下内容:

  1. 网络管理平台
  2. 移动应用
  3. 报告和分析
  4. 第三方API访问
  5. 在负载和性能方面,我需要支持以下内容:

    1. Web应用程序每月向后端系统提出500k +请求
    2. 移动应用程序每年将额外增加200万
    3. 管理平台每两个月最高可达5000万次请求
    4. api access将添加额外的500多万个请求。
    5. 一些有助于塑造一些思考的笔记。现在几乎不需要来回传递实时数据,但是这肯定会在将来出现,所以希望现在可以计划。

      我的想法如下:

      • 选项1: Cognito + API网关+ Lambda + SQS + EC2 + MYSQL + Lambda + Redshift

      • 选项2: Cognito + API网关+ Kinesis + EC2 + MYSQL

      • 选项3: Cognito + API网关+ Lambda + dynamoDB流+ EC2 + MYSQL

      所以我需要支持的是一堆生活在EC2服务器上的PHP端点,它将接收JSON请求并更新(CRUD)MYSQL数据库。 问题:基于上面的数字 - 我是否会遇到有MYSQL的问题?

      额外的我希望SQS能够带来一些负载,并且在EC2实例前面有一个负载均衡器可以帮助处理时间等。

      我读过的一些事情是SQS不是推送机制所以你必须每秒/分钟轮询它以获取消息并继续。

      我的目标是实现:

      可扩展的平台,可以处理最小到最大的请求,而不必担心故障转移等,但也允许灵活扩展PHP应用程序。

      任何建议都会有所帮助,或者如果需要更清晰 - 请告诉我?

3 个答案:

答案 0 :(得分:2)

应用程序注意事项

  

现在几乎不需要来回传递实时数据,但是这肯定会在将来出现,所以希望现在可以计划

如果不知道您期望来回传递什么样的实时数据,就很难对此进行评论

  

所以我需要支持的是一堆生活在EC2服务器上的PHP端点,它将接收JSON请求并更新(CRUD)MYSQL db

有几种方法可以解决这个问题。卸载我会稍微谈谈。但是,如果您只是采用合理大小的JSON数据并将其转储到数据库中,我建议您考虑使用Lambda。请注意,PHP目前不是受支持的lambda语言,但从技术上讲,有很多方法可以在Lambda上使用它。我不推荐它。

数据库注意事项

  

问题:基于上面的数字 - 我是否会遇到有MYSQL的问题

对于数据部分,还有很多方法可以解决这个问题。我会说大量的写作将是你最关心的问题,这取决于你使用了多少。对于RDS,AWS为您提供provisioned IOPS。 DynamoDB为您提供write capacity

用于读取重型设置。 RDS为您提供read replicas。 DynamoDB可以为您提供非常好的读取性能,代价是必须处理非规范化数据。与此DynamoDB一起最近有DAX, a caching system implemented。对于一般缓存,可以使用Elasticache

关于您的引擎问题,它归结为要求。我建议您阅读AWS best practices for RDS,了解哪种引擎最符合耐用性和性能需求。在引擎之外,您当然应该监视查询性能以捕获诸如频繁访问的非索引列之类的问题。

计算卸载:SQS

  

另外我希望SQS能够带来一些负担和希望   在EC2实例前面有一个负载均衡器会有所帮助   处理时间等。

     

我读过的一些事情是SQS不是推送机制所以你   必须每秒/分钟轮询它以获取消息和   继续进行。

CloudWatch为您提供可以为X条消息设置的警报。然后它可以产生一个工作协调员Lambda来传递给其他Lambdas,具体取决于你将多少工作放入队列。另一个选择是让Lambda生成一个EC2工作者实例,它只是从队列中拉下所有内容并将其传递给Lambdas或其他EC2实例。

计算卸载:批处理

另一个选择是使用AWS批处理。它的工作原理是您拥有计算环境,作业队列和作业定义。

计算环境保存将运行作业的容器。如果您不想过多地考虑分配,这可以是按需实例,如果您希望以高于出价的风险进入成本有效路线,则可以是现场实例。此处的另一个设置是您希望的最小和最大vCPU数量。 AWS Batch将根据这些限制和作业的数量/大小来增加和减少资源。

从那里有工作队列。这些优先级附加到它们,并且绑定到计算环境。相同的计算环境可以容纳多个作业队列。我们的想法是让您重视流程。围绕客户订单的流程是您想要比仅仅生成缩略图的流程快得多的。

最后有一个工作定义。这表明完成一项工作需要整个计算环境的哪个部分。这是您确定工作规模的方式。重要的是要记住,如果你对工作能力分配过于贪婪,你就会陷入困境,等待资源被释放。对于扩展,您可以调整计算环境最小/最大资源,或者考虑将工作分解为具有该队列的专用计算环境的单独队列。

至于开始工作,您可以让lambda根据某些事件向批处理提交作业,或让您的应用程序使用SDK提交作业。

EC2实例注意事项

关于EC2实例,如果你确实需要走这条路线,我建议在它们面前放置一个负载均衡器。如果您知道自己会有高峰流量,AWS可以做一些所谓的预热。这实际上为您提供了处理预期流量负载的备用容量。此外,它允许您附加一个SSL证书,它为所有EC2实例处理HTTPS不仅如此,它还可以终止SSL,以便您的EC2实例只接收HTTP,使处理更轻松。我还建议查看ELB best practices as well

您还应该考虑自动缩放组。这使您可以根据需要添加和删除容量。但请注意,由于它需要花时间旋转实例,因此不会立即立即修复异常尖峰流量。 ASG还会对您的实例执行运行状况检查,并将替换未通过运行状况检查的实例。请注意,ELB还会执行运行状况检查,如果它注意到错误的实例,则会将实例撤消。

接下来,您应该评估reserved instances。如果您不断拥有特定的EC2实例,那么随着时间的推移,它们会随着需求而节省更多。请注意,当您在1 - 3年的承诺中预先购买时,最好的节省就会增加。同时,它为您提供有保障的容量。这对于AZ失败并且该地区其他AZ的需求增加的情况尤为重要。当发生如此高的需求时,保留的实例将始终否决按需实例。

CDN静态资产缓存

对于静态资产的高容量,请考虑使用CloudFront。最简单的方法是在us-east-1中设置一个S3存储桶(是的,你必须这样做,因为CloudFront的部署基础设施就在那里)。然后将资产加载到S3存储桶中,使其成为静态网站主机,然后将CloudFront指向它。然后,CloudFront会将您的静态资产部署到您指定的区域中的边缘服务器。默认情况下,CloudFront将这些静态资产保留24小时,然后再检查是否有任何更改。

请注意,您确实应该将CloudFront资产作为子域,以便它只处理静态内容请求。如果您让它处理整个域,那么您需要为动态内容流量添加另一条路径。

监控注意事项

要关闭,在所有情况下,您都希望使用CloudWatch为您使用的服务设置指标。不要只是设置infra并假设一切正常。你总是需要确保事情顺利进行,并尽快采取行动。此外,我建议查看所有AWS服务,并继续考虑可以将应用程序的哪些部分卸载到此类服务。知识就是力量。

答案 1 :(得分:0)

解决AWS S3存储桶问题的方法:

enter image description here

最近,Twitter遭到了解决AWS的S3存储桶问题的解决方案的轰炸。正是由于这一原因,无数的专业人员开始在云上思考“ 是否可以在AWS上进行进一步的改进?

放下手腕AWS使云计算行业达到了一个全新的高度。但是,在改进了S3存储桶安全性的地方,我们仍然听到并见证了令人震惊的漏洞,使我们所有人都在考虑“ 仍需要一些东西”

这使许多专业人员致力于云计算,以弄清楚如何解决此问题。牢记这一点,我已经整理了一些最佳实践,可以解决这个问题。其中包括:-

  1. 从存储桶中分离公共访问权限:如果AWS专业人士无法将存储桶公开,问题将消失。不过,您应该等到存储桶本身公开后再开始运行。发现存在一些需要公共存储桶的极端情况,因此建议使用一种新的AWS服务,即AWS Bucket Exposed Endpoints。这将为现有的S3存储桶(CloudFront,即没有额外的CDN组件)创建一个单独的公共端点。此服务具有不同的权限,UI中的页面以及位于不同的命名空间中。
  2. 将ACL与存储桶策略合并:当开发人员感到困惑时,他们最终会犯错误,并且在AWS生态系统中几乎没有错误/错误,因为很少有东西可以解释ACL的内部工作原理S3存储桶策略和ACL。如果要求AWS同事投票,那么大多数人都会同意,取消ACL可能会带来巨大帮助,因为从获得许可的角度来看,ACL的工作方式似乎有所不同。
  3. 公共存储桶上仅CLI的设置:我认为,如果不能实施第一点,那么下一个最佳选择是从UI中完全删除公共访问设置。除非没有先例,否则它可能会很激烈。
  4. 允许帐户所有者做出决定:我认为,不应将设置权限授予任何开发人员,尤其是在涉及S3权限时。此外,要添加此功能(由Amazon启动的任何新帐户),他们都可以全局添加“阻止S3存储桶公开”。这将要求最终用户禁用它,并在禁用它之前添加MFA设备。
  5. 需要两个人的开发人员:S3权限是一项严肃的工作。现在,拥有多个开发人员的帐户中,其中任何一个开发人员都试图向该帐户公开电子邮件确认,因此应与管理员共享以验证此操作。

最后,我想说的是,AWS在创建具有良好安全选项的优质服务方面做得值得称赞。开发人员配置不安全存储桶的答案表明,他们没有阅读这些选项,而是担心它们会变得更加精致。

答案 2 :(得分:-1)

如果您打算安全使用,则选项2和3不可行

选项2的kinesis是未加密的。因此不安全 选项3使DynamoDB Streams未锁定到虚拟私有云端点