努力
加油

如何在阿里云上批量创建多个ECS实例?

在阿里云上批量创建 ECS 实例,核心思路其实就两个:要么用“自定义镜像+脚本”做自动化,要么直接用官方提供的“批量创建”工具或 API。

单纯去控制台点点点,创几个还行,一旦超过几十个,效率极低且容易出错。下面按实际生产环境的成熟度,分几种方案讲清楚。

方案一:使用“自定义镜像 + 用户数据(User Data)” —— 最经典、最可控

这是很多老运维和 DevOps 工程师最常用的方式。核心逻辑是:先做好一个配置好的系统盘镜像,然后基于这个镜像启动多台机器,并在启动时通过脚本注入每台机器不同的 IP 或主机名。

步骤拆解:

  1. 制作基准镜像:

    • 在一台 ECS 上装好基础环境(Nginx, PHP, JDK 等)。
    • 安装 cloud-init(如果是 CentOS/Ubuntu,通常默认自带;CentOS 7 可能需要手动 yum install cloud-init)。
    • 执行 sysprep 类的操作(Windows)或清除 MAC 地址、SSH Key 等唯一标识(Linux),确保镜像通用化。
    • 将该实例制作为“自定义镜像”。
  2. 编写初始化脚本:

    • Linux 下常用 shell 脚本,利用 /var/lib/cloud/instance/user-data.txt 获取输入参数。
    • 关键点:你需要一种机制让每台机器知道自己是“第几台”,从而设置不同的主机名或绑定不同的内网 IP。
    • 注意:阿里云的 User Data 在实例首次启动后只执行一次,非常适合做初始化配置。
  3. 调用 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)

避坑指南 & 实战经验

  1. 配额问题:
    批量创建前,务必检查你的账号 EIP 配额、vCPU 配额、安全组规则数量。很多新手一口气开 100 台,结果因为某个区域的 vCPU 配额不足,导致部分创建失败,排查起来很头疼。建议在控制台提前申请提高配额。

  2. 网络延迟与并发:
    不要在一个线程里串行调用 API 创建 100 台机器,那样太慢。建议使用多线程或协程并发调用,但要注意控制并发数,避免触发阿里云的限流策略(Rate Limiting)。一般建议并发控制在 10~20 个请求/秒以内比较稳妥。

  3. 安全组放行:
    批量创建时,如果依赖 SSH 远程登录,确保你的安全组已经放行了 22 端口(源 IP 设为你的办公网段或跳板机 IP)。否则机器创建好了,你连都连不上,只能去控制台 VNC 进系统改配置,非常痛苦。

  4. 云监控与标签:
    批量创建时,一定要打 Tag!比如 env:prod, role:web。没有标签的机器集群,后期运维就是灾难。Terraform 和 API 都支持在创建时附加标签。

  5. 关于“一键启动”误区:
    很多人以为批量创建后机器就能自动联网、自动加入集群。实际上,除非你做了完善的 Cloud-init 或 Packer 镜像,否则新机器启动后只是一个裸 OS。后续的 NTP 同步、DNS 解析、主机名注册到 Consul/Eureka 等,都需要靠脚本或 Agent 完成。

总结建议

  • 临时测试/少量机器:直接用控制台批量创建。
  • 标准化部署/中等规模:自定义镜像 + Aliyun CLI/Python 脚本。
  • 企业级/大规模/频繁变更:Terraform + Ansible/Packer。

别再去一个个敲命令了,把流程自动化,才是玩云的正确姿势。