ECS コンソールや購入ページに加え、API コードを使用して ECS インスタンスを自由に作成したり管理することができます。 ここでは、Python を使って ECS インスタンスを作成する方法について説明します。

ECS インスタンスを作成する際には、次の API に注目します。

従量課金 ECS インスタンスの作成

  • 必須属性
    • SecurityGroupId: セキュリティグループ ID。 セキュリティグループは、インスタンスのネットワークアクセスリクエストを保護するため、ファイアウォールルールに基づいてインスタンスの設定をするために使用されます。 セキュリティグループのアクセスルールを設定する際は、すべてのアクセスルールではなく、必要なアクセスルールのみ有効にすることを推奨します。 ECS コンソールでセキュリティグループを作成します。
    • InstanceType: インスタンスタイプ。 「ECS 購入ページ」をご参照ください。 オプションの “one-core 2GB n1.small” は、入力パラメーターが “ecs.n1.small” であることを表しています。
    • ImageId: イメージ ID。 「ECS コンソール」のイメージリストをご参照ください。 パブリックイメージやカスタムイメージをフィルタリングします。

    その他パラメーター設定については、「 CreateInstance」をご参照ください。

  • ECS インスタンスの作成

    次のコードは、SSD をシステムディスク、“cloud_ssd” をディスクパラメーターとして、I/O に最適化されたクラシックネットワーク ECS インスタンスの作成方法を紹介しています。

    # create one after pay ecs instance.
    def create_after_pay_instance(image_id, instance_type, security_group_id):
        request = CreateInstanceRequest();
        request.set_ImageId(image_id)
        request.set_SecurityGroupId(security_group_id)
        request.set_InstanceType(instance_type)
        request.set_IoOptimized('optimized')
        request.set_SystemDiskCategory('cloud_ssd')
        response = _send_request(request)
        instance_id = response.get('InstanceId')
        logging.info("instance %s created task submit successfully.", instance_id)
        return instance_id;

    ECS インスタンスが正常に作成されると、インスタンス ID が返されます。 作成に失敗した場合は、エラーコードが返されます。 多くのパラメーターがあるため、ECS 購入ページで調整を行うことができます。

    {"InstanceId":"i-***","RequestId":"006C1303-BAC5-48E5-BCDF-7FD5C2E6395D"}
  • ECS ライフサイクル

    異なる ECS ステータスの操作については、「ECS」 インスタンスのライフサイクル をご参照ください。

    インスタンスはステータスが "停止済" のときにのみ、スタート操作を行うことができ、ステータスが "実行中" のときのみ、"停止" 操作を行うことができます。 ECS の状態を照会するためには、パラメーターのインスタンス ID を入力すると、インスタンスリストをフィルタリングできます。 "DescribeInstancesRequest" を呼び出す場合、JSON の文字配列を入力して、リソースの状態を照会します。 単一のインスタンスの状態を照会する場合、 "DescribeInstanceAttribute" ではなく "DescribeInstances" を使用することを推奨します。前者の API のほうが多くの属性やコンテンツを返すからです。

    次のコードは、インスタンスの状態を確認する際に使用します。 システムは、インスタンスのステータスが入力パラメーターに適合した場合にのみ、インスタンスの詳細を返します。

    # output the instance owned in current region.
    def get_instance_detail_by_id(instance_id, status='Stopped'):
        logging.info("Check instance %s status is %s", instance_id, status)
        request = DescribeInstancesRequest()
        request.set_InstanceIds(json.dumps([instance_id]))
        response = _send_request(request)
        instance_detail = None
        if response is not None:
            instance_list = response.get('Instances').get('Instance')
            for item in instance_list:
                if item.get('Status') == status:
                    instance_detail = item
                    break;
            return instance_detail;
  • ECS インスタンスの開始

    ECS インスタンスが正常に作成されると、デフォルトのインスタンスは "停止済" のステータスになります。 ステータスを "実行中" に変更するには、Start コマンドを送信します。

    def start_instance(instance_id):
        request = StartInstanceRequest()
        request.set_InstanceId(instance_id)
        _send_request(request)
  • ECS インスタンスの停止

    ECS インスタンスを停止するには、入力インスタンス ID を使用します。

    def stop_instance(instance_id):
        request = StopInstanceRequest()
        request.set_InstanceId(instance_id)
        _send_request(request)
  • ECS インスタンス作成時の “ ECS 自動起動 ” の有効方法

    ECS の開始と停止操作は非同期で行われます。 スクリプトが ECS インスタンスを作成し、適切な状態にあるかどうかを検出している際に、操作を行うことができます。

    正常に作成された ECS インスタンス ID を取得した後、インスタンスのステータスが "停止済" かどうかをチェックします。 ステータスが "停止済" の場合は、ECS コマンドの Start を送信し、ECS のステータスが "実行中" に変わるまで待機します。

    def check_instance_running(instance_id):
        detail = get_instance_detail_by_id(instance_id=instance_id, status=INSTANCE_RUNNING)
        index = 0
        while detail is None and index < 60:
            detail = get_instance_detail_by_id(instance_id=instance_id);
            time.sleep(10)
        if detail and detail.get('Status') == 'Stopped':
            logging.info("instance %s is stopped now.")
            start_instance(instance_id=instance_id)
            logging.info("start instance %s job submit.")
        detail = get_instance_detail_by_id(instance_id=instance_id, status=INSTANCE_RUNNING)
        while detail is None and index < 60:
            detail = get_instance_detail_by_id(instance_id=instance_id, status=INSTANCE_RUNNING);
            time.sleep(10)
        logging.info("instance %s is running now.", instance_id)
         return instance_id;
  • パブリック IP アドレスの割り当て

    ECS インスタンスを作成する際に、パブリックネットワークの帯域幅を指定する場合は、パブリックネットワークアクセスに対するインスタンスにパブリック IP アドレスを割り当てるために API を呼び出す必要があります。 詳しくは、「AllocatePublicIpAddress」をご参照ください。

サブスクリプションモードによる ECS インスタンスの作成

API は、従量課金 ECS インスタンスに加えて、サブスクリプションモードでの ECS インスタンス作成にも対応しています。 サブスクリプションモードでの ECS インスタンス作成のプロセスは Alibaba Cloud のウェブサイトのものとは異なります。 サブスクリプションモードで作成された ECS インスタンスの料金は、自動的に引き落とされます。 ECS インスタンスを作成する前に、作成中に決済がスムーズに行われるよう、十分な口座残高やクレジット額があることを確認しておきます。

サブスクリプションモードの ECS インスタンスを作成する際、支払いオプションと期間を指定する必要があります。 次のコードでは、期間は 1 ヶ月に設定されています。

request.set_Period(1) request.set_InstanceChargeType(‘PrePaid’)

サブスクリプションモードで ECS インスタンスを作成するためのコードは次のようになります。

# create one prepay ecs instance.
def create_prepay_instance(image_id, instance_type, security_group_id):
    request = CreateInstanceRequest();
    request.set_ImageId(image_id)
    request.set_SecurityGroupId(security_group_id)
    request.set_InstanceType(instance_type)
    request.set_IoOptimized('optimized')
    request.set_SystemDiskCategory('cloud_ssd')
    request.set_Period(1)
    request.set_InstanceChargeType('PrePaid')
    response = _send_request(request)
    instance_id = response.get('InstanceId')
    logging.info("instance %s created task submit successfully.", instance_id)
    return instance_id;

完全なコード

完全なコードは以下をご参照ください。 リソースパラメーターの設定を使用します。

# 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
import time
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526. CreateInstanceRequest import CreateInstanceRequest
from aliyunsdkecs.request.v20140526. DescribeInstancesRequest import DescribeInstancesRequest
from aliyunsdkecs.request.v20140526. StartInstanceRequest import StartInstanceRequest
# configuration the log output formatter, if you want to save the output to file,
# append ",filename='ecs_invoke.log'" after datefmt.
gging.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')
 IMAGE_ID = 'ubuntu1404_64_40G_cloudinit_20160727.raw'
INSTANCE_TYPE = 'ecs.s2.large' # 2c4g generation 1
SECURITY_GROUP_ID = 'sg-****'
INSTANCE_RUNNING = 'Running'
def create_instance_action():
    instance_id = create_after_pay_instance(image_id=IMAGE_ID, instance_type=INSTANCE_TYPE,
                                            security_group_id=SECURITY_GROUP_ID)
    check_instance_running(instance_id=instance_id)
def create_prepay_instance_action():
    instance_id = create_prepay_instance(image_id=IMAGE_ID, instance_type=INSTANCE_TYPE,
                                         security_group_id=SECURITY_GROUP_ID)
    check_instance_running(instance_id=instance_id)
# create one after pay ecs instance.
def create_after_pay_instance(image_id, instance_type, security_group_id):
    request = CreateInstanceRequest();
    request.set_ImageId(image_id)
    request.set_SecurityGroupId(security_group_id)
    request.set_InstanceType(instance_type)
    request.set_IoOptimized('optimized')
    request.set_SystemDiskCategory('cloud_ssd')
    response = _send_request(request)
    instance_id = response.get('InstanceId')
    logging.info("instance %s created task submit successfully.", instance_id)
    return instance_id;
# create one prepay ecs instance.
def create_prepay_instance(image_id, instance_type, security_group_id):
    request = CreateInstanceRequest();
    request.set_ImageId(image_id)
    request.set_SecurityGroupId(security_group_id)
    request.set_InstanceType(instance_type)
    request.set_IoOptimized('optimized')
    request.set_SystemDiskCategory('cloud_ssd')
    request.set_Period(1)
    request.set_InstanceChargeType('PrePaid')
    response = _send_request(request
    instance_id = response.get('InstanceId')
    logging.info("instance %s created task submit successfully.", instance_id)
    return instance_id;
def check_instance_running(instance_id):
    detail = get_instance_detail_by_id(instance_id=instance_id, status=INSTANCE_RUNNING)
    index = 0
    while detail is None and index < 60:
        detail = get_instance_detail_by_id(instance_id=instance_id);
        time.sleep(10)
    if detail and detail.get('Status') == 'Stopped':
        logging.info("instance %s is stopped now.")
        start_instance(instance_id=instance_id)
        logging.info("start instance %s job submit.")
    detail = get_instance_detail_by_id(instance_id=instance_id, status=INSTANCE_RUNNING)
    while detail is None and index < 60:
        detail = get_instance_detail_by_id(instance_id=instance_id, status=INSTANCE_RUNNING);
        time.sleep(10)
    logging.info("instance %s is running now.", instance_id)
    return instance_id;
def start_instance(instance_id):
    request = StartInstanceRequest()
    request.set_InstanceId(instance_id)
    _send_request(request)
# output the instance owned in current region.
def get_instance_detail_by_id(instance_id, status='Stopped'):
    logging.info("Check instance %s status is %s", instance_id, status)
    request = DescribeInstancesRequest()
    request.set_InstanceIds(json.dumps([instance_id]))
    response = _send_request(request)
    instance_detail = None
    if response is not None:
        instance_list = response.get('Instances').get('Instance')
        for item in instance_list:
            if item.get('Status') == status:
                instance_detail = item
                break;
        return instance_detail;
# 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("Create ECS by OpenApi!")
    create_instance_action()
    # create_prepay_instance_action()