前阵子帮刚换工作的师弟梳理新项目的技术栈,整个后端环境都跑在aws上,他说之前只听过这个名字,具体能做什么、该注意什么完全没概念。问了几个刚工作两三年的开发者,发现不少人对aws的认知还停留在"国外云服务"的模糊标签里,具体的核心能力和适用场景其实说不清楚,甚至有人把它和单纯的存储服务搞混,以为只能用来存数据,其实完全不是这么回事。
核心概念梳理
先讲最基础的,aws是一个提供全品类云IT服务的平台,本质逻辑和其他云服务一样,就是把原本需要企业自己采购、搭建、维护的硬件基础设施,以及上层的平台服务,变成可以按需取用的标准化服务。用户不用自己管机房的供电、散热、网络维修这些底层琐事,只需要根据自己的需求选对应的服务,按实际消耗付费就行。某种意义上说,它的核心优势之一就是覆盖面全,大部分开发需要的功能都能直接找到对应的服务,不用自己从零搭建,能节省不少前期的准备时间。
不少人第一次接触会觉得,aws就是卖虚拟服务器的,其实不对。从底层的计算、存储、网络资源,到中层的托管数据库、消息队列、负载均衡,再到上层的数据处理、人工智能工具,aws的产品线覆盖了几乎所有IT领域常见的开发和运行需求。普通开发者日常接触最多的,还是基础计算资源、对象存储、托管数据库这几类基础服务,复杂的上层服务一般只有特定业务才会用到。
从技术架构的角度看,aws的服务分层比较清晰,你可以只拿它做底层基础设施,自己在上面搭所有的软件栈,也可以直接用它的托管服务,不用自己维护底层软件的升级和故障处理,不同的团队可以根据自己的技术能力和需求来选,灵活性比较高。
常见适用场景
第一个比较常见的场景,是面向海外用户的业务部署。aws在全球多个国家和地区都设有可用区节点,做面向海外用户的产品时,把服务部署在靠近用户的节点上,可以有效降低网络延迟,提升用户的访问体验。这也是很多出海团队会选择aws的主要技术原因之一。
第二个常见场景,是流量波动大的业务弹性扩容。很多互联网业务的流量并不稳定,比如做节日促销、新品首发、活动推广的时候,流量可能涨到平日的十几倍甚至几十倍,活动结束之后又快速回落。如果自己采购硬件,平时大部分时间资源都是闲置的,会造成不必要的浪费。用aws的按需扩缩容能力,可以在流量上涨的时候自动新增服务资源,流量降下来之后再释放闲置资源,既能平稳应对峰值压力,也能控制整体的资源投入。我之前碰到过一个小团队,做海外新品首发,没提前配置好自动扩容的阈值,也没做压测,结果流量上来之后,原有资源CPU、带宽占满,服务持续响应超时,折腾了半天多才恢复,损失了不少用户。这个坑其实挺常见的,很多新手刚接触弹性服务,都会忽略阈值配置和压测环节。
第三个常见场景,是临时开发测试环境搭建。很多团队做新项目立项,或者验证新技术方案,只需要用几周或者几个月的资源,项目结束之后就不需要了。如果自己从零搭一套物理环境,后续处理闲置资源也很麻烦。用aws可以快速创建出需要的开发环境,配置好需要的软件,用完直接销毁资源,不用长期持有和维护闲置硬件,对小团队和个人开发者来说都比较灵活。还有不少做个人技术实验的开发者,会用aws来跑短期的测试项目,用完直接释放,不用一直开着本地的机器,也比较方便。
实际使用的常见问题
讲完概念和场景,再说说我实际接触下来,新手第一次用aws最容易踩的几个坑,这些问题表面看不大,但排查起来很费时间,有的还会造成比较严重的后果。
第一个坑是权限配置过度开放。aws的权限体系设计得非常细致,支持给不同的用户、不同的服务配置刚好满足需求的最小权限,从机制上降低越权访问的风险。但很多新手刚用的时候,为了快点把服务跑起来,省去一个个配权限的麻烦,会直接给账号开最高级别的管理员权限。开发测试环境还好,如果是生产环境也这么做,一旦某个账号的密钥泄露,整个账户下的所有资源都会面临被篡改、删除的风险。还有不少团队,开发人员离职之后,忘记删除对应的权限账号,留下长期的安全隐患。这一点我感觉特别值得注意,不管是开发环境还是生产环境,都尽量按最小权限原则配置,不要为了图方便开过度的权限,后续整改的成本比一开始配对要高很多。
第二个坑是区域和可用区选择错误。aws把不同地理位置的服务集群划分为不同的区域,每个区域下面又有多个物理上互相隔离的可用区,用来做高可用容灾。很多新手选区域的时候,要么随便选默认选项,要么只看计费规则不看位置,结果把应用服务器和数据库放在距离很远的不同区域,网络延迟比同区域部署高几十倍甚至上百倍,整个服务的响应速度掉得厉害,找了半天问题才发现是位置选错了。如果要做高可用架构,还需要把不同的服务实例放在同一个区域的不同可用区,避免一个可用区因为断电、光纤故障等问题出问题,整个服务都跟着瘫痪。这个点看起来非常基础,但我见过差不多六成的第一次用aws的开发者,都会在这里踩坑。
第三个坑是对象存储权限配置错误。aws的对象存储服务很多人用来存静态资源、用户上传数据或者业务备份,默认情况下,新建的存储桶是不允许公开访问的,这个默认设置其实是比较安全的。但很多人放静态网页或者公共资源的时候,为了省配置的步骤,直接把整个存储桶改成公开读写权限,这样一来,存储桶里的所有内容都能被任意人访问下载,如果里面不小心上传了不该公开的配置文件、数据库备份,很容易导致信息泄露。我之前帮人排查过一次数据泄露问题,就是开发为了方便传静态资源,开了整个桶的公开访问,后来没人记得改回去,上传代码的时候不小心把带数据库连接信息的配置文件传了进去,过了三个多月才被发现,造成了不小的损失。
第四个坑是监控告警配置缺失。很多开发者把服务跑通之后,就觉得万事大吉,忘了配置监控告警。aws自带基础的监控服务,但是大部分告警规则默认是不开启的,阈值也不会根据你的业务自动调整。我之前碰到过一个项目,运行了大半年,某天存储容量占满,服务直接没法写数据,结果运维那边没人收到告警,过了四五个小时才发现问题,导致业务中断了很久。排查之后才发现,从上线开始就没配过容量告警,默认的监控规则根本不会发通知。不管用什么云服务,监控告警都是生产环境必须做的一步,aws的默认配置不能直接用,一定要自己根据业务的实际情况调整好告警阈值,开启对应的通知渠道,这一步绝对不能省。
还有一个常见的误区,就是很多人觉得用aws就一定比自己部署成本低,其实不是。如果你的业务负载非常稳定,长期都保持固定的资源使用率,长期全用按需实例的累计投入,其实比自己采购硬件的成本要高。aws也有针对稳定负载的对应计费方案,但是需要提前规划,选对计费方式。所以正式部署之前,最好先理清楚自己业务的负载特点,对应选合适的服务类型和计费方式,不要上来就全部用默认的按需配置,长期下来会超出原本的资源规划。
最后还有一个容易忽略的点,就是数据备份的跨区域规划。aws提供了自动数据备份的服务,但是很多新手默认不开备份,或者把备份存在和主数据同一个可用区甚至同一个区域。如果整个区域因为不可抗力出故障,主数据和备份一起出问题,就没法恢复了。按照aws的最佳实践,重要数据的备份最好跨区域存储,还要定期验证备份能不能正常恢复,不要以为开了备份就万事大吉,很多出问题的案例都是备份没做好,没法恢复数据,造成不可挽回的损失。