作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
托米斯拉夫·卡潘的头像

Tomislav Capan

Tomislav是一位资深的软件工程师、技术顾问和架构师. 他专门研究高度可扩展的全栈应用程序.

专业知识

以前在

Deliveroo
<但ton aria-label="分享" class="_2foqyr9I">分享
分享

作为运行复杂且要求高的软件产品的平台, AWS通过在需要时利用资源提供灵活性, 在所需的规模上. 它的需求和即时,允许完全控制运行环境. 当向客户提出这样的云架构解决方案时, 提供的基础设施, 还有它的价格, 很大程度上依赖于需要预先设置的需求.

本文将介绍一个这样的AWS云基础架构, 建议及实施 水平, 一个集成了面部支付功能的社交网络,可以发现并应用用户可能从他们所参加的卡计划中获得的所有好处, 他们拥有的东西, 或者他们居住的地方.

需求

客户提出的解决方案必须满足两个主要要求:

  1. 安全
  2. 可伸缩性

AWS云安全性和可扩展性

安全性要求 这一切都是为了保护用户的数据不受外部和内部未经授权的访问吗. 的 可扩展性要求 是关于基础设施自动支持产品增长的能力吗 适应日益增长的交通 偶尔会出现尖峰, 以及在服务器发生故障时的自动故障转移和恢复, 尽量减少潜在停机时间.

AWS安全概念概述

建立自己的AWS云基础设施的主要好处之一是完全的网络隔离和对云的完全控制. 这就是选择基础设施即服务(IaaS)路线的主要原因, 而不是运行更简单的平台即服务(PaaS)环境, 哪些提供可靠的默认安全性,但缺乏完整的安全性, 您可以通过使用AWS设置自己的云来获得细粒度控制.

虽然当他们与Toptal接洽时,水平还是一个年轻的产品 AWS咨询服务, 他们愿意使用AWS,并且知道他们需要最先进的基础设施安全性, 因为他们非常关心用户数据和隐私. 最重要的是, 他们计划在未来支持信用卡处理, 所以他们知道他们需要在某个时候确保PCI-DSS的合规性.

VPC (Virtual Private 云)

AWS上的安全性始于您自己的创建 亚马逊虚拟私有云 (VPC) —托管AWS资源的专用虚拟网络,在逻辑上与AWS云中的其他虚拟网络隔离. VPC获得了自己的IP地址范围, 完全可配置的子网, 路由表, 网络访问控制列表, 安全组(有效地), 防火墙).

在level中,我们首先将生产环境与开发、测试和测试隔离开来 QA 环境. 第一个想法是将它们每个都作为自己完全隔离的VPC运行, 每个都运行应用程序所需的所有服务. 经过一番考虑, 结果表明,我们可以允许在三个非生产环境之间进行一些资源共享, 这在一定程度上降低了成本.

因此, 我们决定将生产环境作为一个VPC, 与发展, 测试, 和QA环境作为另一个VPC.

基于VPC级别的访问隔离

双vpc的设置将生产环境和其他三个环境在网络层面隔离, 确保意外的应用程序错误配置不会跨越该边界. 即使非生产环境配置也应该错误地指向生产环境资源, 比如数据库或消息队列, 没有办法接近他们.

VPC网络访问隔离

与发展, 测试, 和QA环境共享同一个VPC, 在配置错误的情况下,可以跨界访问, 但, 因为这些环境使用测试数据, 由于那里缺乏隔离,不存在真正的安全问题.

资产存储安全模型

资产存储在 Amazon Simple Storage Service (S3) 对象存储. S3存储基础设施完全独立于vpc, 它的安全模式也不同. 存储为每个环境和/或资产类别组织在单独的S3桶中, 用适当的访问权限保护每个桶.

与水平, 确定了几类资产:用户上传, 制作内容的级别(宣传视频和类似内容), web应用程序和UI资产(JS代码), 图标, 字体), 应用程序和基础结构配置, 以及服务器端部署包.

每一个都有一个单独的S3桶.

应用秘密管理

有了AWS,就有了加密的 AWS系统管理器参数存储 或者是 AWS机密管理器,这是一种托管键值服务,旨在保护秘密安全(您可以在 Linux学院1战略).

AWS管理底层加密密钥并处理加密/解密. 密钥本身可以根据密钥前缀应用读写权限策略, 对于基础设施和用户(服务器和开发人员), 分别).

服务器SSH接入

完全不需要在完全自动化和不可变的环境中对服务器进行SSH访问. 可以提取日志并将其发送到专用的日志服务, 监控也被卸载到一个专用的监控服务. 但是,可能需要偶尔进行SSH访问以进行配置检查和调试.

为了限制服务器的攻击面,SSH端口不会暴露在公共网络中. 通过堡垒主机到达服务器, 允许外部SSH访问的专用机器, 另外,白名单只保护防火墙允许的IP地址范围. 通过将用户的公共SSH密钥部署到适当的框(禁用密码登录)来控制访问。. 这样的设置为恶意攻击者提供了一个相当有弹性的大门.

数据库访问

上述原则同样适用于数据库服务器. 偶尔也可能需要直接连接和操作数据库中的数据, 虽然这绝对不是推荐的做法, 并且这种访问需要以与服务器SSH访问相同的方式进行保护.

可以使用类似的方法,利用具有SSH隧道的相同堡垒主机基础设施. 需要建立双SSH隧道, 一个给堡垒的主人, 通过这个, 另一个发送给具有数据库访问权的服务器(堡垒主机没有数据库服务器访问权). 穿过第二条隧道, 从用户的客户机到数据库服务器的连接现在是可用的.

AWS可扩展性概念概述

当我们纯粹谈论服务器时, 使用比AWS更简单的平台可以很容易地实现可伸缩性. 主要的缺点是,某些需求可能需要由平台的外部服务来覆盖, 这意味着数据在公共网络上传播,打破了安全边界. 坚持使用AWS, 所有数据都是保密的, 而可伸缩性需要经过设计来实现可伸缩性, 有弹性的, 以及容错基础设施.

与AWS, 实现可伸缩性的最佳方法是利用托管的AWS服务,并在使用该平台的数千个客户端中进行监控和自动化测试. 将数据备份和恢复机制添加到组合中, 你只需要依靠平台本身就可以解决很多问题.

把所有这些都卸下后,就可以组建一个更小的运营团队, 在一定程度上抵消了平台管理服务的较高成本. 水平团队很乐意选择这条道路.

亚马逊弹性计算云(EC2)

依靠经过验证的环境运行 EC2实例 与额外的开销相比,仍然是一个相当合理的方法 复杂性 运行容器或仍然非常年轻且快速变化的无服务器计算体系结构概念.

EC2实例的供应需要完全自动化. 自动化是通过为不同类型的服务器定制ami来实现的, 自动伸缩组通过根据当前流量在队列中保持适当数量的运行服务器实例来处理运行的动态服务器队列.

另外, 自动缩放特性允许设置要运行的EC2实例数量的下限和上限. 下限有助于容错, 在实例失败的情况下潜在地消除停机时间. 上限是为了控制成本, 允许在意外的极端条件下有一定的停机风险. 然后自动缩放在这些限制内动态缩放实例的数量.

Amazon关系数据库服务(RDS)

队伍已经继续前进了 MySQL的Amazon RDS,但是适当的备份、容错和安全策略还有待开发. 在第一次迭代中, 数据库实例在每个VPC中升级为双实例集群, 配置为master和read-replica, 支持自动故障转移.

在下一次迭代中,随着MySQL版本5的可用性.7号引擎,基础设施得到了升级 亚马逊极光 MySQL服务. 虽然是完全管理的,但Aurora并不是一个自动扩展的解决方案. 它提供自动存储扩展,避免了容量规划的问题. 但是解决方案架构师仍然需要选择计算实例的大小.

由于扩展而导致的停机时间是无法避免的,但可以在自动修复功能的帮助下将其减少到最低限度. 多亏了更好 复制功能, Aurora提供了无缝的故障转移功能. 通过创建具有所需计算能力的读副本,然后执行到该实例的故障转移来执行伸缩. 然后将所有其他读副本也从集群中取出, 调整大小, 并被带回集群. 这需要一些手工杂耍,但完全可行.

新的Aurora Serverless产品还支持一定程度的计算资源自动扩展, 这是一个值得将来研究的特性.

托管AWS服务

除了这两个部分, 系统的其余部分则受益于完全托管的AWS服务的自动扩展机制. 弹性负载平衡(ELB), Amazon Simple Queue Service (SQS), Amazon S3对象存储, AWSλ函数, 和Amazon Simple Notification Service (SNS), 架构师不需要特别的扩展工作.

可变的和. 不可变的基础设施

我们认识到处理服务器基础设施的两种方法 可变的 infrastructure where servers are installed 和 continually updated 和 modified in-place; 和 an 不可变的 服务器在配置后不会被修改的基础结构, 任何配置修改或服务器更新都是通过从公共映像或安装脚本提供新服务器来处理的, 更换旧的.

对于水平,选择是运行一个 不可变的基础设施 无需就地升级、配置更改或管理操作. 唯一的例外是应用程序部署,它确实发生在原地.

更多关于可变vs的内容. 中可以找到不可变基础结构 HashiCorp的博客.

体系结构概述

从技术上讲, 水平是一个带有REST API后端和一些后台服务的移动应用程序和web应用程序,这是当今相当典型的应用程序. 关于这一点,提出并配置了下列基础设施:

云基础架构概述

虚拟网络隔离—Amazon VPC

该图显示了VPC中一个环境的结构. 其他环境遵循相同的结构(在其VPC中的非生产环境之间共享应用程序负载均衡器(ALB)和亚马逊极光集群), 但网络设置是完全相同的).

VPC在一个AWS区域内跨四个可用分区配置,实现容错. 通过子网和安全组配置网络访问控制列表,可以满足安全与访问控制需求.

在业务及其产品的早期阶段,跨越多个AWS区域的基础设施以获得额外的容错能力过于复杂和不必要,但这是未来的一种选择.

计算

level运行一个传统的REST API,带有一些后台工作程序,用于处理在后台发生的应用程序逻辑. 它们都作为普通EC2实例的动态队列运行, 通过自动伸缩组完全自动化. Amazon SQS 托管服务用于后台任务(作业)分发, 避免跑步的需要, 维护, 以及扩展您自己的MQ服务器.

后台工作分布

还有一些实用程序任务没有与应用程序的其余部分共享业务逻辑, 比如图像处理. 这种类型的任务运行得非常好 AWSλ, 因为Lambdas具有无限的水平可伸缩性,与服务器worker相比,它提供了无与伦比的并行处理.

负载均衡、自动伸缩和容错

负载均衡可以通过Nginx或HAProxy手动实现,但选择 Amazon弹性负载平衡(ELB) 增加了具有负载平衡基础设施本质上自动可伸缩的好处, 高可用性, 和容错.

使用ELB的应用程序负载平衡器(ALB)风格, 在负载平衡器上使用HTTP层路由. 添加到队列中的新实例通过AWS平台的机制自动向ALB注册. ALB还随时监视实例的可用性. 它具有注销和终止不健康实例的功能, 触发自动缩放将它们替换为新的. 通过两者之间的这种相互作用,实现了EC2舰队的自动修复.

应用程序数据存储

应用程序数据存储是一个 亚马逊极光 MySQL集群,由一个主实例和多个读副本实例组成. 在主实例失败的情况下, 其中一个读副本被自动提升到一个新的主实例. 这样配置后,它就满足了所请求的容错需求.

自动亚马逊极光实例故障转移模型

Read-replicas, 顾名思义, 还可以用于分配数据读取操作的数据库集群负载.

数据库存储在Aurora中以10GB的增量自动缩放, 备份也完全由AWS管理, 默认情况下提供时间点还原. 所有这些都将数据库管理负担减少到几乎为零, 除了在需要时扩展数据库计算能力之外——这是一项非常值得花钱的服务,可以无忧地运行.

存储和服务资产

水平接受用户上传的需要存储的内容. Amazon S3 可以预见的是,对象存储就是负责这项任务的服务. 还有应用程序资产(UI元素-图像), 图标, 字体),需要提供给客户端应用程序, 所以它们也会被存储到S3中. 通过其内部存储复制提供上传数据的自动备份, S3默认提供数据持久性.

用户上传的图片大小和重量各不相同, 通常对于直接食用和超重来说是不必要的大, 给移动连接带来负担. 生成不同大小的几个变体将能够为每个用例提供更优化的内容. AWSλ 是用来完成任务的吗, 以及将上传的原始图像复制到单独的备份桶中, 以防万一.

最后, 浏览器运行的web应用程序也是一组静态资产——持续集成构建基础设施编译JavaScript代码,并将每个构建也存储到S3中.

一旦所有这些资产都安全地存储在S3中, 它们可以直接上桌, 因为S3提供了一个公共HTTP接口, 或者通过 Amazon 云Front CDN. 云Front使资产在地理上分布, 减少对最终用户的延迟, 并且还为服务静态资产启用了HTTPS支持.

S3桶和云Front CDN组织概述

基础设施发放与管理

供应AWS基础设施是网络的组合, AWS管理的资源和服务, 以及裸EC2计算资源. 托管AWS服务是托管的. 除了配置和应用适当的安全性之外,它们没有什么可做的, 同时拥有EC2计算资源, 我们需要自己处理配置和自动化.

工具

基于web的AWS控制台使得管理“像乐高积木一样”的AWS基础设施变得非常重要, 和, 任何手工工作, 而容易出错. 这就是为什么我们非常希望使用专用工具来自动化这项工作.

一个这样的工具是 AWS 云Formation,由AWS开发和维护. 另一个是HashiCorp的 起程拓殖 -通过提供多个平台提供商提供一个稍微灵活的选择, 但有趣的是,这里主要是由于起程拓殖的不可变基础设施方法哲学. 与运行水平基础设施的方式一致, 起程拓殖, 与Packer一起提供基础AMI图像, 结果很适合你.

基础架构文档

自动化工具的另一个好处是它不需要详细的基础架构文档, 哪个迟早会过时. 供应工具的“基础设施即代码”(IaC)范例被称为文档, 其好处是始终与实际基础设施保持同步. 有一个高层次的概述, 不太可能被更改,并且相对容易在最终更改时进行维护, 在旁边记录就足够了.

最终的想法

拟议的AWS云基础设施是一个可扩展的解决方案,能够自动适应未来的产品增长. 经过近两年的努力,它成功地保持了较低的运营成本,依靠 云的自动化 没有专门的系统运营团队24小时值班.

在安全性方面,AWS云将所有数据和所有资源保存在内部 专用网络 在同一片云里. 任何机密数据都不需要通过公共网络传输. 外部访问被授予对可信支持系统(CI/CD)的细粒度权限, 外部监控, 或报警), 将访问范围限制为其在整个系统中的角色所需的资源.

架构和设置正确, 这种制度是灵活的, 有弹性的, 安全, 并准备好回答未来关于产品增长的扩展或实现PCI-DSS合规性等高级安全性的所有需求.

它并不一定比Heroku或类似平台提供的产品更便宜, 只要您符合他们的产品所涵盖的通用使用模式,哪些工作良好. 通过选择AWS,您可以更好地控制您的基础设施, 提供的AWS服务范围提供了额外的灵活性, 和定制配置与整个基础设施的微调能力.

Toptal是高级AWS咨询合作伙伴.

作为亚马逊合作伙伴网络(APN)的高级咨询合作伙伴, Toptal为企业提供云解决方案,并在企业发展的每个阶段与企业合作.


了解基本知识

  • 什么是云基础设施?

    云基础设施是一种高度自动化的产品,可以根据需要向用户提供与存储和网络服务相补充的计算资源. 在本质上, 用户可以使用IT基础设施,而不必为物理基础设施的建设付费.

  • 什么是亚马逊网络服务(AWS)?

    Amazon Web Services是一家云服务提供商,它拥有并维护这些应用服务所需的网络连接硬件. AWS云提供基础设施即服务(IaaS)的组合。, 平台即服务, 以及打包的软件即服务(SaaS)产品.

  • AWS云是如何工作的?

    AWS云作为一种按需云计算资源,允许用户只配置和使用他们需要的内容. 它提供灵活、可靠、可扩展、易于使用且具有成本效益的云计算解决方案.

  • 什么是云计算?

    云计算是计算能力的按需交付, 数据库, 存储, 应用程序, 和其他IT资源,通过互联网按需付费.

  • AWS是公共云吗?

    AWS是一个api驱动的全球分布式公共云,通过开发人员自助服务提供近乎即时和无限的容量. 应用程序可以根据需求自动增加或减少容量,实现即时的全球扩展.

聘请Toptal这方面的专家.
现在雇佣
托米斯拉夫·卡潘的头像
Tomislav Capan

位于 克罗地亚的萨格勒布

成员自 2013年2月20日

作者简介

Tomislav是一位资深的软件工程师、技术顾问和架构师. 他专门研究高度可扩展的全栈应用程序.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

专业知识

以前在

Deliveroo

世界级的文章,每周发一次.

<但ton class="_2bg14bwf _1Yko3Q2K _1SZtmxGM _2Yt-rhsd _1S6tHuDo" data-ga-category="bottom_sticky_bar" data-ga-event="cta_clicked" data-ga-label="Sign me up - Sticky - 0%" type="submit">帮我报名

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

<但ton class="_2bg14bwf _1Yko3Q2K _1SZtmxGM _2Yt-rhsd _1S6tHuDo" data-ga-category="bottom_sticky_bar" data-ga-event="cta_clicked" data-ga-label="Sign me up - Bottom - 0%" type="submit">帮我报名

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.