掌握 AWS 故障排除工作流程的专家指南
使用可重复的 AWS 故障排除工作流程,结合 CloudWatch、CloudTrail、VPC 流日志、AWS Config 和 Systems Manager。
掌握 AWS 故障排除工作流程的专家指南
当您每次都遵循相同的工作流程时,AWS 故障排除会变得更容易:定义症状、缩小范围、检查最近的更改、检查日志和指标,然后一次测试一个可能的原因。如果没有这种结构,很容易在 CloudWatch、IAM、VPC 设置和应用程序日志之间来回切换,而无法证明任何问题。
本指南为您提供了一个实用的 AWS 故障排除工作流程,并展示了 CloudWatch、CloudTrail、AWS Config、VPC 流日志和 Systems Manager 的适用场景。
核心 AWS 故障排除工作流程
有效的故障排除工作流程不是一系列随机操作,而是一种结构化的方法,指导您从问题检测到解决和预防。采用可重复的过程可确保一致性、减轻压力并加速事件解决。
1. 定义问题:收集初始信息
第一步是清楚地了解发生了什么。避免做出假设。尽可能多地收集客观信息。
- 症状:具体是什么失败或行为异常?(例如,“API 调用超时”、“网站返回 5xx 错误”、“EC2 实例无法访问”)。
- 范围:问题有多广泛?(例如,单个实例、特定应用程序、整个区域、特定用户)。它是否影响生产、预发布或开发环境?
- 影响:业务影响是什么?(例如,收入损失、客户不满、安全风险)。
- 最后已知正常状态:它上次正常工作是什么时候?
- 错误消息:收集来自应用程序、浏览器控制台或直接 AWS 服务响应的任何错误消息。
提示:鼓励用户或系统提供具体的错误消息和时间戳。这些数据非常宝贵。
2. 验证范围:隔离受影响的组件
一旦定义了问题,缩小潜在的爆炸半径。这有助于您集中调查工作。
- AWS 运行状况:检查您账户中的 AWS 运行状况和公共 AWS 状态页面,以了解正在进行的区域性问题。广泛的服务事件通常可以解释许多症状。
- 隔离资源:如果 Web 服务器宕机,是只有一个 EC2 实例还是所有实例?数据库是否可以从其他实例访问?
- 复现:问题是否可以持续复现?如果可以,在什么条件下?
3. 审查最近的更改:识别潜在触发因素
大多数问题都是由更改触发的。这通常是解决问题的最快途径。
- 部署更改:新的代码部署、基础设施即代码 (IaC) 更新。
- 配置更改:安全组修改、IAM 策略更新、负载均衡器设置、数据库参数组。
- 扩展事件:自动扩展活动、服务的手动扩展。
- AWS CloudFormation / Terraform:审查最近的堆栈更新或资源更改。
工具亮点:AWS CloudTrail 是您的主要工具,显示谁、何时、从何处执行了什么操作。
4. 利用 AWS 监控工具:深入挖掘数据
这是您利用 AWS 原生可观测性工具收集经验证据的地方。
- Amazon CloudWatch:用于指标、日志和告警。
- AWS CloudTrail:用于 API 活动和更改历史。
- VPC 流日志:用于网络流量分析。
- AWS Config:用于配置历史和合规性。
- 应用程序日志:来自在 EC2、ECS、Lambda 等上运行的应用程序的日志。
5. 制定并测试假设:提出并验证理论
根据收集的数据,提出一个或多个关于根本原因的假设。然后,系统地测试每一个。
- 示例假设:“EC2 实例无法访问,因为其安全组不允许入站 SSH 流量。”
- 测试:检查安全组规则。如有必要,临时修改它们(谨慎操作并制定回滚计划),以查看连接是否恢复。
6. 实施并验证解决方案:应用修复并确认解决
一旦假设得到确认,应用修复。小心操作,如果可能,先在受控环境中进行。
- 修复:更新 IAM 策略、重新配置安全组、回滚代码部署、扩展服务。
- 验证:确保原始症状消失,并且没有引入新问题。修复后监控相关指标和日志。
7. 记录并学习:改进未来的故障排除
每个事件都是一次学习机会。记录问题、调查步骤、解决方案和预防措施至关重要。
- 事件报告:创建简要报告,详细说明时间线、症状、根本原因、解决方案和经验教训。
- 知识库:添加到团队的知识库中,供将来参考。
- 预防措施:实施监控、告警或架构更改以防止再次发生。
- 事后分析:进行无指责的事后分析,以识别系统性弱点。
关键 AWS 故障排除工具详解
AWS 提供了一套强大的工具来帮助进行故障排除。了解它们的优势是关键。
Amazon CloudWatch
CloudWatch 以日志、指标和事件的形式收集监控和操作数据。它对于了解 AWS 资源和应用程序的运行状况和性能至关重要。
- 指标:可视化性能数据(CPU 利用率、网络 I/O、磁盘操作、数据库连接、Lambda 调用/错误)。为您的应用程序创建自定义指标。
- 日志:集中来自 EC2 实例(CloudWatch 代理)、Lambda 函数、VPC 流日志、CloudTrail 日志等的日志。使用 CloudWatch Logs Insights 进行强大的查询。
- 告警:在指标上设置阈值,以在出现问题时触发通知(SNS、Lambda)。
实际示例:调查无响应的 EC2 实例
- 检查 EC2 实例状态检查:在 EC2 控制台中,查看实例的状态检查(系统状态和实例状态)。如果任何一个失败,这是一个强烈的指示。
- CloudWatch 指标:导航到该实例的 CloudWatch 指标。
CPUUtilization:CPU 是否持续处于 100%?NetworkIn/NetworkOut:是否存在意外流量或突然下降?DiskReadOps/DiskWriteOps:磁盘 I/O 是否饱和?StatusCheckFailed_Instance/StatusCheckFailed_System:如果检查失败,这些指标将为1。
- CloudWatch 日志:如果配置了 CloudWatch 代理,请检查
/aws/ec2/instance_id/以获取应用程序或系统日志(例如syslog、nginx_access_log)。使用 CloudWatch Logs Insights 查询错误或特定事件。
# 示例 CloudWatch Logs Insights 查询,用于在 EC2 实例日志中查找错误
fields @timestamp, @message
| sort @timestamp desc
| filter @message like /ERROR|FAIL|EXCEPTION/ and @logStream = 'i-0abcdef1234567890'
| limit 50
AWS CloudTrail
CloudTrail 记录在您的 AWS 账户中进行的 API 调用,提供用户、角色或 AWS 服务所执行操作的历史记录。它对于安全审计、合规性以及最重要的故障排除更改至关重要。
- 事件历史:查看管理事件的历史记录(例如
RunInstances、AuthorizeSecurityGroupIngress、UpdateFunctionConfiguration)。 - 数据事件:配置跟踪以记录 S3 对象、Lambda 函数调用等的数据平面操作。
实际示例:诊断 IAM 权限错误(Access Denied)
应用程序或用户在尝试执行 AWS 操作(例如 s3:GetObject)时收到“Access Denied”错误。
- 识别失败的操作:哪个特定的 AWS API 调用失败?
- 转到 CloudTrail 事件历史:按以下条件过滤事件:
- 事件名称:确切的 API 调用(例如
GetObject)。 - 用户名:进行调用的 IAM 用户或角色。
- 事件源:涉及的 AWS 服务(例如
s3.amazonaws.com)。 - 时间范围:错误发生的时间附近。
- 事件名称:确切的 API 调用(例如
- 检查事件详细信息:查找带有
errorCode: "AccessDenied"的事件。errorMessage字段通常提供有关缺少的特定权限或资源策略违规的线索。requestParameters字段显示传递的参数,例如 S3 存储桶或键。userIdentity字段确认谁尝试了该操作。
这将精确定位哪个用户或角色尝试对哪个资源执行哪个操作,并因权限而失败,从而允许您修改相关的 IAM 策略或资源策略。
AWS Config
AWS Config 提供您的 AWS 资源、其配置以及它们随时间变化的详细清单。它可以评估配置更改是否符合所需设置。
- 配置历史:查看资源配置如何更改(例如,何时添加或删除了安全组规则,或修改了 S3 存储桶策略)。
- 合规性:定义规则以检查资源配置是否符合最佳实践或法规要求。
用例:如果应用程序突然失去对数据库的访问权限,您可以使用 AWS Config 检查数据库的安全组最近是否被修改,从而可能撤销对应用程序实例的访问权限。
VPC 流日志
VPC 流日志捕获进出 VPC 中网络接口的 IP 流量信息。它们对于网络连接问题非常宝贵。
- 流量分析:识别被阻止的流量(REJECT 操作)、意外连接或进出特定 IP 的大量流量。
- 排查连接问题:确定安全组、NACL 或路由表是否阻止了合法流量。
用例:您的 EC2 实例无法连接到外部 API。检查流日志中从实例 ENI 到 API IP 地址的 REJECT 条目,这可能表明安全组或 NACL 限制性过强。
AWS Systems Manager
Systems Manager 提供了一个统一的界面来查看来自多个 AWS 服务的操作数据并自动化操作任务。用于故障排除的关键组件包括:
- Session Manager:无需打开入站端口(如 SSH 端口 22)即可安全地通过 Shell 访问 EC2 实例,从而降低安全风险并简化访问。
- Run Command:在 EC2 实例上远程执行脚本或命令,以收集诊断数据或应用修复(例如,重启服务、检索日志)。
- Automation:创建运行手册以自动化常见的故障排除和修复步骤。
常见的 AWS 故障排除场景和解决方案
连接问题
连接问题很常见,可能源于各种网络组件。
- 安全组:充当 EC2 实例的虚拟防火墙。检查入站和出站规则中的所需端口和 IP 范围。
- 网络访问控制列表 (NACL):子网级别的无状态防火墙。查看入站和出站规则,注意规则顺序和显式
DENY规则。 - 路由表:确保存在正确的路由,以便流量到达其目的地(例如,用于公共流量的互联网网关、用于私有实例访问互联网的 NAT 网关、用于 VPC 间通信的 VPC 对等)。
- DNS 解析:验证实例是否可以解析主机名。检查 VPC DNS 设置和任何自定义 DNS 服务器。
- 子网 CIDR 重叠:如果使用 VPC 对等或 VPN,请确保没有重叠的 CIDR 块。
权限错误(访问被拒绝)
当 IAM 主体(用户、角色)尝试执行没有必要权限的操作时,会发生这些错误。
- IAM 策略:最常见的罪魁祸首。检查附加到用户或角色的 IAM 策略。使用 IAM 策略模拟器测试特定操作和资源。
- 资源策略:对于 S3、SQS、KMS 和 ECR 等服务,资源策略定义了谁可以访问该资源。确保调用主体在此处被授予访问权限。
- 服务控制策略 (SCP):如果使用 AWS Organizations,SCP 可能会在账户或 OU 级别限制操作。
- 权限边界:一个高级 IAM 功能,可以限制 IAM 实体可以拥有的最大权限。
- 会话策略:临时策略,可以覆盖或限制身份的有效权限。
服务限制和限流
AWS 服务有软限制和硬限制。达到这些限制可能会导致服务降级或故障。
- 监控限制:通过 AWS Service Quotas 控制台定期检查您的服务配额。为接近关键限制的指标创建 CloudWatch 告警。
- 请求增加:大多数软限制可以通过向 AWS 提交支持工单来增加。
- 限流:当调用速率超过预置容量或突发限制时,Lambda、DynamoDB 和 API Gateway 等服务可能会限制请求。在日志中查找
TooManyRequestsException或ThrottlingException错误。 - 扩展:确保您的自动扩展组、ECS 服务或数据库只读副本配置为根据需求充分扩展。
主动故障排除的最佳实践
预防总是胜于治疗。实施这些实践以最大限度地减少事件并加快解决速度。
- 实施强大的监控和告警:为关键指标、系统运行状况和应用程序错误配置 CloudWatch 告警。与通知系统(SNS、Slack、PagerDuty)集成。
- 集中式日志记录:将所有应用程序和基础设施日志整合到 CloudWatch 日志或专用日志记录解决方案(例如,EC2/ECS 上的 ELK 堆栈、Datadog、Splunk)中。
- 基础设施即代码 (IaC):使用 CloudFormation、Terraform 或 CDK 管理您的基础设施。这提供了版本控制并简化了回滚。
- 最小权限原则:仅授予用户和角色必要的权限。这减少了潜在安全事件的爆炸半径,并简化了权限故障排除。
- 定期审查 IAM 策略:定期审计 IAM 策略,查找过度宽松的语句或未使用的权限。
- 了解服务限制:了解您所在区域和账户的默认服务配额。针对预期的增长主动请求增加。
- 自动化常见任务:使用 AWS Systems Manager Automation 或 Lambda 函数自动化常见问题的诊断检查和修复。
- 标记策略:为所有资源实施一致的标记策略。这有助于组织、成本分配以及在故障排除期间过滤资源。
- 实践事件响应:定期进行关键事件的演练。这有助于团队在压力下熟悉工作流程和工具。
关键要点
良好的 AWS 故障排除是有纪律的,而不是疯狂的。定义问题,检查范围和最近的更改,使用正确的 AWS 数据源,并记录修复方法,以便下一次事件能更快解决。