您除了可以通過 ECS管理主控台 建立或管理ECS執行個體外,您也能通過 API 管理或定製開發 ECS 執行個體。
阿里雲提供了 SDK 來包裝API,將Elastic Compute Service 的管理整合到已有系統中。本文基於 Python 的開發來說明如何通過API 管理 ECS 執行個體。如果您沒有 Python 開發經驗,也能通過本文完成雲端服務的開發。
獲取 RAM 子帳號 AK 密鑰
使用API管理ECS執行個體,您需要能訪問ECS資源的API密鑰(AccessKey ID 和 AccessKey Secret)。為了保證雲端服務的安全,您需要建立一個能訪問ECS資源的RAM使用者,獲取該使用者的AccessKey密鑰,並使用這個RAM使用者和API管理ECS執行個體。
以下是獲取RAM使用者AccessKey密鑰的操作步驟:
- 建立RAM使用者並獲取AccessKey密鑰。
- 直接給RAM使用者授權,授予RAM使用者 管理雲端服務器服務(ECS)的許可權。
安裝 ECS Python SDK
首先確保您已經具備Python的Runtime,本文中使用的Python版本為2.7+。
pip install aliyun-python-sdk-ecs
如果提示您沒有許可權,請切換sudo
繼續執行。
sudo pip install aliyun-python-sdk-ecs
本文使用的SDK版本為 2.1.2。
Hello Alibaba Cloud
建立檔案 hello_ecs_api.py。為了使用SDK,首先執行個體化AcsClient對象,這裡需要RAM使用者的AccessKey ID和AccessKey Secret。
AccessKey ID和AccessKey Secret是RAM使用者訪問阿里雲ECS服務API的密鑰,具有該賬戶完全的許可權,請妥善保管。
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
from aliyunsdkecs.request.v20140526.DescribeRegionsRequest import DescribeRegionsRequest
clt = client.AcsClient('Your Access Key Id', 'Your Access Key Secrect', 'cn-beijing')
完成執行個體化後可以進行第一個應用的開發。查詢當前帳號支援的地域列表。具體的文檔參見 查詢可用地域列表。
def hello_aliyun_regions():
request = DescribeRegionsRequest()
response = _send_request(request)
region_list = response.get('Regions').get('Region')
assert response is not None
assert region_list is not None
result = map(_print_region_id, region_list)
logging.info("region list: %s", result)
def _print_region_id(item):
region_id = item.get("RegionId")
return region_id
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)
hello_aliyun_regions()
在命令列運行 python hello_ecs_api.py
會得到當前支援的 Region列表。類似的輸出如下:
[u'cn-shenzhen', u'ap-southeast-1', u'cn-qingdao', u'cn-beijing', u'cn-shanghai', u'us-east-1', u'cn-hongkong', u'me-east-1', u'ap-southeast-2', u'cn-hangzhou', u'eu-central-1', u'ap-northeast-1', u'us-west-1']
查詢當前的 Region 下的 ECS 執行個體列表
查詢執行個體列表和查詢 Region 列表非常類似,替換入參對象為DescribeInstancesRequest
即可,更多的查詢參數參考 查詢執行個體列表。
def list_instances():
request = DescribeInstancesRequest()
response = _send_request(request)
if response is not None:
instance_list = response.get('Instances').get('Instance')
result = map(_print_instance_id, instance_list)
logging.info("current region include instance %s", result)
def _print_instance_id(item):
instance_id = item.get('InstanceId');
return instance_id
輸出結果為如下:
current region include instance [u'i-****', u'i-****'']
更多的API參考 ECS API 概覽,您可以嘗試作一個 查詢磁碟列表,將執行個體的參數替換為 DescribeDisksRequest
。
完整程式碼範例
以上操作完整的程式碼範例如下所示。
# 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 2.1.2, you can use command 'pip show aliyun-python-sdk-ecs' to check
import json
import logging
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
from aliyunsdkecs.request.v20140526.DescribeRegionsRequest import DescribeRegionsRequest
# configuration the log output formatter, if you want to save the output to file,
# append ",filename='ecs_invoke.log'" after datefmt.
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')
clt = client.AcsClient('Your Access Key Id', 'Your Access Key Secrect', 'cn-beijing')
# sample api to list aliyun open api.
def hello_aliyun_regions():
request = DescribeRegionsRequest()
response = _send_request(request)
if response is not None:
region_list = response.get('Regions').get('Region')
assert response is not None
assert region_list is not None
result = map(_print_region_id, region_list)
logging.info("region list: %s", result)
# output the instance owned in current region.
def list_instances():
request = DescribeInstancesRequest()
response = _send_request(request)
if response is not None:
instance_list = response.get('Instances').get('Instance')
result = map(_print_instance_id, instance_list)
logging.info("current region include instance %s", result)
def _print_instance_id(item):
instance_id = item.get('InstanceId');
return instance_id
def _print_region_id(item):
region_id = item.get("RegionId")
return region_id
# 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__':
logging.info("Hello Aliyun OpenApi!")
hello_aliyun_regions()
list_instances()
如您想瞭解 ECS 中 API 的其它操作,請參考 ECS中的API操作。