RunInstances 批量建立執行個體介面可以幫助您一次建立多台 ECS 隨用隨付執行個體來完成應用的開發和部署,方便實現彈性的資源建立。
和 CreateInstance 介面相比,RunInstances 介面有下面的優點:
- 單次可以最多建立 100 台執行個體,避免重複調用。
- 執行個體建立之後,執行個體會自動變成
Starting
狀態,然後變成Running
狀態,不需要您調用 StartInstance 的操作。 - 建立執行個體的時候指定了
InternetMaxBandwidthOut
,則自動為您分配公網 IP,不需要您再調用分配 IP 的操作。 - 您也可以一次建立 100 台搶佔式執行個體,充分滿足您的彈性需求。
- 建立的參數保持和 CreateInstance 保持相容,增加了
Amount
參數來設定建立的個數,以及AutoReleaseTime
參數來設定自動釋放時間,不需要您再額外設定自動釋放時間。 - 建立返回一個
InstanceIdSets
會記錄相關的InstanceIds
,您只需要根據執行個體 ID 輪詢執行個體狀態即可。
前提條件
調用 API 前,您需要 建立 AccessKey。
注意:禁止使用主帳號 AK,因為主帳號 AK 泄露會威脅您所有資源的安全。請使用子帳號 AK 進行操作,可有效降低 AK 泄露的風險。
安裝 ECS Python SDK
首先確保您已經具備 Python 的 Runtime,本文中使用的 Python 版本為 2.7+。
這裡以 Python 為樣本,其他的版本 SDK 大於 4.4.3 即可。
pip install aliyun-python-sdk-ecs
如果提示您沒有許可權,請切換sudo
繼續執行。
sudo pip install aliyun-python-sdk-ecs
批量建立執行個體
首先建立 RunInstancesRequest 的執行個體,然後填入相關需要的參數即可。
下面的例子建立了 2 台執行個體,並且添加了自動每隔 10 秒鐘檢查一次執行個體的運行狀態。直到執行個體狀態變成Running
結束建立流程。
# your access key Id
ak_id = "YOU_ACCESS_KEY_ID"
# your access key secret
ak_secret = "YOU_ACCESS_SECRET"
region_id = "cn-beijing"
# your expected instance type
instance_type = "ecs.n4.small"
# 選擇的vswitchId
vswitch_id = "vws-xxxxx"
# 使用的鏡像資訊
image_id = "centos_7_03_64_20G_alibase_20170818.vhd"
# 當前vpc類型的安全性群組
security_group_id = "sg-xxxxx"
# instance number to launch, support 1-100, default value is 100
amount = 2;
# instance auto delete time 按照 ISO8601 標準表示,並需要使用 UTC 時間。格式為 yyyy-MM-ddTHH:mm:ssZ 。 最短在目前時間之後半小時。最長不能超過目前時間起三年
auto_release_time = "2017-12-05T22:40:00Z"
clt = client.AcsClient(ak_id, ak_secret, 'cn-beijing')
# create instance automatic running
def batch_create_instance():
request = build_request()
request.set_Amount(amount)
_execute_request(request)
def _execute_request(request):
response = _send_request(request)
if response.get('Code') is None:
instance_ids = response.get('InstanceIdSets').get('InstanceIdSet')
running_amount = 0
while running_amount < amount:
time.sleep(10)
running_amount = check_instance_running(instance_ids)
print("ecs instance %s is running", instance_ids)
def check_instance_running(instance_ids):
request = DescribeInstancesRequest()
request.set_InstanceIds(json.dumps(instance_ids))
response = _send_request(request)
if response.get('Code') is None:
instances_list = response.get('Instances').get('Instance')
running_count = 0
for instance_detail in instances_list:
if instance_detail.get('Status') == "Running":
running_count += 1
return running_count
def build_request():
request = RunInstancesRequest()
request.set_ImageId(image_id)
request.set_VSwitchId(vswitch_id)
request.set_SecurityGroupId(security_group_id)
request.set_InstanceName("Instance12-04")
request.set_InstanceType(instance_type)
return request
# send open api request
def _send_request(request):
request.set_accept_format('json')
try:
response_str = clt.do_action(request)
logging.info(response_str)
response_detail = json.loads(response_str)
return response_detail
except Exception as e:
logging.error(e)
批量建立執行個體並自動分配公網 IP
相比批量建立執行個體的代碼,只需要添加一行屬性,指定公網的頻寬即可。下面的例子中預設給執行個體都分配了 1 M 的按流量頻寬。
# create instance with public ip.
def batch_create_instance_with_public_ip():
request = build_request()
request.set_Amount(amount)
request.set_InternetMaxBandwidthOut(1)
_execute_request(request)
批量建立執行個體並自動化佈建自動釋放時間
相比批量建立執行個體的代碼,只需要添加一行屬性,指定執行個體的自動釋放時間即可。自動釋放時間按照 ISO8601 標準表示,並需要使用 UTC 時間,格式為 yyyy-MM-ddTHH:mm:ssZ
。最短在目前時間之後半小時,最長不能超過目前時間起三年。
# create instance with auto release time.
def batch_create_instance_with_auto_release_time():
request = build_request()
request.set_Amount(amount)
request.set_AutoReleaseTime(auto_release_time)
_execute_request(request)
完整程式碼範例
以上操作完整的程式碼範例如下所示。
# coding=utf-8
# if the python sdk is not install using 'sudo pip install aliyun-python-sdk-ecs'
# if the python sdk is install using 'sudo pip install --upgrade aliyun-python-sdk-ecs'
# make sure the sdk version is 4.4.3, you can use command 'pip show aliyun-python-sdk-ecs' to check
import json
import logging
import time
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
from aliyunsdkecs.request.v20140526.RunInstancesRequest import RunInstancesRequest
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S')
# your access key Id
ak_id = "YOU_ACCESS_KEY_ID"
# your access key secret
ak_secret = "YOU_ACCESS_SECRET"
region_id = "cn-beijing"
# your expected instance type
instance_type = "ecs.n4.small"
# 選擇的vswitchId
vswitch_id = "vws-xxxxx"
# 使用的鏡像資訊
image_id = "centos_7_03_64_20G_alibase_20170818.vhd"
# 當前vpc類型的安全性群組
security_group_id = "sg-xxxxx"
# instance number to launch, support 1-100, default value is 100
amount = 2;
# instance auto delete time 按照 ISO8601 標準表示,並需要使用 UTC 時間。格式為 yyyy-MM-ddTHH:mm:ssZ 。 最短在目前時間之後半小時。最長不能超過目前時間起三年
auto_release_time = "2017-12-05T22:40:00Z"
clt = client.AcsClient(ak_id, ak_secret, 'cn-beijing')
# create instance automatic running
def batch_create_instance():
request = build_request()
request.set_Amount(amount)
_execute_request(request)
# create instance with public ip.
def batch_create_instance_with_public_ip():
request = build_request()
request.set_Amount(amount)
request.set_InternetMaxBandwidthOut(1)
_execute_request(request)
# create instance with auto release time.
def batch_create_instance_with_auto_release_time():
request = build_request()
request.set_Amount(amount)
request.set_AutoReleaseTime(auto_release_time)
_execute_request(request)
def _execute_request(request):
response = _send_request(request)
if response.get('Code') is None:
instance_ids = response.get('InstanceIdSets').get('InstanceIdSet')
running_amount = 0
while running_amount < amount:
time.sleep(10)
running_amount = check_instance_running(instance_ids)
print("ecs instance %s is running", instance_ids)
def check_instance_running(instance_ids):
request = DescribeInstancesRequest()
request.set_InstanceIds(json.dumps(instance_ids))
response = _send_request(request)
if response.get('Code') is None:
instances_list = response.get('Instances').get('Instance')
running_count = 0
for instance_detail in instances_list:
if instance_detail.get('Status') == "Running":
running_count += 1
return running_count
def build_request():
request = RunInstancesRequest()
request.set_ImageId(image_id)
request.set_VSwitchId(vswitch_id)
request.set_SecurityGroupId(security_group_id)
request.set_InstanceName("Instance12-04")
request.set_InstanceType(instance_type)
return request
# send open api request
def _send_request(request):
request.set_accept_format('json')
try:
response_str = clt.do_action(request)
logging.info(response_str)
response_detail = json.loads(response_str)
return response_detail
except Exception as e:
logging.error(e)
if __name__ == '__main__':
print "hello ecs batch create instance"
# batch_create_instance()
# batch_create_instance_with_public_ip()
# batch_create_instance_with_auto_release_time()