この記事の内容は、Alibaba Cloud ECS SDK を使用してプリエンプティブル インスタンスを合理的かつ迅速に作成および管理する方法についてです。必要な方は参考にしていただければ幸いです。 。
プリエンプティブル インスタンスの管理
準備
##操作を実行する前に、以下が必要です。 ビジネス要件を満たすインスタンスの仕様とリージョン。 Alibaba Cloud ECS SDK の基本的な知識と呼び出し方法を理解します。詳細については、SDK の使用説明書を参照してください。 注: プリエンプティブル インスタンス コードには、ECS SDK バージョン 4.2.0 以降が必要です。 Java POM 依存関係を例として、pom 依存関係を変更して導入します。<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>3.2.8</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-ecs</artifactId> <version>4.2.0</version> </dependency>
リージョンと利用可能なインスタンスの仕様をクエリします
プリエンプティブル インスタンスのリージョンと利用可能なインスタンス仕様を作成する OpenAPI DescribeZones クエリ。サンプルコードを以下に示します。OpenApiCaller.java public class OpenApiCaller { IClientProfile profile; IAcsClient client; public OpenApiCaller() { profile = DefaultProfile.getProfile("cn-hangzhou", AKSUtil.accessKeyId, AKSUtil.accessKeySecret); client = new DefaultAcsClient(profile); } public <T extends AcsResponse> T doAction(AcsRequest<T> var1) { try { return client.getAcsResponse(var1); } catch (Throwable e) { e.printStackTrace(); return null; } } } DescribeZonesSample.java public class DescribeZonesSample { public static void main(String[] args) { OpenApiCaller caller = new OpenApiCaller(); DescribeZonesRequest request = new DescribeZonesRequest(); request.setRegionId("cn-zhangjiakou");//可以通过 DescribeRegionsRequest 获取每个地域的 RegionId request.setSpotStrategy("SpotWithPriceLimit");//对于查询是否可购买抢占式实例此项必填 request.setInstanceChargeType("PostPaid");//后付费模式,抢占式实例必须是后付费模式 DescribeZonesResponse response = caller.doAction(request); System.out.println(JSON.toJSONString(response)); } }
出力結果は次のとおりです。リージョンごとに利用可能なインスタンスの仕様、ディスク タイプ、ネットワーク タイプなどの情報が表示されます。
{ "requestId": "388D6321-E587-470C-8CFA-8985E2963DAE", "zones": [ { "localName": "华北 3 可用区 A", "zoneId": "cn-zhangjiakou-a", "availableDiskCategories": [ "cloud_ssd", "cloud_efficiency" ], "availableInstanceTypes": [ "ecs.e4.large", "ecs.n4.4xlarge", "ecs.sn2.medium", "ecs.i1.2xlarge", "ecs.se1.2xlarge", "ecs.n4.xlarge", "ecs.se1ne.2xlarge", "ecs.se1.large", "ecs.sn2.xlarge", "ecs.se1ne.xlarge", "ecs.xn4.small", "ecs.sn2ne.4xlarge", "ecs.se1ne.4xlarge", "ecs.sn1.medium", "ecs.n4.8xlarge", "ecs.mn4.large", "ecs.e4.2xlarge", "ecs.mn4.2xlarge", "ecs.mn4.8xlarge", "ecs.n4.2xlarge", "ecs.e4.xlarge", "ecs.sn2ne.large", "ecs.sn2ne.xlarge", "ecs.sn1ne.large", "ecs.n4.large", "ecs.sn1.3xlarge", "ecs.e4.4xlarge", "ecs.sn1ne.2xlarge", "ecs.e4.small", "ecs.i1.4xlarge", "ecs.se1.4xlarge", "ecs.sn2ne.2xlarge", "ecs.sn2.3xlarge", "ecs.i1.xlarge", "ecs.n4.small", "ecs.sn1ne.4xlarge", "ecs.mn4.4xlarge", "ecs.sn1ne.xlarge", "ecs.se1ne.large", "ecs.sn2.large", "ecs.i1-c5d1.4xlarge", "ecs.sn1.xlarge", "ecs.sn1.large", "ecs.mn4.small", "ecs.mn4.xlarge", "ecs.se1.xlarge" ], "availableResourceCreation": [ "VSwitch", "IoOptimized", "Instance", "Disk" ], "availableResources": [ { "dataDiskCategories": [ "cloud_ssd", "cloud_efficiency" ], "instanceGenerations": [ "ecs-3", "ecs-2" ], "instanceTypeFamilies": [ "ecs.mn4", "ecs.sn1", "ecs.sn2", "ecs.sn1ne", "ecs.xn4", "ecs.i1", "ecs.se1", "ecs.e4", "ecs.n4", "ecs.se1ne", "ecs.sn2ne" ], "instanceTypes": [ "ecs.n4.4xlarge", "ecs.sn2.medium", "ecs.i1.2xlarge", "ecs.se1.2xlarge", "ecs.n4.xlarge", "ecs.se1ne.2xlarge", "ecs.se1.large", "ecs.sn2.xlarge", "ecs.se1ne.xlarge", "ecs.xn4.small", "ecs.sn2ne.4xlarge", "ecs.se1ne.4xlarge", "ecs.sn1.medium", "ecs.n4.8xlarge", "ecs.mn4.large", "ecs.mn4.2xlarge", "ecs.mn4.8xlarge", "ecs.n4.2xlarge", "ecs.sn2ne.large", "ecs.sn2ne.xlarge", "ecs.sn1ne.large", "ecs.n4.large", "ecs.sn1.3xlarge", "ecs.sn1ne.2xlarge", "ecs.e4.small", "ecs.i1.4xlarge", "ecs.se1.4xlarge", "ecs.sn2ne.2xlarge", "ecs.sn2.3xlarge", "ecs.i1.xlarge", "ecs.n4.small", "ecs.sn1ne.4xlarge", "ecs.mn4.4xlarge", "ecs.sn1ne.xlarge", "ecs.se1ne.large", "ecs.sn2.large", "ecs.i1-c5d1.4xlarge", "ecs.sn1.xlarge", "ecs.sn1.large", "ecs.mn4.small", "ecs.mn4.xlarge", "ecs.se1.xlarge" ], "ioOptimized": true, "networkTypes": [ "vpc" ], "systemDiskCategories": [ "cloud_ssd", "cloud_efficiency" ] } ], "availableVolumeCategories": [ "san_ssd", "san_efficiency" ] } ] }
プリエンプティブル インスタンスの過去の価格をクエリする
OpenAPI DescribeSpotPriceHistory を使用して、プリエンプティブル インスタンスの価格変更データをクエリします。過去 30 日間の価格性能比が最も高い地域と仕様情報を取得するためのサンプル コード (DescribeSpotPriceHistorySample.java) は次のとおりです。public class DescribeSpotPriceHistorySample { public static void main(String[] args) { OpenApiCaller caller = new OpenApiCaller(); List<DescribeSpotPriceHistoryResponse.SpotPriceType> result = new ArrayList<DescribeSpotPriceHistoryResponse.SpotPriceType>(); int offset = 0; while (true) { DescribeSpotPriceHistoryRequest request = new DescribeSpotPriceHistoryRequest(); request.setRegionId("cn-hangzhou"); //可以通过 DescribeRegionsRequest 获取可购买的每个地域的 RegionId request.setZoneId("cn-hangzhou-b");//可用区必填 request.setInstanceType("ecs.sn2.medium");//参考 DescribeZones 返回的实例类型,必填 request.setNetworkType("vpc");//参考 DescribeZones 返回的网络类型,必填 // request.setIoOptimized("optimized"); //是否 I/O 优化类型,DescribeZones 返回的 IoOptimized,选填 // request.setStartTime("2017-09-20T08:45:08Z");//价格开始时间,选填,默认 3 天内数据 // request.setEndTime("2017-09-28T08:45:08Z");//价格结束时间,选填 request.setOffset(offset); DescribeSpotPriceHistoryResponse response = caller.doAction(request); if (response != null && response.getSpotPrices() != null) { result.addAll(response.getSpotPrices()); } if (response.getNextOffset() == null || response.getNextOffset() == 0) { break; } else { offset = response.getNextOffset(); } } if (!result.isEmpty()) { for (DescribeSpotPriceHistoryResponse.SpotPriceType spotPriceType : result) { System.out.println(spotPriceType.getTimestamp() + "---> spotPrice:" + spotPriceType.getSpotPrice() + "----> originPrice:" + spotPriceType.getOriginPrice()); } System.out.println(result.size()); } else { } } }
次に、返される結果の例を示します。
2017-09-26T06:28:55Z--->spotPrice:0.24---->originPrice:1.2 2017-09-26T14:00:00Z--->spotPrice:0.36---->originPrice:1.2 2017-09-26T15:00:00Z--->spotPrice:0.24---->originPrice:1.2 2017-09-27T14:00:00Z--->spotPrice:0.36---->originPrice:1.2 2017-09-27T15:00:00Z--->spotPrice:0.24---->originPrice:1.2 2017-09-28T14:00:00Z--->spotPrice:0.36---->originPrice:1.2 2017-09-28T15:00:00Z--->spotPrice:0.24---->originPrice:1.2 2017-09-29T06:28:55Z--->spotPrice:0.24---->originPrice:1.2
プリエンプティブル インスタンスの作成
プリエンプティブル インスタンスを作成する前に、次の作業を完了する必要があります。カスタム イメージからプリエンプティブル インスタンスを作成するには、カスタム イメージを作成しておく必要があります。 コンソールでセキュリティ グループを作成するか、OpenAPI CreateSecurityGroup を使用してセキュリティ グループを作成し、セキュリティ グループ ID (SecurityGroupId) を取得します。 コンソールで VPC とスイッチを作成するか、OpenAPI CreateVpc と CreateVSwitch を使用して VPC を作成し、スイッチ ID (VSwitchId) を取得します。 OpenAPI CreateInstance を使用してプリエンプティブル インスタンスを作成します。サンプルコード(CreateInstaneSample.java)は以下のとおりです。public class CreateInstaneSample { public static void main(String[] args) { OpenApiCaller caller = new OpenApiCaller(); CreateInstanceRequest request = new CreateInstanceRequest(); request.setRegionId("cn-hangzhou");//地域 ID request.setZoneId("cn-hangzhou-b"); //可用区ID request.setSecurityGroupId("sg-bp11nhf94ivkdxwb2gd4");//提前创建的安全组 ID request.setImageId("centos_7_03_64_20G_alibase_20170818.vhd"); //建议选择您自己在该地域准备的自定义镜像 request.setVSwitchId("vsw-bp164cyonthfudn9kj5br");//VPC 类型需要交换机 ID request.setInstanceType("ecs.sn2.medium"); //填入您询价后需要购买的规格 request.setIoOptimized("optimized");//参考 DescirbeZones 返回参数 request.setSystemDiskCategory("cloud_ssd"); //参考 DescirbeZones 返回参数,多选一 cloud_ssd, cloud_efficiency, cloud request.setSystemDiskSize(40); request.setInstanceChargeType("PostPaid");//抢占式实例必须后付费 request.setSpotStrategy("SpotWithPriceLimit"); //SpotWithPriceLimit 出价模式,SpotAsPriceGo 不用出价,最高按量付费价格 request.setSpotPriceLimit(0.25F);//SpotWithPriceLimit 出价模式生效,您能接受的最高价格,单位为元每小时,必须高于当前的市场成交价才能成功 CreateInstanceResponse response = caller.doAction(request); System.out.println(response.getInstanceId()); } }
プリエンプティブル インスタンスのリサイクル
価格要因または市場の需要と供給の変化により、プリエンプティブル インスタンスが強制的にリサイクルされる場合があります。このとき、プリエンプティブル インスタンスの割り込みがトリガーされます。解放する前に、プリエンプティブル インスタンスはロック状態になり、インスタンスが自動的にリサイクルされることを示します。インスタンスのリサイクル ステータスに基づいて、インスタンスの終了ロジックを自動化できます。 現在、プリエンプティブル インスタンスの割り込みロック ステータスは、次のいずれかの方法で取得できます。 インスタンス メタデータを通じて取得します。次のコマンドを実行します。curl 'http://100.100.100.200/latest/meta-data/instance/spot/termination-time'
public class DescribeInstancesSample { public static void main(String[] args) throws InterruptedException { OpenApiCaller caller = new OpenApiCaller(); JSONArray allInstances = new JSONArray(); allInstances.addAll(Arrays.asList("i-bp18hgfai8ekoqwo0y2n", "i-bp1ecbyds24ij63w146c")); while (!allInstances.isEmpty()) { DescribeInstancesRequest request = new DescribeInstancesRequest(); request.setRegionId("cn-hangzhou"); request.setInstanceIds(allInstances.toJSONString());//指定实例 ID,效率最高 DescribeInstancesResponse response = caller.doAction(request); List<DescribeInstancesResponse.Instance> instanceList = response.getInstances(); if (instanceList != null && !instanceList.isEmpty()) { for (DescribeInstancesResponse.Instance instance : instanceList) { System.out.println ("result:instance:" + instance.getInstanceId() + ",az:" + instance.getZoneId()); if (instance.getOperationLocks() != null) { for (DescribeInstancesResponse.Instance.LockReason lockReason : instance.getOperationLocks()) { System.out.println("instance:" + instance.getInstanceId() + "--> lockReason:" + lockReason.getLockReason() + ",vmStatus:" + instance.getStatus()); if ("Recycling".equals(lockReason.getLockReason())) { //do your action System.out.println("spot instance will be recycled immediately, instance id:" + instance.getInstanceId()); allInstances.remove(instance.getInstanceId()); } } } } System.out.print("try describeInstances again later ..."); Thread.sleep(2 * 60 * 1000); } else { break; } } } }
リサイクルがトリガーされた場合の出力結果は次のとおりです:
instance:i-bp1ecbyds24ij63w146c-->lockReason:Recycling,vmStatus:Stopped spot instance will be recycled immediately, instance id:i-bp1ecbyds24ij63w146c
以上がAlibaba Cloud ECS SDK を使用してプリエンプティブル インスタンスを合理的かつ迅速に作成および管理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。