大促前要临时加几十台服务器,在控制台一台台点,是不少运维团队都吃过的苦。点错规格、漏配安全组,返工一轮就是半天。把华为云服务器API接入到自己的脚本或流水线里,能省掉大部分重复点击。这篇文章按实际做事的顺序来讲:先准备什么,鉴权怎么落地,调用时有哪些坑,最后用一个扩容案例收尾。

一、接入前先理清几件事
动手写代码之前,有四件事最好先确认。它们的问题往往要到线上才暴露。
- 为脚本单独创建子用户:在“我的凭证”里生成访问密钥(AK/SK)时,不要直接用主账号。给脚本一个子用户,万一密钥泄露,影响范围也小。
- 核对地域和项目ID:华为云资源按区域划分,端点和项目ID都跟区域绑定。拿华北的项目ID去调华南的端点,报错信息未必直白,调用前先对一遍。
- 用IAM授予最小权限:如果脚本只负责查询和启停,就别给删除权限。权限收窄了,误操作的上限也跟着降下来。
- 优先使用官方SDK:Python、Java、Go等语言都有官方SDK,签名和重试已经封装好。除非有特殊需要,没必要自己手写HTTP请求。
二、鉴权怎么落地
华为云API的请求靠签名校验。客户端用AK/SK对请求内容计算签名,服务端按同样的规则核对。签名里带有时间戳,所以截获的请求不容易被原样重放。这也意味着服务器时间偏差太大时,鉴权会失败。排查时先看时间,能省不少功夫。
AK/SK不要写进代码仓库。常见做法是把AK、SK和区域信息配置成环境变量,由CI/CD平台或运行环境注入。SDK初始化时读取这些变量,日志里也不要打印密钥内容。另外两件事值得定期做:轮换密钥,以及在IAM里查一查有没有长期无人使用的凭证。
如果脚本跑在华为云ECS上,可以考虑用委托机制获取临时凭证,这样代码里连长期密钥都不必保存。
三、一次调用通常是什么样
以查询云服务器列表为例,流程大致如下:
- 用AK、SK和项目ID初始化凭证对象。
- 按目标区域创建ECS客户端,指定对应端点。
- 构造查询条件,比如按状态、标签或名称过滤。
- 发送请求并解析结果。列表是分页返回的,要循环取完,并检查返回的分页标识。
- 异常要分开处理。鉴权失败、参数错误、限流和服务端故障的应对方式各不相同,统一吞掉或统一重试都会出问题。
限流是最容易被忽略的一环。批量操作时如果没有节流,很快就会碰到频率限制。实际做法是加指数退避重试,同时把大任务切成小批次,一批一批执行。
四、案例:大促前的扩容脚本
某中型电商团队每年大促前都要临时扩容几十台应用服务器。以前由运维人员在控制台逐台创建,大约要两个小时,而且常因规格选错或安全组漏配而返工。
后来团队用Python SDK写了扩容脚本,主要做了三件事。一是把规格、镜像、安全组、子网等参数整理进一份YAML模板,脚本读取后统一下发创建请求。二是实例创建后自动打标签,比如“环境:大促”“负责人:某某”,后续的成本统计和资源回收都靠这些标签。三是创建完成后轮询实例状态,全部进入运行中,才调用负载均衡接口把它们加入后端服务器组。这个顺序不能反,否则未就绪的实例会直接接收流量。
改造后,扩容时间从两个小时压缩到十五分钟左右,返工明显减少。大促结束后,同一个脚本按标签反向筛选,批量释放资源,忘记关机造成的浪费也少了。团队负责人的说法很朴素:接入API之后,每次操作都能复现,也能查到是谁做的,这一点比快更让人踏实。
五、几个常见坑
- 时间不同步:签名依赖时间戳。服务器时钟偏差大时,报错看起来像密钥有问题,其实是时间的问题。保持NTP同步即可。
- 端点和区域对不上:这是高频错误。把端点集中放在配置里,比散落在代码各处硬编码好维护。
- 只读了第一页:统计结果会悄悄缺数据,而且不一定报错。循环取完所有分页再做统计。
- 删除和释放没有保护:这类接口建议加二次确认,或者走审批。脚本跑错一次,代价可能比整个扩容还大。
六、从哪里开始
建议先从只读查询做起,确认鉴权、分页和日志都没问题,再逐步碰创建和变更操作。脚本稳定跑起来以后,团队的精力才能放到架构设计上。