这是个真实的事故:

2021/02/22 节后第一个星期一中午的准午餐时间,节后综合症导致的吊儿郎当的神经还未绷紧,突然办公室内全面报警,很多服务都出现或多或少的异常,大家不约而同地说“我去,我的服务里阿里云的机器没有了”!!。
我的直觉告诉我这种批量操作不可能是误删,应该是程序或脚本引起的,赶紧联系阿里云审计日志中查下操作账号和源IP。结果是spinnaker账号在公司内网发起的请求。
因为spinnaker的版本最近没有变动过,所以我第一反应没有怀疑spinnaker而是怀疑鉴权泄露了,立马修改了API调用的鉴权,同时运维同事们把先前被删除的实例重新发布了一次。
然而一个多小时后,悲剧再次发生,这些机器又被删除了!当时有一种炸雷的感觉,只能怀疑是什么特殊情况下触发了spinnaker的BUG。
我唯一可以依据的数据就是spinnaker日志和阿里云操作审计日志,发现在两次故障时审计日志的表现都是出奇的相似:先调用了伸缩组查询接口、再调用了伸缩组disable接口、然后调用了伸缩组destroy接口,顺带干掉了伸缩组下的所有实例!!
顺着思路去review了clouddriver相关的代码,终于找到了一些眉目:spinnaker的阿里云实现部分在进行红黑发布或者Highland发布时会清理掉旧版本的弹性伸缩组,而清理ESS原子操作的逻辑如下:

DescribeScalingGroupsRequest describeScalingGroupsRequest = new DescribeScalingGroupsRequest();
describeScalingGroupsRequest.setScalingGroupName(description.getServerGroupName());
describeScalingGroupsResponse = client.getAcsResponse(describeScalingGroupsRequest);
try {for (ScalingGroup scalingGroup : describeScalingGroupsResponse.getScalingGroups()) {DeleteScalingGroupRequest deleteScalingGroupRequest = new DeleteScalingGroupRequest();deleteScalingGroupRequest.setScalingGroupId(scalingGroup.getScalingGroupId());deleteScalingGroupRequest.setForceDelete(true);client.getAcsResponse(deleteScalingGroupRequest);}
} catch (ServerException e) {log.info(e.getMessage());throw new AliCloudException(e.getMessage());
} catch (ClientException e) {log.info(e.getMessage());throw new AliCloudException(e.getMessage());
}

后续还有清理实例等一些列动作,跟阿里云审计日志中表现的一模一样。为了确定是这段代码造成的,我又去找到了引起这次故障的spinnaker操作记录,11:26分进行了一次删除操作,审计日志是从11:27开始删除所有伸缩组的。
定位了问题,后面就是跟阿里云方面一起排查了,厂家大方承认确实当天做了API接口的升级,使这个查询接口的“伸缩组名称”条件失效了,导致我拿到了多余的伸缩组,从而引发了一些列的问题。

反思

一切服务都是不可信的,我们一定要具备面向失败的编程思想。
其实这段代码还是考虑到异常如何处理的,例如获取不到或者请求异常时要如何处理,但对“失败”的可能性漏掉了查询条件失效这一点。所以我们在跨服务查询时,一定要对返回结果做好“是否满足过滤条件”的校验,只有这样才能避免本文这种类型的故障。

多云部署的优势

两次故障共删除阿里云上200多台机器,客户真实影响率只升高了不到2%,这么大的事故能有这种容错表现完全是靠公司的多云部署机制来实现的。
从内部服务到边缘服务甚至到APP客户端,都有多域名的重试机制,而且多云之间完全物理隔离,这样当其中一家云出现故障时服务自动重试到另一云厂商。这种架构设计必须要依赖一个强大的多云持续部署平台才能保证版本在多云上的正常发布,spinnaker就是为此而生!而且在此次故障阿里云200多台实例的恢复只用了20分钟左右,这也是依赖spinnaker的流水线。

一次因阿里云API引发的Spinnaker故障相关推荐

  1. 【阿里云API】 阿里云API调用的若干说明

    阿里云API 为了监控我们使用的一些阿里云产品,需要些一些脚本,定时调用这些脚本来获得相关阿里云产品的信息. ■ 概述 调用阿里云API大约分成两类方法,一个是直接从HTTP协议开始,自己根据阿里云的 ...

  2. 2021阿里云“API满意度”调研

    简介:只需花费几分钟,即有机会获得阿里云通用代金券. 4月,"阿里云API满意度有奖征集活动"已正式启动! 只需花费几分钟,进入评分页面为"阿里云API满意度" ...

  3. 阿里云 API 签名机制的 Python 实现

    在调用阿里云 API 的时候,最让人头疼的就是 API 的签名(Signature)机制,阿里云在通用文档中也有专项说明,但是仅仅有基于 Java 的实现代码示例.所以这里基于 Python 来分析下 ...

  4. 基于Python2.7的阿里云API调用及运维相关

    基于Python2.7的阿里云API调用及运维相关 http://blog.chinaunix.net/uid-17291169-id-5212576.html 公司部分业务放在阿里云上面,虽然阿里云 ...

  5. 阿里云API网关配置详解

    首先讲一下使用API网关的原因: 我想很多公司都因API或开放API的安全性感到苦恼吧,大部分公司都会自己的API进行加密处理,或token验证,可这就能防范,其他人抓取接口进行非法操作了吗?答案是肯 ...

  6. 浅析阿里云API网关的产品架构和常见应用场景

    自上世纪60年代计算机网络发展开始,API(Application Programming Interface )随之诞生,API即应用程序接口,是实现系统间衔接的桥梁.时至今日,API市场已经形成了 ...

  7. 阿里云API网关使用教程

    API 网关(API Gateway),提供API托管服务,涵盖API发布.管理.运维.售卖的全生命周期管理.辅助用户简单.快速.低成本.低风险的实现微服务聚合.前后端分离.系统集成,向合作伙伴.开发 ...

  8. 实现调用阿里云API第二章——API调用实战(全球IP地址归属地查询)

    本篇将实现利用springboot实现阿里云API调用实战. 一.购买阿里云API https://market.aliyun.com/data?spm=5176.9502607.1387859.3. ...

  9. 阿里云Api网关导入Swagger功能简介

    广告位 Api网关通过导入Swagger文件创建和更新Api的功能已经上线了,更多帅气功能会逐步推出 Api网关目标是让您发布应用更加便捷和安全,让您更直观.便捷的管理和调试您的所有Api接口 欢迎试 ...

最新文章

  1. 东北大学 计算机网络试题,东北大学秦皇岛分校计算机网络考试试卷(含答案)
  2. 错误类型3错误:活动类{}不存在
  3. python生成验证码
  4. 请领导审阅并提意见应怎么说_职场中,领导不喜欢你,暗中排挤你,怎么办?老员工给你支5招!...
  5. (20)System Verilog利用clocking块产生输出信号延迟激励
  6. Windows 系统必备软件
  7. hypersion oracle_Oracle Hyperion财务管理之合并报表
  8. python 定时任务框架APScheduler
  9. jq/js获取屏幕宽度和高度
  10. android 自定义locale,android – 以编程方式设置Locale
  11. 信息系统自动决策机制的使用
  12. iOS10开发哪些坑
  13. WaitGroup is reused before previous Wait has returned
  14. java实现zigzag扫描
  15. Ffmpeg中的文件格式
  16. 【pip】raise MaxRetryError(_pool, url, error or ResponseError(cause))
  17. java代码固定电话判断,Java 固话和手机归属地判断
  18. 网络安全:预防胜于治疗
  19. 银川水利学校计算机专业怎么样,黄河水利职业技术学院的计算机专业怎么样
  20. 双目立体视觉(双摄测距)

热门文章

  1. Android组件化实践2——经典组件化项目架构
  2. Python 处理ios国际化文件,从strings读取到excel表
  3. sessionStorage本地存储setItem与getItem
  4. Java之——数字金额转化为英文金额
  5. 深度神经网络检测方法,深度神经网络检测系统
  6. 理解JAVA Class文件,破解class文件的第一步
  7. python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
  8. VB.NET中的for循环
  9. 【CSS】常规属性汇总(必备收藏)
  10. docker 安装后无权限问题