全部產品
Search
文件中心

:查詢ECS執行個體

更新時間:Jun 19, 2024

除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:

  1. 建立RAM使用者。具體操作,請參見建立RAM使用者

  2. 擷取RAM使用者AccessKey。具體操作,請參見建立AccessKey

  3. 為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並定製相關變數即可。