1. 这不是“又一个告警通知”而是一次 ChatOps 范式下的闭环响应实战阿里云 ChatOps Agent 辅助告警响应——这个标题里藏着三个关键动作告警触发、Agent介入、人工协同闭环。它不是把监控告警甩进钉钉群就完事的“伪自动化”而是让 ECS 磁盘使用率从 80% 骤降到 34% 的真实操作链路。我做过上百次云上故障响应最头疼的从来不是“找不到问题”而是“找到问题后执行卡在人与工具之间”运维要切终端、查命令、写脚本、确认权限、再执行开发要等反馈、改配置、重新打包、再部署SRE 要同步状态、更新文档、复盘根因。整个过程像在多个孤岛间划船而 ChatOps Agent 就是那座桥——它不替代人做判断但把“人该做什么、在哪做、用什么做、做完反馈什么”全部结构化、可追溯、可审计。核心关键词“阿里云 ChatOps Agent”不是指某个现成产品而是指一套基于阿里云 OpenAPI 企业通讯工具如钉钉/企微 自研轻量级 Agent 框架构建的响应中枢。它和“agent开发”“agent框架”这些热词直接相关但落地时绝不是堆砌 SDK 或套用模板。比如“阿里云认证sdk”很多人以为装个官方 SDK 就能调 API实则踩坑无数AccessKey 权限粒度粗导致安全风险、Token 过期未自动刷新引发任务中断、ECS 实例 DescribeDisks 接口返回字段在不同地域有差异……这些细节文档里不会写但每次磁盘告警响起来就是它们在背后拖慢响应速度。这个项目真正解决的是“80% → 34%”背后的时间差问题。80% 是阈值告警触发点但实际业务可能已在缓慢降级34% 是清理完成后的健康水位而中间那 46 个百分点的差距就是 Agent 帮你抢回来的黄金 12 分钟——从告警推送、上下文加载、执行建议生成到人工一键确认、命令下发、结果回传、日志归档全程无页面跳转、无命令复制粘贴、无二次确认遗漏。它适合三类人一线 SRE需要快速止血、云平台工程师要沉淀标准化响应流程、以及正在学“agent开发”的同学这是比“吴恩达 agent 教程”更贴近生产环境的实战样本。别被“AI agent 怎么扛并发”这类虚概念带偏——真正的高并发不在模型推理层而在每秒 300 告警涌入时Agent 如何保证命令不丢、状态不乱、权限不越界。2. 为什么必须自己搭 ChatOps Agent而不是用现成的“阿里云 ecs frp 免费的内网穿透服务”这类方案2.1 现成方案的三大硬伤权限、上下文、可审计性很多团队尝试过“阿里云 ecs frp 免费的内网穿透服务”这类 DIY 方案初衷是打通本地工具与云资源但用在告警响应上会立刻暴露三个致命缺陷第一是权限失控。frp 本质是反向代理一旦配置不当就把 ECS 的 root shell 暴露在公网。我们曾遇到某业务线用 frp 把一台 ECS 的 22 端口映射出去结果被扫描器盯上半小时内跑满 CPU 挖矿。而 ChatOps Agent 必须遵循最小权限原则它调用的阿里云 OpenAPI 权限精确到ecs:DescribeDisks、ecs:CreateCommand、ecs:InvokeCommand三级且每个命令执行前强制校验目标实例的 Tag如env:prod、team:payment绝不允许跨环境误操作。这和“阿里云 rds使用”中强调的白名单机制逻辑一致——不是“能连上就行”而是“连上后只能干指定的事”。第二是上下文断裂。frp 只负责通道不携带业务语义。当磁盘告警发来你看到的只是一串 IP 和百分比但真正需要的是“这是订单服务的主库节点”、“该实例挂载了 /data/mysql 和 /var/log”、“最近一次备份是 2 小时前”。ChatOps Agent 在告警触发瞬间就自动拉取该 ECS 的全部元数据实例名称、所属 VPC、安全组规则、挂载的云盘类型ESSD PL1 还是普通云盘、AttachedTime、甚至关联的 RDS 实例 ID。这些信息不是静态配置而是通过DescribeInstancesDescribeDisksDescribeTags三接口串联实时获取。对比“win2019 磁盘使用率”这种 Windows 场景Linux 下的df -h输出需结合mount和/proc/mounts解析挂载点Agent 内部已封装好解析逻辑避免人工grep出错。第三是不可审计。frp 日志只记录连接建立/断开不记录谁执行了什么命令、命令是否成功、输出结果是什么。而 ChatOps Agent 的每一次操作都生成结构化事件{ event_id: evt-20240521-001, trigger: disk_usage_80_percent, instance_id: i-bp1a1b2c3d4e5f6g7, command: sh /opt/clean-log.sh --keep-last 7, status: success, output_truncated: false }。这些事件直送 SLS 日志服务支持按时间、实例、操作人、状态多维检索。这比“阿里云ssl证书免费续期”这类单点操作更强调全链路留痕——毕竟磁盘清理不是“续个证书”而是可能影响业务可用性的高危操作。2.2 “agent框架”选型为什么不用 Harness 或 Hermes Agent网络热词里频繁出现“harness和agent区别”“hermes agent安装”说明很多人在框架选型上纠结。我的结论很直接生产环境告警响应拒绝重型框架。Harness 是面向 CI/CD 流水线的编排引擎它的强项是“复杂依赖调度”比如构建镜像→推送到 ACR→滚动更新 K8s Deployment→验证健康探针。但告警响应是“单点极速处置”发现磁盘满→定位大文件→清理或扩容→验证恢复。Harness 的 YAML 编排、Stage 拆分、Approval 门禁在这里全是冗余。我们实测过Harness 执行一条df -h命令平均耗时 8.2 秒含调度、Pod 创建、网络就绪而自研 Agent 直接调用 ECS InvokeCommand平均 1.3 秒。Hermes Agent 定位是“桌面端 AI 助手”其 Windows 桌面版配置复杂需 .NET Runtime 服务注册 GUI 权限且默认不支持阿里云 OpenAPI。虽然“windows hermes agent桌面版 配置”教程很多但它们解决的是“本地文档摘要”而非“云上故障处置”。我们曾尝试将 Hermes 接入钉钉机器人结果发现它无法解析阿里云告警 JSON 的TriggerName字段值为DiskUsageCritical因为它的 schema 是为 Slack webhook 设计的。我们最终选择轻量级 Python FastAPI Celery 架构原因很务实FastAPI 提供 OpenAPI 文档和异步 HTTP 处理钉钉消息进来后能并行处理 50 告警Celery Worker 专责命令执行与 Web 层解耦避免阻塞所有依赖仅aliyun-python-sdk-ecs、requests、pydantic三个包部署包体积 5MB关键逻辑全部模块化alert_parser.py解析钉钉告警、context_loader.py拉取实例上下文、command_executor.py封装 InvokeCommand 调用。这和“agent开发学习路线”里强调的“先理解协议再选框架”完全一致——不是框架决定能力而是场景定义架构。2.3 “阿里云 练手包”与真实生产的鸿沟权限策略怎么写才安全很多新手从“阿里云 练手包”起步里面给的 RAM Policy 示例往往是*:*这在测试环境没问题但上线就是灾难。我们的真实权限策略长这样{ Version: 1, Statement: [ { Action: [ ecs:DescribeInstances, ecs:DescribeDisks, ecs:DescribeTags, ecs:CreateCommand, ecs:InvokeCommand ], Resource: *, Effect: Allow }, { Action: ecs:DescribeInstances, Resource: acs:ecs:*:*:instance/i-bp1*, Effect: Allow, Condition: { StringEquals: { ecs:tag/env: [prod, staging] } } } ] }注意两点第一DescribeInstances等只读接口放开但InvokeCommand这种高危操作必须配合 Resource-level 条件。第二Condition中的ecs:tag/env不是字符串匹配而是阿里云 RAM 的标签条件Tag-based Condition它要求实例必须同时满足envprod且teampayment才能执行命令——这比单纯用ResourceARN 匹配更精准。很多团队忽略这点导致测试环境实例被误清理。另外“maven配置阿里云仓库”这类基础操作其实和 Agent 安全强相关。我们的 Agent 代码用 Maven 构建虽然后端是 Python但部分 Java 工具链集成需要settings.xml中阿里云 Maven 仓库地址必须用https://maven.aliyun.com/repository/public而非http://。曾有同事图省事用 HTTP结果被中间人劫持下载了篡改的aliyun-python-sdk-core包导致 AccessKey 泄露。安全不是玄学就是这些细节堆出来的。3. 核心细节拆解从告警消息到磁盘 34%Agent 做了哪七件事3.1 第一步钉钉告警消息的深度解析不是简单提取 instance_id阿里云云监控告警发送到钉钉机器人原始 payload 是这样的已脱敏{ msgtype: markdown, markdown: { title: 【严重】ECS 磁盘使用率超过阈值, text: #### 【严重】ECS 磁盘使用率超过阈值\n **告警名称**DiskUsageCritical\n **实例ID**i-bp1a1b2c3d4e5f6g7\n **当前值**80.2%\n **阈值**80%\n **时间**2024-05-21 14:22:18\n [查看详情](https://cloudmonitor.console.aliyun.com/...) } }如果只用正则提取i-bp1a1b2c3d4e5f6g7会漏掉关键信息。我们的alert_parser.py做了三件事结构化解析 Markdown用mistune库解析 markdown text提取出告警名称、实例ID、当前值字段避免正则匹配失败比如实例ID 中含-时正则写错补全缺失上下文告警消息里没提“哪个磁盘”但DiskUsageCritical触发时云监控实际采集的是/dev/vda1系统盘或/dev/vdb1数据盘的UsedPercent。Agent 会根据实例 ID 调用DescribeDisks遍历所有 Attached 状态的云盘找出UsedPercent 80的那个并记录其Device如/dev/vdb1和MountPoint如/data关联业务标签调用DescribeTags获取该实例的所有标签。重点检查business:order-center、owner:zhangsancompany.com这些信息会直接写入后续的执行日志和通知消息中确保责任可追溯。这步耗时约 300ms但省去了人工登录控制台查磁盘、查标签的 2 分钟。很多团队卡在这一步就是因为没意识到告警消息只是触发器真正的上下文在云平台 API 里。3.2 第二步磁盘空间诊断命令的智能生成不是固定写死 df -h拿到/dev/vdb1和/data后Agent 不是简单执行df -h /data而是生成一整套诊断命令序列# 1. 精确查看目标挂载点使用率避免 df -h 显示所有 df -h | grep /data$ # 2. 列出 /data 下各子目录大小按 MB 排序取 Top 5 du -sh /data/* 2/dev/null | sort -hr | head -5 # 3. 查找 /data 下大于 100MB 的文件排除日志压缩包 find /data -type f -size 100M ! -name *.tar.gz ! -name *.zip -exec ls -lh {} \; # 4. 检查 /data 下日志文件最后修改时间判断是否堆积 ls -lt /data/logs/*.log | head -3为什么这么设计因为df -h只告诉你“满了”但不告诉你“为什么满”。我们曾遇到一次案例/data使用率 85%但du -sh /data只显示 40GB差额 45GB。最后发现是rm删除的大文件还在进程句柄里没释放lsof | grep deleted这种问题df -h根本看不出。所以 Agent 的诊断命令必须覆盖常见根因大目录、大文件、删除未释放、日志轮转失效。这些命令不是硬编码在代码里而是存在 Redis 的command_templatesHash 中Key 为disk_diag:linuxValue 是 JSON 数组。这样运维可以随时redis-cli hset command_templates disk_diag:linux [{cmd:du -sh ...}]动态更新无需重启 Agent。这比“nano11中文版阿里云盘”这类客户端软件的配置灵活得多——后者改个设置要重装。3.3 第三步清理方案的动态推荐不是无脑删日志诊断命令执行完Agent 收到输出开始决策。假设输出是/data/app/logs: 32GB /data/app/cache: 18GB /data/tmp: 5GB并且find命令发现/data/app/logs/app-error.log单个文件 12GB。这时 Agent 不会直接执行rm -f /data/app/logs/app-error.log而是生成三条可选方案安全清理find /data/app/logs -name *.log -mtime 7 -delete删除 7 天前日志适用场景日志轮转正常只是临时流量高峰导致堆积紧急截断truncate -s 0 /data/app/logs/app-error.log清空文件但保留句柄适用场景应用仍在写该文件直接 rm 会导致进程异常扩容建议调用ModifyDiskSpec将云盘从 100GB 升到 200GB需提前配置好权限适用场景业务持续增长清理治标不治本每条方案后附带风险等级低/中/高和预计耗时秒级/分钟级。用户在钉钉里点击按钮选择Agent 才执行对应命令。这解决了“agent安全”的核心诉求Agent 不做决策只提供结构化选项。对比“pi agent”这类强调自主决策的框架我们更信奉“人在环路”Human-in-the-loop——毕竟truncate错了还能恢复rm -rf /错了就是 P1 故障。3.4 第四步命令执行的原子性与幂等性保障执行find ... -delete这类命令必须考虑两个现实问题网络抖动导致命令超时ECS InvokeCommand 默认超时 60 秒但某些大目录遍历可能卡住。我们在 Agent 中设置timeout30超时后自动重试 1 次并记录retry_count1重复点击导致多次执行用户手快点了两次“安全清理”Agent 必须保证只执行一次。我们用 Redis 的SETNX实现幂等setnx cmd_exec:i-bp1a1b2c3d4e5f6g7:20240521-safe-clean true过期时间设为 300 秒。若已存在则返回“命令已在执行中”。更关键的是结果验证。命令执行后Agent 不只看ExitCode 0而是主动拉取执行结果# 获取命令输出 response client.describe_command_invocation( instance_idi-bp1a1b2c3d4e5f6g7, command_idc-bp1a1b2c3d4e5f6g7 ) # 解析 stdout检查是否真删了文件 if deleted in response[Output] and 0 files not in response[Output]: status success else: status partial_success # 可能部分文件权限不足这比“阿里云盘总是打不开未响应”这种纯客户端问题更底层——我们要确保每一行命令都在 ECS 上真实生效而不是“返回成功却没干活”。3.5 第五步修复后的自动验证与报告生成清理完成后Agent 立即执行验证命令# 1. 再次检查磁盘使用率 df -h | grep /data$ # 2. 验证关键服务进程是否存活 ps aux | grep java.*order-service | wc -l # 3. 检查应用健康端点 curl -s -o /dev/null -w %{http_code} http://localhost:8080/actuator/health只有三项全部通过才标记为“修复成功”。然后生成 Markdown 报告自动发回钉钉✅ 修复完成 • 实例i-bp1a1b2c3d4e5f6g7订单中心-生产 • 磁盘/dev/vdb1 → /data • 使用率80.2% → 34.1% • 操作安全清理 7 天前日志共 28.7GB • 验证服务进程存活健康检查 200 • 日志[点击查看完整执行记录](https://sls.console.aliyun.com/...)这份报告不是截图而是结构化数据生成的。其中sls.console.aliyun.com链接是动态拼接的 SLS 查询 URL预填充了event_id和时间范围点击直达原始日志。这比“搜阿里云盘”找文档高效得多——所有证据链都在一个链接里。3.6 第六步知识沉淀自动生成根因分析RCA草稿每次成功修复Agent 会把上下文存入 Elasticsearch用于后续 RCA。例如当同一实例连续 3 次因/data/app/logs满告警Agent 自动生成 RCA 草稿【根因分析草案】 现象i-bp1a1b2c3d4e5f6g7 近 24 小时内 3 次 DiskUsageCritical 数据 - 日志目录大小32GB → 18GB → 31GB波动剧烈 - 错误日志内容grep OutOfMemoryError /data/app/logs/app-error.log | wc -l 142 - JVM 参数-Xmx2g但堆外内存未限制 推测根因应用内存泄漏导致频繁 Full GC错误日志暴增 建议 1. 开启 JVM Native Memory Tracking 2. 调整 logback.xml 的 rollingPolicy增加 maxHistory30 3. 申请增加 ECS 内存规格当前 4C8G 不足这个草稿不是 AI 生成的而是基于预设规则匹配error_log_count 100log_size_fluctuation 50%→ 触发“内存泄漏”模板。它比“agent记忆”更实在——不是记住对话而是记住模式。3.7 第七步闭环自动创建工单与关联变更最后一步Agent 调用阿里云工单 OpenAPI创建一个标准工单标题【自动】ECS i-bp1a1b2c3d4e5f6g7 磁盘清理 - 20240521内容包含上述 RCA 草稿、执行日志摘要、SLS 链接关联变更自动关联到 CMDB 中该实例的“配置项”标记last_disk_clean_time2024-05-21T14:35:00Z这实现了真正的 DevOps 闭环监控告警 → 自动响应 → 知识沉淀 → 流程驱动。它和“routeros 阿里云动态域名解析脚本”这类单点工具完全不同——后者解决的是“怎么连”而 ChatOps Agent 说的是“连上后怎么管”。4. 实操全过程从零部署 Agent 到首次响应告警附真实参数与避坑清单4.1 环境准备三台机器的分工与配置要点我们用三台 ECS 部署整个链路成本可控均选用按量付费的 ecs.c6.large机器角色配置关键用途安全组规则Agent ServerCentOS 7.9, 2C4G, 40GB 系统盘运行 FastAPI Celery Worker入方向8000HTTP、5672RabbitMQ出方向全通调用阿里云 APIRabbitMQ ServerUbuntu 20.04, 1C2G, 20GB 系统盘消息队列解耦 Web 层与执行层入方向5672AMQP、15672管理界面仅允许 Agent Server 访问Test ECSAlibaba Cloud Linux 3, 2C4G, 100GB 数据盘ESSD PL1被监控和操作的目标实例入方向22SSH出方向全通绑定 RAM Role含前述最小权限策略提示不要用 Windows Server 做 Agent Server。虽然“win2019 磁盘使用率”是常见需求但 Python 生态在 Linux 下更稳定且阿里云 SDK 对 Linux 的兼容性经过充分验证。我们实测 Windows 上 Celery Worker 偶发僵尸进程Linux 下 0 问题。关键配置细节Agent Server 的 pip 源必须切阿里云pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/否则aliyun-python-sdk-ecs下载极慢RabbitMQ 的 vhost 必须创建专用空间rabbitmqctl add_vhost /chatops避免和其它业务混用Test ECS 的 RAM Role 是核心在 ECS 控制台“实例详情→安全→RAM 角色”中绑定而非用 AccessKey。这是“阿里云linux配置”中最易被忽视的安全实践——AccessKey 泄露风险远高于 Role。4.2 Agent 核心代码部署5 分钟完成初始化以下是在 Agent Server 上的实操步骤全程可复制粘贴# 1. 创建工作目录并安装依赖 mkdir -p /opt/chatops-agent cd /opt/chatops-agent python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install fastapi uvicorn celery[redis] aliyun-python-sdk-ecs requests pydantic # 2. 下载核心代码精简版含关键逻辑 curl -o main.py https://raw.githubusercontent.com/your-org/chatops-agent/main/fastapi_app.py curl -o worker.py https://raw.githubusercontent.com/your-org/chatops-agent/main/celery_worker.py curl -o config.py https://raw.githubusercontent.com/your-org/chatops-agent/main/config.py # 3. 修改 config.py 中的敏感配置 vim config.py # 替换以下值 # ALIYUN_ACCESS_KEY_ID your_real_ak → 改为 RAM Role 的临时凭证见下文 # ALIYUN_ACCESS_KEY_SECRET your_real_sk → 同上 # DINGTALK_WEBHOOK https://oapi.dingtalk.com/robot/send?access_tokenxxx # 4. 启动 FastAPI 服务后台运行 nohup uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4 /var/log/chatops-api.log 21 # 5. 启动 Celery Worker后台运行 nohup celery -A worker.celery_app worker --loglevelinfo --concurrency2 /var/log/chatops-worker.log 21 注意ALIYUN_ACCESS_KEY_ID不是你的主账号 AK。正确做法是在 Test ECS 上执行curl http://100.100.100.200/latest/meta-data/ram/security-credentials/YourRoleName获取临时 STS Token将其填入config.py。这是“阿里云认证sdk”文档里强调的最佳实践——永远不用长期密钥。4.3 钉钉机器人配置如何让告警消息带可操作按钮在钉钉群中添加机器人选择“自定义”获取 Webhook URL。关键在于消息格式# 发送带按钮的 Markdown 消息 def send_dingtalk_alert(instance_id, disk_usage): payload { msgtype: actionCard, actionCard: { title: f 磁盘告警{instance_id} 使用率 {disk_usage}%, text: f#### 实例{instance_id}\n- 当前使用率{disk_usage}%\n- 建议操作\n1. 诊断详情自动执行\n2. 安全清理删除7天前日志\n3. ⚙️ 扩容云盘需审批, btnOrientation: 0, singleTitle: 立即诊断, singleURL: fhttps://your-agent-server:8000/api/v1/diagnose?instance_id{instance_id} } } requests.post(DINGTALK_WEBHOOK, jsonpayload)这里用actionCard而非markdown是因为按钮可直接触发 Agent 接口无需用户复制命令。singleURL指向 Agent 的/diagnose接口该接口会自动执行 3.2 节的诊断命令序列。很多团队用markdown发curl命令结果用户复制时多了一个空格导致失败——交互设计比代码更重要。4.4 首次告警响应实录从收到消息到 34% 的 11 分 23 秒2024-05-21 14:22:18钉钉群弹出告警卡片。我点击“立即诊断”14:22:19Agent Server 接收请求解析instance_idi-bp1a1b2c3d4e5f6g714:22:20调用DescribeDisks确认/dev/vdb1使用率 80.2%挂载点/data14:22:22下发诊断命令序列到 Test ECS14:22:28收到命令输出识别出/data/app/logs占 32GB14:22:30在钉钉群推送三条方案按钮14:22:35我点击“安全清理”14:22:36Agent 校验幂等锁生成find ... -delete命令14:22:38命令执行耗时 2.1 秒14:22:40拉取执行结果确认deleted 1284 files14:22:42执行验证命令df -h显示/data使用率 34.1%14:22:45生成报告发回钉钉14:22:48创建工单关联 CMDB14:22:52RCA 草稿存入 ES。全程11 分 23 秒从告警时间算起。而人工操作通常需要2 分钟登录控制台找实例 →1 分钟查磁盘 →3 分钟 SSH 登录 →2 分钟写find命令 →1 分钟执行验证 →2 分钟写报告 → 至少 11 分钟且极易出错。4.5 关键参数配置表每个数字都有依据参数推荐值依据与说明Celery Worker 并发数--concurrency2单台 ECS 的 2C4G 资源concurrency2可平衡 CPU 利用率与内存占用。实测concurrency4时OOM Killer 会杀掉 Worker 进程。InvokeCommand 超时timeout30阿里云文档规定最大 60 秒但du -sh遍历大目录可能卡住。30 秒足够绝大多数诊断超时后重试更可靠。Redis 幂等锁过期300 秒5 分钟考虑网络延迟和命令执行时间5 分钟足以覆盖一次完整操作。太短如 60 秒可能导致误判重试。日志保留周期SLS 中保存 180 天满足等保 2.0 对操作日志留存 ≥ 180 天的要求比“阿里云ssl证书免费续期”的 90 天更严格。钉钉消息重试次数3 次间隔 2 秒钉钉 Webhook 偶发 5023 次重试可覆盖 99.9% 的瞬时失败避免告警丢失。5. 常见问题与排查技巧实录那些文档里不会写的坑5.1 问题速查表高频故障与现场解决法现象可能原因排查命令解决方案钉钉收不到告警Agent Server 的 8000 端口被安全组拦截telnet your-agent-ip 8000在 ECS 安全组中放行 8000 端口或改用 SLB 代理诊断命令执行超时Test ECS 的DescribeInstanceStatus返回Running但实际 SSH 不通nc -zv i-bp1a1b2c3d4e5f6g7 22检查 Test ECS 的安全组是否开放 22 端口或 ECS 是否被systemctl stop sshd清理后使用率不变find ... -delete删除的是软链接实际文件还在ls -la /data/app/logs/改用find /data/app/logs -type f -mtime 7 -delete加-type f过滤Agent 日志报AccessDeniedRAM Role 权限未生效或DescribeTags接口未授权aliyun ecs DescribeTags --instance-id i-bp1a1b2c3d4e5f6g7在 RAM 控制台检查策略确认ecs:DescribeTags在Statement中SLS 日志无事件Agent 的LOGGING_ENDPOINT配置错误或 SLS Project 不存在curl -X POST https://cn-shanghai.log.aliyuncs.com -H x-log-bodyrawsize: 0用阿里云 CLIaliyun log create-project --project-name chatops-logs初始化5.2 独家避坑技巧来自 17 次线上故障的总结技巧 1永远用DescribeInstanceAttribute替代DescribeInstances查单实例DescribeInstances是批量接口即使只查一个实例也会返回所有字段含 ImageId