API を使用することで、リソースの作成や日常的な管理のための ECS コンソールの利用に加え、リソースの管理やカスタマイズもできます。 API は、より柔軟な ECS インスタンス管理と設定を提供します。 Alibaba Cloud では、API を一つの SDK 中にカプセル化することにより、既存システムに ECS インスタンスの管理機能を統合します。 このトピックでは、Python の開発に基づき API を介してインスタンスを管理する方法について説明します。 Python の開発経験がない場合でも簡単に ECS インスタンスの開発ができます。

RAM ユーザーの "AccessKey" 取得

API を使用して ECS インスタンスを管理する場合は、"AccessKey" ( "AccessKey ID" と "AccessKey Secret" ) が必要です。 クラウドサービスのセキュリティを維持するためには、RAM ユーザーを作成し、その "AccessKey" を生成し、ECS リソースのみを管理するために RAM ユーザーを認証する必要があります。 その後、RAM ユーザーとその "AccessKey" を使用して、API で ECS リソースを管理できるようになります。

RAM ユーザーの "AccessKey" を取得するには、次の手順に従います。

  1. RAM ユーザーを作成し、"AccessKey" を取得します。
  2. RAM ユーザへの権限を直接付与します。 ECS リソースを管理するためには、RAM ユーザーに "AliyunECSFullAccess" を付与する必要があります。

ECS Python SDK のインストール

Python 実行環境がインストールされていることを確認します。 ここでは、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 を使用するには、RAM ユーザーの "AccessKey" を使用して "AcsClient" オブジェクトをインスタンス化する必要があります。

"AccessKey" により、RAM ユーザーは Alibaba Cloud API にアクセスできるようになり、このユーザーのフルアクセスが許可されます。 "Access Key" は安全に保管します。
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')

"AcsClient" オブジェクトがインスタンス化されたら、最初のアプリケーションを開発できます。 アカウントが対応しているリージョンのリストを照会します。 詳しくは、「 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", 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" を実行して、対応しているリージョンのリストを取得します。 アウトプットは次のようになります。

[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']

現在のリージョンの ECS インスタンスリスト照会

インスタンスリストを照会する手順は、リージョンリストの場合と似ています。 必要な作業は、入力パラメーター "DescribeRegionsRequest" を "DescribeInstancesRequest" に置き換えるだけです。 クエリパラメーター一覧については「DescribeInstances」をご参照ください。

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 の概要」をご参照ください。 ディスク一覧の照会をしたい場合は、"DescribeInstancesRequest" を "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 の操作」をご参照ください。