查詢ECS實(shí)例
除ECS管理控制臺(tái)外,您還能通過API管理ECS實(shí)例。阿里云提供了多語(yǔ)言版本SDK來封裝API。本文基于Python語(yǔ)言介紹如何通過API查詢ECS實(shí)例。
背景信息
查詢ECS實(shí)例相關(guān)信息的完整代碼示例,請(qǐng)參見完整代碼。代碼示例解析,請(qǐng)參見:
更多代碼示例,請(qǐng)參見阿里云代碼示例庫(kù)(CodeSample)。
獲取RAM用戶AccessKey
使用API管理ECS實(shí)例,您需要能訪問ECS資源的AccessKey(AccessKey ID和AccessKey Secret)。為了保證云服務(wù)的安全,您需要?jiǎng)?chuàng)建一個(gè)能訪問ECS資源的RAM用戶,獲取該用戶的AccessKey,并使用這個(gè)RAM用戶和API管理ECS實(shí)例。
按以下步驟獲取RAM用戶AccessKey:
創(chuàng)建RAM用戶。具體操作,請(qǐng)參見創(chuàng)建RAM用戶。
獲取RAM用戶AccessKey。具體操作,請(qǐng)參見創(chuàng)建AccessKey。
為RAM用戶授權(quán),授予RAM用戶管理云服務(wù)器服務(wù)(ECS)的權(quán)限(
AliyunECSFullAccess
)。具體操作,請(qǐng)參見為RAM用戶授權(quán)。
安裝ECS Python SDK
首先確保您已經(jīng)具備Python的Runtime,本文中使用的Python版本為2.7+。
運(yùn)行以下命令,安裝Python SDK:
pip install aliyun-python-sdk-ecs
如果提示您沒有權(quán)限,請(qǐng)切換sudo繼續(xù)執(zhí)行。
sudo pip install aliyun-python-sdk-ecs
本文使用的SDK版本為2.1.2。
完整代碼
本文的完整代碼如下所示,您可以自行根據(jù)實(shí)際情況修改代碼內(nèi)容。
# 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')
# 請(qǐng)確保代碼運(yùn)行環(huán)境設(shè)置了環(huán)境變量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
# 工程代碼泄露可能會(huì)導(dǎo)致 AccessKey 泄露,并威脅賬號(hào)下所有資源的安全性。以下代碼示例使用環(huán)境變量獲取 AccessKey 的方式進(jìn)行調(diào)用,僅供參考,建議使用更安全的 STS 方式
# 將<RegionId>變量替換為您待查詢的ECS實(shí)例所屬的地域ID,阿里云支持的地域信息您可以調(diào)用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')
# 設(shè)置請(qǐng)求參數(shù)的示例代碼如下,表示進(jìn)行分頁(yè)查詢,set_PageNumber指定查詢第1頁(yè)的內(nèi)容,set_PageSize指定當(dāng)前頁(yè)顯示2條數(shù)據(jù)。
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()
查詢當(dāng)前賬號(hào)支持的地域列表
創(chuàng)建文件hello_ecs_api.py。為了使用SDK,首先實(shí)例化AcsClient對(duì)象,這里需要RAM用戶的AccessKey ID和AccessKey Secret。
AccessKey ID和AccessKey Secret是RAM用戶訪問阿里云ECS服務(wù)API的密鑰,具有該賬戶完全的權(quán)限,請(qǐng)妥善保管,避免泄露。
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')
# 請(qǐng)確保代碼運(yùn)行環(huán)境設(shè)置了環(huán)境變量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
# 工程代碼泄露可能會(huì)導(dǎo)致 AccessKey 泄露,并威脅賬號(hào)下所有資源的安全性。以下代碼示例使用環(huán)境變量獲取 AccessKey 的方式進(jìn)行調(diào)用,僅供參考,建議使用更安全的 STS 方式
# 將<RegionId>變量替換為您待查詢的ECS實(shí)例所屬的地域ID,阿里云支持的地域信息您可以調(diào)用DescribeRegions查看。
clt = client.AcsClient(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], '<RegionId>')
完成實(shí)例化后。查詢當(dāng)前賬號(hào)支持的地域列表。更多信息,請(qǐng)參見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()
在命令行運(yùn)行python hello_ecs_api.py
會(huì)得到當(dāng)前支持的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實(shí)例
查詢實(shí)例列表和查詢Region列表的方法相似,替換入?yún)?duì)象為DescribeInstancesRequest并定制相關(guān)變量即可,更多查詢實(shí)例列表API的詳情,請(qǐng)參見DescribeInstances。
def list_instances():
request = DescribeInstancesRequest()
request.set_accept_format('json')
# 設(shè)置請(qǐng)求參數(shù)的示例代碼如下,表示進(jìn)行分頁(yè)查詢,set_PageNumber指定查詢第1頁(yè)的內(nèi)容,set_PageSize指定當(dāng)前頁(yè)顯示2條數(shù)據(jù)。
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()
輸出結(jié)果示例如下:
current region include instance ['i-bp165p6xk2tmdhj0****', 'i-bp1a01zbqmsun5odo****'']
更多查詢資源的API,請(qǐng)參見API概覽。例如,您可以嘗試查詢磁盤列表(DescribeDisks),替換入?yún)?duì)象為DescribeDisksRequest并定制相關(guān)變量即可。