除ECS管理主控台外,您還能通過API管理ECS執行個體。阿里雲提供了多語言版本SDK來封裝API。本文基於Python語言介紹如何通過API查詢ECS執行個體。
背景資訊
查詢ECS執行個體相關資訊的完整程式碼範例,請參見完整代碼。程式碼範例解析,請參見:
擷取RAM使用者AccessKey
使用API管理ECS執行個體,您需要能訪問ECS資源的AccessKey(AccessKey ID和AccessKey Secret)。為了保證雲端服務的安全,您需要建立一個能訪問ECS資源的RAM使用者,擷取該使用者的AccessKey,並使用這個RAM使用者和API管理ECS執行個體。
按以下步驟擷取RAM使用者AccessKey:
建立RAM使用者。具體操作,請參見建立RAM使用者。
擷取RAM使用者AccessKey。具體操作,請參見建立AccessKey。
為RAM使用者授權,授予RAM使用者管理雲端服務器服務(ECS)的許可權(
AliyunECSFullAccess
)。具體操作,請參見為RAM使用者授權。
安裝ECS Python SDK
首先確保您已經具備Python的Runtime,本文中使用的Python版本為2.7+。
運行以下命令,安裝Python SDK:
pip install aliyun-python-sdk-ecs
如果提示您沒有許可權,請切換sudo繼續執行。
sudo pip install aliyun-python-sdk-ecs
本文使用的SDK版本為2.1.2。
完整代碼
本文的完整代碼如下所示,您可以自行根據實際情況修改代碼內容。
# 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 greater than 2.1.2, you can use command 'pip show aliyun-python-sdk-ecs' to check
import json
import logging
import os
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')
# 請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
# 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例使用環境變數擷取 AccessKey 的方式進行調用,僅供參考,建議使用更安全的 STS 方式
# 將<RegionId>變數替換為您待查詢的ECS執行個體所屬的地區ID,阿里雲支援的地區資訊您可以調用DescribeRegions查看。
clt = client.AcsClient(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], '<RegionId>')
# 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", list(result))
# output the instance owned in current region.
def list_instances():
request = DescribeInstancesRequest()
request.set_accept_format('json')
# 佈建要求參數的範例程式碼如下,表示進行分頁查詢,set_PageNumber指定查詢第1頁的內容,set_PageSize指定當前頁顯示2條資料。
request.set_PageNumber(1)
request.set_PageSize(2)
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", list(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_with_exception(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()
查詢當前帳號支援的地區列表
建立檔案hello_ecs_api.py。為了使用SDK,首先執行個體化AcsClient對象,這裡需要RAM使用者的AccessKey ID和AccessKey Secret。
AccessKey ID和AccessKey Secret是RAM使用者訪問阿里雲ECS服務API的密鑰,具有該賬戶完全的許可權,請妥善保管,避免泄露。
import json
import logging
import os
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
from aliyunsdkecs.request.v20140526.DescribeRegionsRequest import DescribeRegionsRequest
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')
# 請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
# 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例使用環境變數擷取 AccessKey 的方式進行調用,僅供參考,建議使用更安全的 STS 方式
# 將<RegionId>變數替換為您待查詢的ECS執行個體所屬的地區ID,阿里雲支援的地區資訊您可以調用DescribeRegions查看。
clt = client.AcsClient(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], '<RegionId>')
完成執行個體化後。查詢當前帳號支援的地區列表。更多資訊,請參見DescribeRegions。
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", list(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_with_exception(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列表。輸出樣本如下:
region list: ['cn-qingdao', 'cn-beijing', 'cn-zhangjiakou', 'cn-huhehaote', 'cn-wulanchabu', 'cn-hangzhou', 'cn-shanghai', 'cn-shenzhen', 'cn-heyuan', 'cn-guangzhou', 'cn-chengdu', 'cn-hongkong', 'ap-northeast-1', 'ap-southeast-1', 'ap-southeast-3', 'ap-southeast-5', 'us-east-1', 'us-west-1', 'eu-west-1']
查詢指定地區下的ECS執行個體
查詢執行個體列表和查詢Region列表的方法相似,替換入參對象為DescribeInstancesRequest並定製相關變數即可,更多查詢執行個體列表API的詳情,請參見DescribeInstances。
def list_instances():
request = DescribeInstancesRequest()
request.set_accept_format('json')
# 佈建要求參數的範例程式碼如下,表示進行分頁查詢,set_PageNumber指定查詢第1頁的內容,set_PageSize指定當前頁顯示2條資料。
request.set_PageNumber(1)
request.set_PageSize(2)
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", list(result))
def _print_instance_id(item):
instance_id = item.get('InstanceId')
return instance_id
def _send_request(request):
request.set_accept_format('json')
try:
response_str = clt.do_action_with_exception(request)
logging.info(response_str)
response_detail = json.loads(response_str)
return response_detail
except Exception as e:
logging.error(e)
list_instances()
輸出結果樣本如下:
current region include instance ['i-bp165p6xk2tmdhj0****', 'i-bp1a01zbqmsun5odo****'']
更多查詢資源的API,請參見API概覽。例如,您可以嘗試查詢磁碟列表(DescribeDisks),替換入參對象為DescribeDisksRequest並定製相關變數即可。