在阿里云上批量创建 ECS 实例,核心思路其实就两个:要么用“自定义镜像+脚本”做自动化,要么直接用官方提供的“批量创建”工具或 API。
单纯去控制台点点点,创几个还行,一旦超过几十个,效率极低且容易出错。下面按实际生产环境的成熟度,分几种方案讲清楚。
方案一:使用“自定义镜像 + 用户数据(User Data)” —— 最经典、最可控
这是很多老运维和 DevOps 工程师最常用的方式。核心逻辑是:先做好一个配置好的系统盘镜像,然后基于这个镜像启动多台机器,并在启动时通过脚本注入每台机器不同的 IP 或主机名。
步骤拆解:
-
制作基准镜像:
- 在一台 ECS 上装好基础环境(Nginx, PHP, JDK 等)。
- 安装
cloud-init(如果是 CentOS/Ubuntu,通常默认自带;CentOS 7 可能需要手动 yum install cloud-init)。 - 执行
sysprep类的操作(Windows)或清除 MAC 地址、SSH Key 等唯一标识(Linux),确保镜像通用化。 - 将该实例制作为“自定义镜像”。
-
编写初始化脚本:
- Linux 下常用 shell 脚本,利用
/var/lib/cloud/instance/user-data.txt获取输入参数。 - 关键点:你需要一种机制让每台机器知道自己是“第几台”,从而设置不同的主机名或绑定不同的内网 IP。
- 注意:阿里云的 User Data 在实例首次启动后只执行一次,非常适合做初始化配置。
- Linux 下常用 shell 脚本,利用
-
调用 API 或 CLI 批量创建:
- 使用
aliyun-cli或者写 Python/Go 脚本调用RunInstances接口。 - 传入刚才制作的 ImageId。
- 传入
UserData(Base64 编码后的脚本)。 - 通过循环,为每次请求生成唯一的 InstanceName 或 Hostname。
- 使用
优点:完全掌控启动过程,适合复杂的环境初始化。
缺点:需要维护镜像和脚本,调试稍麻烦。
方案二:直接使用阿里云控制台“批量创建”功能 —— 最简单、适合中小规模
如果你只是临时需要创建 5~50 台机器,不想写代码,可以直接用控制台的新特性。
操作路径:
ECS 控制台 -> 实例 -> 创建实例 -> 选择“自定义购买” -> 在“高级选项”或“网络与安全组”附近,找到“批量创建”入口(具体位置随控制台版本更新可能有微调,通常在实例数量那里有提示)。
关键限制:
- 同一批次创建的实例,安全组、VPC、交换机、付费类型必须一致。
- 你可以指定起始序号,比如 InstanceName 设为
web-server-{{i}},系统会自动填充序号。 - 最多支持一次性创建 100 台(具体限额看账号等级和区域配额)。
优点:零代码,开箱即用。
缺点:灵活性差,无法做复杂的差异化配置(如每台机器装不同的包)。
方案三:使用 Terraform / Ansible —— 推荐用于基础设施即代码(IaC)
如果你是正经做云原生或持续交付,强烈建议上 Terraform。
Terraform 实现逻辑:
resource "alicloud_instance" "batch_server" {
count = 10 # 这里定义你要创建多少台
instance_name = "app-server-${count.index}"
image_id = "m-xxxxxx" # 你的自定义镜像 ID
instance_type = "ecs.c6.large"
security_group_ids = [alicloud_security_group.default.id]
vswitch_id = alicloud_vswitch.default.id
# 如果需要差异化配置,可以在 user_data 里引用 count.index
user_data = base64encode(<<-EOF
#!/bin/bash
echo "Instance ID: ${count.index}" >> /tmp/init.log
hostnamectl set-hostname app-${count.index}
EOF
)
}
配合 Ansible:
Terraform 负责创建资源并输出实例列表(Private IPs),Ansible 负责连接这些新创建的实例进行软件部署。这是业界标准做法。
优点:可重复、可版本控制、状态管理清晰。
缺点:需要学习成本。
方案四:使用 OpenAPI Explorer 或 SDK 编程 —— 适合集成到内部平台
如果你公司内部有自研的云管平台,直接调 RunInstances API 是最灵活的。
Python 示例片段(使用 alibabacloud_ecs20140526 SDK):
from alibabacloud_ecs20140526.client import Client
from alibabacloud_tea_openapi.models import Config
# 初始化客户端...
client = Client(config)
request = RunInstancesRequest(
region_id='cn-hangzhou',
image_id='m-xxx',
instance_type='ecs.g6.large',
security_group_id='sg-xxx',
vswitch_id='vsw-xxx',
instance_charge_type='PostPaid',
internet_max_bandwidth_out=10,
# 关键:通过 UserData 传递不同参数
user_data='aW5pdCBzY3JpcHQ=',
# 可以通过循环调用,每次修改 instance_name
)
response = client.run_instances(request)
避坑指南 & 实战经验
-
配额问题:
批量创建前,务必检查你的账号 EIP 配额、vCPU 配额、安全组规则数量。很多新手一口气开 100 台,结果因为某个区域的 vCPU 配额不足,导致部分创建失败,排查起来很头疼。建议在控制台提前申请提高配额。 -
网络延迟与并发:
不要在一个线程里串行调用 API 创建 100 台机器,那样太慢。建议使用多线程或协程并发调用,但要注意控制并发数,避免触发阿里云的限流策略(Rate Limiting)。一般建议并发控制在 10~20 个请求/秒以内比较稳妥。 -
安全组放行:
批量创建时,如果依赖 SSH 远程登录,确保你的安全组已经放行了 22 端口(源 IP 设为你的办公网段或跳板机 IP)。否则机器创建好了,你连都连不上,只能去控制台 VNC 进系统改配置,非常痛苦。 -
云监控与标签:
批量创建时,一定要打 Tag!比如env:prod,role:web。没有标签的机器集群,后期运维就是灾难。Terraform 和 API 都支持在创建时附加标签。 -
关于“一键启动”误区:
很多人以为批量创建后机器就能自动联网、自动加入集群。实际上,除非你做了完善的 Cloud-init 或 Packer 镜像,否则新机器启动后只是一个裸 OS。后续的 NTP 同步、DNS 解析、主机名注册到 Consul/Eureka 等,都需要靠脚本或 Agent 完成。
总结建议
- 临时测试/少量机器:直接用控制台批量创建。
- 标准化部署/中等规模:自定义镜像 + Aliyun CLI/Python 脚本。
- 企业级/大规模/频繁变更:Terraform + Ansible/Packer。
别再去一个个敲命令了,把流程自动化,才是玩云的正确姿势。
云技术博客