阿里云 OpenAPI 批量操作:使用 Python SDK 批量创建 ECS 实例(含参数校验)
·
使用 Python SDK 批量创建阿里云 ECS 实例(含参数校验)
核心步骤
-
环境准备
pip install aliyun-python-sdk-core aliyun-python-sdk-ecs -
参数校验逻辑
需验证以下关键参数:- 区域 ID 格式:
cn-hangzhou - 实例类型规格:
ecs.g6.large - 镜像 ID 格式:
centos_7_9_x64_20G_alibase_* - 安全组 ID 格式:
sg-xxxxxx - 交换机 ID 格式:
vsw-xxxxxx - 数量范围:1-100
- 区域 ID 格式:
-
批量创建流程
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}")
关键注意事项
-
权限控制
RAM 用户需具备以下权限:{ "Action": [ "ecs:CreateInstance", "ecs:Describe*" ], "Resource": "*" } -
错误处理
ClientException:客户端参数错误ServerException:服务端返回错误ValueError:本地参数校验失败
-
扩展建议
- 添加异步操作:使用线程池加速批量创建
- 结果验证:通过
DescribeInstances接口确认创建状态 - 标签管理:创建时添加
Tag参数便于资源分类
重要提示:实际使用时需替换
<>中的参数,并确保账户余额充足。生产环境建议添加重试机制和更完善的日志记录。
更多推荐



所有评论(0)