使用 Python SDK 批量创建阿里云 ECS 实例(含参数校验)

核心步骤
  1. 环境准备

    pip install aliyun-python-sdk-core aliyun-python-sdk-ecs
    

  2. 参数校验逻辑
    需验证以下关键参数:

    • 区域 ID 格式:cn-hangzhou
    • 实例类型规格:ecs.g6.large
    • 镜像 ID 格式:centos_7_9_x64_20G_alibase_*
    • 安全组 ID 格式:sg-xxxxxx
    • 交换机 ID 格式:vsw-xxxxxx
    • 数量范围:1-100
  3. 批量创建流程

    graph TD
    A[初始化客户端] --> B[校验参数]
    B --> C{是否有效?}
    C -->|有效| D[循环创建实例]
    C -->|无效| E[抛出异常]
    D --> F[收集实例ID]
    F --> G[返回创建结果]
    

完整实现代码
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException, ServerException
from aliyunsdkecs.request.v20140526.CreateInstanceRequest import CreateInstanceRequest
import re

def validate_params(params):
    """参数校验函数"""
    # 区域ID校验(示例:cn-hangzhou)
    if not re.match(r'^cn-[a-z]+$', params['RegionId']):
        raise ValueError("区域ID格式错误")
    
    # 实例类型校验(示例:ecs.g6.large)
    if not re.match(r'^ecs\.[a-z0-9]+\.\w+$', params['InstanceType']):
        raise ValueError("实例类型格式错误")
    
    # 镜像ID校验(示例:centos_7_9_x64_20G_alibase_*)
    if not params['ImageId'].startswith(('centos_', 'ubuntu_', 'alibaba_')):
        raise ValueError("镜像ID不合法")
    
    # 安全组/交换机ID格式校验
    for field in ['SecurityGroupId', 'VSwitchId']:
        if not re.match(r'^(sg|vsw)-[a-z0-9]{17}$', params[field]):
            raise ValueError(f"{field} 格式错误")
    
    # 数量校验
    if not (1 <= params['Amount'] <= 100):
        raise ValueError("创建数量需在1-100之间")

def batch_create_ecs(access_key, access_secret, region_id, config_list):
    """
    批量创建ECS实例
    :param access_key: AK
    :param access_secret: AS
    :param region_id: 区域ID
    :param config_list: 实例配置列表
    """
    client = AcsClient(access_key, access_secret, region_id)
    created_ids = []
    
    for config in config_list:
        try:
            # 参数校验
            validate_params(config)
            
            # 创建请求
            request = CreateInstanceRequest()
            request.set_accept_format('json')
            
            # 设置请求参数
            request.set_ImageId(config['ImageId'])
            request.set_InstanceType(config['InstanceType'])
            request.set_SecurityGroupId(config['SecurityGroupId'])
            request.set_VSwitchId(config['VSwitchId'])
            request.set_Amount(config.get('Amount', 1))
            
            # 可选参数设置
            if 'InstanceName' in config:
                request.set_InstanceName(config['InstanceName'])
            if 'Password' in config:
                request.set_Password(config['Password'])
            
            # 发送请求
            response = client.do_action_with_exception(request)
            instance_id = response.decode('utf-8').split('"InstanceId": "')[1].split('"')[0]
            created_ids.append(instance_id)
            
        except (ClientException, ServerException) as e:
            print(f"API错误: {e.message}")
        except ValueError as ve:
            print(f"参数校验失败: {str(ve)}")
    
    return created_ids

# 使用示例
if __name__ == "__main__":
    # 实例配置列表(支持多组参数)
    configs = [
        {
            "RegionId": "cn-hangzhou",
            "ImageId": "centos_7_9_x64_20G_alibase_20220824.vhd",
            "InstanceType": "ecs.g6.large",
            "SecurityGroupId": "sg-2ze123456789abcd",
            "VSwitchId": "vsw-2ze123456789abcd",
            "Amount": 3,
            "InstanceName": "web-server"
        },
        # 可添加更多配置...
    ]
    
    # 执行批量创建
    created_instances = batch_create_ecs(
        access_key="<your-ak>",
        access_secret="<your-as>",
        region_id="cn-hangzhou",
        config_list=configs
    )
    
    print(f"已创建实例ID: {created_instances}")

关键注意事项
  1. 权限控制
    RAM 用户需具备以下权限:

    {
      "Action": [
        "ecs:CreateInstance",
        "ecs:Describe*"
      ],
      "Resource": "*"
    }
    

  2. 错误处理

    • ClientException:客户端参数错误
    • ServerException:服务端返回错误
    • ValueError:本地参数校验失败
  3. 扩展建议

    • 添加异步操作:使用线程池加速批量创建
    • 结果验证:通过 DescribeInstances 接口确认创建状态
    • 标签管理:创建时添加 Tag 参数便于资源分类

重要提示:实际使用时需替换 <> 中的参数,并确保账户余额充足。生产环境建议添加重试机制和更完善的日志记录。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐