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()