如何使用 OpenAPI 代碼來(lái)彈性地創(chuàng)建和管理ECS

本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于如何使用 openapi 代碼來(lái)彈性地創(chuàng)建和管理ecs,有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。

彈性創(chuàng)建 ECS 實(shí)例

創(chuàng)建 ECS 時(shí)需關(guān)注以下 API:

創(chuàng)建ECS實(shí)例

查詢實(shí)例列表

啟動(dòng)ECS實(shí)例

分配公網(wǎng)IP地址

前提條件

開通按量付費(fèi)產(chǎn)品,您的賬戶余額不得少于 100 元,更多的需求參見 ECS使用須知。您需要在阿里云的費(fèi)用中心確保自己的余額充足。

創(chuàng)建按量云服務(wù)器

創(chuàng)建云服務(wù)器時(shí)的必選屬性:

SecurityGroupId:安全組 ID。安全組通過(guò)防火墻規(guī)則實(shí)現(xiàn)對(duì)一組實(shí)例的配置,保護(hù)實(shí)例的網(wǎng)絡(luò)出入請(qǐng)求。在設(shè)置安全組出入規(guī)則時(shí),建議按需開放而不要默認(rèn)開放所有的出入規(guī)則。您也可以通過(guò) ECS 控制臺(tái)創(chuàng)建安全組。

InstanceType:實(shí)例規(guī)格。參考 ECS 售賣頁(yè)的選項(xiàng),界面上 1 核 2GB n1.small則入?yún)?ecs.n1.small。

ImageId:鏡像 ID。參考ECS控制臺(tái)的鏡像列表,您可以過(guò)濾系統(tǒng)公共鏡像或者自定義鏡像。

更多參數(shù)設(shè)置請(qǐng)參考創(chuàng)建 ECS 實(shí)例。

創(chuàng)建云服務(wù)器

如下面的代碼所示,創(chuàng)建一臺(tái)經(jīng)典網(wǎng)絡(luò)的ECS,使用系統(tǒng)盤ssd,盤參數(shù)為cloud_ssd,選擇io優(yōu)化實(shí)例optimized。

#?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;

創(chuàng)建成功后將返回相應(yīng)的實(shí)例 ID,失敗的話也會(huì)有對(duì)應(yīng)的 ErrorCode。由于參數(shù)較多,您可以參考 ECS 的售賣頁(yè)進(jìn)行調(diào)整。

{"InstanceId":"i-***","RequestId":"006C1303-BAC5-48E5-BCDF-7FD5C2E6395D"}

云服務(wù)器生命周期

對(duì)于云服務(wù)器的狀態(tài)操作, 請(qǐng)參考云服務(wù)器實(shí)例生命周期。

只有Stopped狀態(tài)的實(shí)例可以執(zhí)行 Start 操作。也只有Running狀態(tài)的 ECS 可以執(zhí)行Stop操作。查詢?cè)品?wù)器的狀態(tài)可以通過(guò)查詢實(shí)例列表傳入 InstanceId 進(jìn)行過(guò)濾。在DescribeInstancesRequest時(shí)可以通過(guò)傳入一個(gè) JSON 數(shù)組格式的 String 就可以查詢這個(gè)資源的狀態(tài)。查詢單個(gè)實(shí)例的狀態(tài)建議使用DescribeInstances而不要使用DescribeInstanceAttribute, 因?yàn)榍罢弑群笳叻祷馗嗟膶傩院蛢?nèi)容。

下面的代碼會(huì)檢查實(shí)例的狀態(tài),只有實(shí)例的狀態(tài)符合入?yún)⒉艜?huì)返回實(shí)例的詳情。

#?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;

啟動(dòng)云服務(wù)器

創(chuàng)建成功后的 ECS 默認(rèn)狀態(tài)是Stopped。如果要啟動(dòng) ECS 實(shí)例為Running狀態(tài),只需要發(fā)送啟動(dòng)指令即可。

def?start_instance(instance_id): ????request?=?StartInstanceRequest() ????request.set_InstanceId(instance_id) ????_send_request(request)

停止云服務(wù)器

停止云服務(wù)器只需傳入instanceId即可。

def?stop_instance(instance_id): ????request?=?StopInstanceRequest() ????request.set_InstanceId(instance_id) ????_send_request(request)

創(chuàng)建時(shí)啟動(dòng)“自動(dòng)啟動(dòng)云服務(wù)器”

服務(wù)器的啟動(dòng)和停止都是一個(gè)異步操作,您可以在腳本創(chuàng)建并同時(shí)檢測(cè)云服務(wù)器符合狀態(tài)時(shí)執(zhí)行相應(yīng)操作。

創(chuàng)建資源后得到實(shí)例ID,首先判斷實(shí)例是否處于Stopped的狀態(tài),如果處于Stopped狀態(tài),下發(fā)Start服務(wù)器的指令,然后等待服務(wù)器的狀態(tài)變成Running。

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?<p><span style="font-size: 20px;"><strong>分配公網(wǎng)IP</strong></span></p><p>如果在創(chuàng)建云服務(wù)器的過(guò)程中,指定了公網(wǎng)帶寬,若需要公網(wǎng)的訪問(wèn)權(quán)限還要調(diào)用API來(lái)分配公網(wǎng)IP。詳情請(qǐng)參考:分配公網(wǎng) IP 地址。</p><p><span style="font-size: 20px;"><strong>包年包月的資源創(chuàng)建</strong></span></p><p>除了創(chuàng)建按量服務(wù)的云服務(wù)器,您的API還支持創(chuàng)建包年包月的服務(wù)器。包年包月的創(chuàng)建和官網(wǎng)的創(chuàng)建流程不同,使用的是自動(dòng)扣費(fèi)的模式,也就是說(shuō)您需要在創(chuàng)建服務(wù)器之前確保賬號(hào)有足夠的余額或者信用額度,在創(chuàng)建的時(shí)候?qū)⒅苯涌圪M(fèi)。</p><p>和按量付費(fèi)的 ECS 相比,只需要指定付費(fèi)類型和時(shí)長(zhǎng)即可,下面的時(shí)長(zhǎng)為1個(gè)月。</p><pre class="brush:js;toolbar:false">?request.set_Period(1)????request.set_InstanceChargeType(‘PrePaid’)

創(chuàng)建包年包月實(shí)例的整體的代碼如下:

#?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;

完整的代碼

完整的代碼如下,您可以按照自己的資源參數(shù)進(jìn)行設(shè)置。

#??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. 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') 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?

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享