版权声明:本文为博主原创文章,未经博主允许不得转载。喜欢的用小手点击文章下面的顶,不喜欢的点下踩 https://blog.csdn.net/sethcss/article/details/84999655
#!/usr/bin/env python
# coding=utf-8
import json
import time
import traceback
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException, ServerException
from aliyunsdkecs.request.v20140526.RunInstancesRequest import RunInstancesRequest
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
from aliyunsdkecs.request.v20140526.DeleteInstanceRequest import DeleteInstanceRequest
RUNNING_STATUS = 'Running'
CHECK_INTERVAL = 3
CHECK_TIMEOUT = 180
class AliyunRunInstancesExample(object):
def __init__(self):
self.access_id = 'access_id'
self.access_secret = 'access_secret'
# 是否只预检此次请求。true:发送检查请求,不会创建实例,也不会产生费用;false:发送正常请求,通过检查后直接创建实例,并直接产生费用
self.dry_run = False
# 实例所属的地域ID
self.region_id = 'cn-qingdao'
# 实例的计费方式
self.instance_charge_type = 'PostPaid'
# 购买资源的时长
self.period = 1
# 购买资源的时长单位
self.period_unit = 'Hourly'
# 实例所属的可用区编号
self.zone_id = 'cn-qingdao-c'
# 网络计费类型
self.internet_charge_type = 'PayByTraffic'
# 镜像ID
self.image_id = 'centos_7_04_64_20G_alibase_201701015.vhd'
# 指定新创建实例所属于的安全组ID
self.security_group_id = 'security_group_id'
# 虚拟交换机ID
self.vswitch_id = 'vsw-m5er09pxr0rdhqqakc6yx'
# 实例名称
self.instance_name = 'sethdemo'
# 实例的密码
self.password = 'password'
# 指定创建ECS实例的数量
self.amount = 1
# 公网出带宽最大值
self.internet_max_bandwidth_out = 5
# 是否为I/O优化实例
self.io_optimized = 'optimized'
# 后付费实例的抢占策略
self.spot_strategy = 'SpotWithPriceLimit'
# 设置实例的每小时最高价格
self.spot_price_limit = 0.89
# 是否开启安全加固
self.security_enhancement_strategy = 'Active'
# 实例的资源规格
self.instance_type = 'ecs.g5.large'
# 系统盘大小
self.system_disk_size = '40'
# 系统盘的磁盘种类
self.system_disk_category = 'cloud_efficiency'
self.client = AcsClient(self.access_id, self.access_secret, self.region_id)
def run(self):
try:
ids = self.run_instances()
self._check_instances_status(ids)
except ClientException as e:
print('Fail. Something with your connection with Aliyun go incorrect.'
' Code: {code}, Message: {msg}'
.format(code=e.error_code, msg=e.message))
except ServerException as e:
print('Fail. Business error.'
' Code: {code}, Message: {msg}'
.format(code=e.error_code, msg=e.message))
except Exception:
print('Unhandled error')
print(traceback.format_exc())
def run_instances(self):
"""
调用创建实例的API,得到实例ID后继续查询实例状态
:return:instance_ids 需要检查的实例ID
"""
request = RunInstancesRequest()
request.set_DryRun(self.dry_run)
request.set_InstanceChargeType(self.instance_charge_type)
request.set_Period(self.period)
request.set_PeriodUnit(self.period_unit)
request.set_ZoneId(self.zone_id)
request.set_InternetChargeType(self.internet_charge_type)
request.set_ImageId(self.image_id)
request.set_SecurityGroupId(self.security_group_id)
request.set_VSwitchId(self.vswitch_id)
request.set_InstanceName(self.instance_name)
request.set_Password(self.password)
request.set_Amount(self.amount)
request.set_InternetMaxBandwidthOut(self.internet_max_bandwidth_out)
request.set_IoOptimized(self.io_optimized)
request.set_SpotStrategy(self.spot_strategy)
request.set_SpotPriceLimit(self.spot_price_limit)
request.set_SecurityEnhancementStrategy(self.security_enhancement_strategy)
request.set_InstanceType(self.instance_type)
request.set_SystemDiskSize(self.system_disk_size)
request.set_SystemDiskCategory(self.system_disk_category)
body = self.client.do_action_with_exception(request)
data = json.loads(body)
instance_ids = data['InstanceIdSets']['InstanceIdSet']
print('Success. Instance creation succeed. InstanceIds: {}'.format(', '.join(instance_ids)))
return instance_ids
def _check_instances_status(self, instance_ids):
"""
每3秒中检查一次实例的状态,超时时间设为3分钟.
:param instance_ids 需要检查的实例ID
:return:
"""
start = time.time()
while True:
request = DescribeInstancesRequest()
request.set_InstanceIds(json.dumps(instance_ids))
body = self.client.do_action_with_exception(request)
data = json.loads(body)
print(data)
for instance in data['Instances']['Instance']:
if RUNNING_STATUS in instance['Status']:
instance_ids.remove(instance['InstanceId'])
print('Instance boot successfully: {}'.format(instance['InstanceId'],["PublicIpAddress"]["IpAddress"][0]))
if not instance_ids:
print('Instances all boot successfully')
break
if time.time() - start > CHECK_TIMEOUT:
print('Instances boot failed within {timeout}s: {ids}'
.format(timeout=CHECK_TIMEOUT, ids=', '.join(instance_ids)))
break
time.sleep(CHECK_INTERVAL)
if __name__ == '__main__':
AliyunRunInstancesExample().run()