---
id: 008
title: M6 migration full drill 首次运行 flaky（RunInstances 后 200s 没拿到 IP）
status: open
labels: [chaos-engineering, flaky, aliyun-api]
assignee: team-lead
created_at: 2026-04-23
---

# #008 M6 drill flaky（aliyun API 抖动）

## 场景

2026-04-23 03:15 第一次手动触发 M6 `chaos-migration-full-drill.yml`，结果：

- ✅ 前 5 步：装 aliyun CLI / 配 drill profile / 生成 + 上传 SSH keypair / `RunInstances`（下单成功拿到 instance_id）
- ❌ "等 Running + 拿公网 IP" 步：40 次 x 5s = 200s 轮询没拿到 Running 状态 + IP → workflow fail
- ⚠️ cleanup always 步：`DeleteKeyPairs` 返回 `KeyPairNames attached to instances can not be deleted` —— instance 还在 Pending 状态 keypair 绑着删不了

## 根因

aliyun ECS `RunInstances` → `Running` 的时间不是严格上限。正常 15-60s，但偶尔赶上 aliyun 底层资源分配慢 / 按量池紧张 → 2-5 分钟才 Running。我的 200s 上限不够。

## 修复方案

### 1. 轮询时长上拉

```yaml
# 从 40 × 5s=200s 改为 60 × 5s=300s 或 40 × 10s=400s
for i in $(seq 1 60); do
  ...
  sleep 5
done
```

### 2. cleanup 增强：先等 instance 真正删除再删 keypair

```bash
# 先 DeleteInstance + 轮询等 NotFound
# 再 DeleteKeyPairs
```

或用 `ecs DeleteKeyPairs --Force` 参数（如果 API 支持）。

### 3. workflow 层加自动重试

```yaml
- uses: nick-fields/retry@v3
  with:
    max_attempts: 2
    timeout_minutes: 20
    command: ...
```

这是 GHA 的 action，第一次挂了自动再跑一遍。对 aliyun API flaky 场景适合。

## 代价

- 轮询时长拉长：单次 drill 最坏耗时从 ~15 分钟 → 20 分钟，成本仍 < ¥1
- 重试：成本翻倍（¥0.4 vs ¥0.2），但防止误报

## 相关

- workflow: `.github/workflows/chaos-migration-full-drill.yml`
- 方案源头 issue #005（已 archived）
- 同样 flaky 源头：M4 `chaos-migration-drill.yml` 也建议加同样修复
