混沌工程实践 - 使用 AWS Fault Injection Simulator 验证容错性

介绍使用 AWS Fault Injection Simulator(FIS)的混沌工程实践。介绍故障注入场景的设计、向 EC2 / ECS / RDS 注入故障以及安全推进实验的方法。

混沌工程的必要性与 FIS 的作用

生产环境的故障会在不可预测的时间发生。EC2 实例突然停止、可用区故障、网络延迟增大、数据库故障转移等,预先验证系统在这些故障下能否正确运行,就是混沌工程。这种方法源于 Netflix 开发的 Chaos Monkey,通过有意注入故障来验证系统的容错性。AWS Fault Injection Simulator(FIS)是 2021 年发布的托管混沌工程服务,以安全且受控的方式对 AWS 资源执行故障注入。无需自行构建 / 运维混沌工程工具,借助与 AWS 服务的原生集成,可以向 EC2 / ECS / EKS / RDS / ElastiCache / Systems Manager 等广泛的资源注入故障。

实验模板的设计

FIS 的实验通过实验模板定义。模板由操作(做什么)、目标(针对哪些资源)、停止条件(何时中止)3 个要素构成。操作的示例有 aws:ec2:stop-instances(停止 EC2)、aws:ec2:send-spot-instance-interruptions(模拟 Spot 中断)、aws:ssm:send-command(通过 SSM 施加 CPU/内存压力)、aws:ecs:stop-task(停止 ECS 任务)、aws:rds:failover-db-cluster(Aurora 的故障转移)、aws:fis:inject-api-internal-error(AWS API 的错误注入)。

{
  "description": "EC2 实例停止实验",
  "targets": {
    "ec2Instances": {
      "resourceType": "aws:ec2:instance",
      "resourceTags": {"Environment": "dev"},
      "selectionMode": "COUNT(1)"
    }
  },
  "actions": {
    "stopInstances": {
      "actionId": "aws:ec2:stop-instances",
      "parameters": {"startInstancesAfterDuration": "PT5M"},
      "targets": {"Instances": "ec2Instances"}
    }
  },
  "stopConditions": [
    {"source": "aws:cloudwatch:alarm", "value": "arn:aws:cloudwatch:ap-northeast-1:123:alarm:high-error-rate"}
  ],
  "roleArn": "arn:aws:iam::123:role/FISExperimentRole"
}

通过目标的 selectionMode 控制目标资源的选择方式。COUNT(1) 只选择 1 个,PERCENT(50) 以 50% 的资源为对象。可以通过基于标签的过滤限定实验对象。

安全推进实验的方法

混沌工程中最重要的是确保安全性。FIS 提供多种安全机制。停止条件(Stop Conditions)监控 CloudWatch 告警,当错误率或延迟超过阈值时自动停止实验。由此防止实验对生产服务造成过度影响。通过 IAM 角色将实验的权限限制到最小,防止影响实验对象以外的资源。逐步扩大实验也是重要的实践。首先在 dev 环境从小规模的实验(停止 1 个实例)开始,验证结果后再扩大对象。接着在 stg 环境以接近生产的条件进行实验,最终在生产环境实施有限的实验。在实验前建立假设(“即使 1 台 EC2 停止,ALB 也会自动分配流量,错误率应该保持在 1% 以下”)也很重要,假设不成立时,系统的改进点就会变得明确。

实用的实验场景

下面介绍代表性的实验场景。在 可用区故障的模拟中,同时停止特定可用区内的 EC2 实例,验证多可用区配置的 Auto Scaling 是否正确运行。在网络延迟的注入中,通过 SSM 执行 tc(traffic control)命令,增加特定实例的网络延迟。可以确认微服务之间的通信是否通过超时和重试得到正确处理。在 RDS 故障转移中,执行 Aurora 集群的故障转移,验证应用程序是否自动重新连接到新的写入端点。在 Spot 实例的中断模拟中,模拟 2 分钟前的中断通知,确认应用程序的优雅关闭是否正确运行。费用为实验操作执行时间每分钟 0.10 美元,5 分钟的实验为 0.50 美元(截至 2026 年 8 月)。

FIS 的费用

Fault Injection Simulator 按操作分钟数计费。每操作分钟约 0.10 美元,执行 10 个操作 30 分钟约为 30 美元。目标资源(EC2、ECS、RDS)的费用照常产生。创建和保存实验模板不产生额外费用。生产环境中的实验通过限定影响范围并设计为在短时间内完成,来管理成本和风险。

总结 - FIS 的运用方针

AWS Fault Injection Simulator 是以托管服务的形式提供混沌工程、安全验证系统容错性的工具。借助停止条件的自动停止、IAM 的权限限制以及实验的逐步扩大,可以安全地实践混沌工程。建议首先在 dev 环境从停止 EC2 和注入网络延迟开始,循环推进发现 / 改进系统弱点的过程。站在故障必然会发生的前提上,预先进行验证,就能将生产故障时的影响控制在最小限度。

参考资料(AWS 官方)

本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。

如本页内容与官方文档不一致,请以官方文档为准。

分享