すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:再利用されたプリエンプティブルインスタンスのシステムディスクスナップショットからカスタムイメージを作成し、そのカスタムイメージから新しいインスタンスを作成して、再利用されたプリエンプティブルインスタンスのデータを復元します。

最終更新日:Aug 27, 2024

プリエンプティブルインスタンスは、価格の変動または市場の需要と供給の変化により、強制的に回収される可能性があります。 プリエンプティブルインスタンスに保存されているデータの損失を防ぐために、インスタンスのシステムディスクのスナップショットを作成し、そのスナップショットからカスタムイメージを作成できます。 次に、カスタムイメージからプリエンプティブルインスタンスを作成して、ソースプリエンプティブルインスタンスに保存されているデータを復元できます。

働くメカニズム

プリエンプティブルインスタンスを使用すると、価格の変動や市場の需要と供給の変化により、インスタンスが強制的に回収されることがあります。 インスタンスが完全に再利用される前に、インスタンスはロック状態になり、インスタンスに対して割り込みイベントがトリガーされます。

中断イベントに基づいてモニタリングメカニズムを設定し、インスタンスが期待どおりに実行されたときにシステムディスクがインスタンスとともにリリースされないように設定できます。 プリエンプティブルインスタンスの割り込みイベントを受信すると、システムはSDK for Java 2.0コードを使用してシステムディスクのスナップショットを作成し、システムディスクスナップショットからカスタムイメージを作成します。 次に、カスタムイメージからプリエンプティブルインスタンスを作成できます。 これにより、ソースプリエンプティブルインスタンスに保存されているデータを復元できます。

説明

プリエンプティブルインスタンスと一緒にリリースされないようにシステムディスクを設定できます。 プリエンプティブルインスタンスがリリースされた場合、システムディスクスナップショットとカスタムイメージは影響を受けません。

次の図は、上記のシナリオのO&Mワークフローを示しています。

image

前提条件

  • Alibaba Cloudアカウントが作成され、アカウントのAccessKeyペアが取得されます。

    Alibaba CloudアカウントのAccessKeyペアを設定して、Alibaba Cloud Elastic Compute Service (ECS) SDK for Javaを使用する必要があります。 AccessKeyペアの取得方法については、「AccessKeyペアの作成」をご参照ください。

  • 環境変数が設定されます。 詳細については、「Alibaba Cloud Darabonba SDK For Javaの使用を開始する」トピックの手順2: 環境変数の設定セクションをご参照ください。

  • 開発環境には、ECS SDK for Java 2.0がインストールされています。

    次の依存関係をMavenプロジェクトに追加する必要があります。 詳細については、「ECS SDKのインストールと使用」をご参照ください。

    <dependencies>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>ecs20140526</artifactId>
            <version>5.1.8</version>
        </dependency>
    
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>20.0</version>
        </dependency>
    
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.4</version>
        </dependency>
    
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.5</version>
        </dependency>
    
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
    
    </dependencies>
    

注意事項

重要

このトピックのサンプルコードは、参照のみに使用されます。 カスタムイメージ作成プロセスとデータ復元プロセスは、完了するのに5分以上かかる場合があります。

プリエンプティブルインスタンスに対して割り込みイベントがトリガーされた後、インスタンスが完全に要求される少なくとも5分前に通知が送信されます。 ただし、データの復元に必要な時間は、インスタンスのイメージタイプとシステムディスクのサイズによって異なります。 システムディスクのサイズが大きいほど、データの復元に時間がかかります。 サンプルコードを使用する前に、データ復元の効果を評価して確認してください。

制限事項

プリエンプティブルインスタンスのデータを復元してからインスタンスを再利用する場合、次の制限が適用されます。

  • ディスクスナップショットが失われないようにするには、ディスクのリリース中に自動スナップショットを削除する機能を無効にすることをお勧めします。

  • プリエンプティブルインスタンスのデータディスクに重要なデータが含まれている場合は、データディスクをインスタンスと一緒にリリースしないように設定することを推奨します。

  • ModifyDiskAttribute操作を呼び出し、ディスクのDeleteWithInstanceパラメーターをfalseに設定し、セキュリティ上の理由でディスクが接続されているインスタンスがロックされている場合、DeleteWithInstanceパラメーターは無視され、ディスクはインスタンスとともにリリースされます。 DescribeInstances応答のOperationLocksパラメーターにインスタンスの "LockReason" : "security" が含まれている場合、セキュリティ上の理由からインスタンスはロックされます。

    説明

    DiskIds.Nパラメーターを使用して、一度に複数のブロックストレージデバイスの属性を変更できます。 属性には、デバイス名、デバイスの説明、および関連するインスタンスとともにデバイスをリリースするかどうかが含まれます。

手順1: プリエンプティブルインスタンスの作成

このステップでは、CreateSpotInstance Javaクラスが使用されます。 次のサンプルコードは、RunInstances操作を呼び出してプリエンプティブルインスタンスを作成する方法の例を示しています。

import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.RunInstancesRequest;
import com.aliyun.ecs20140526.models.RunInstancesResponse;

public class CreateSpotInstance {
    static Client client;
    // Specify the ID of the region in which to create the preemptible instance.  
    static String regionId = "cn-hangzhou";
    // Specify the ID of the zone in which to create the preemptible instance.  
    static String zoneId = "cn-hangzhou-i";
    // Specify the instance type of the preemptible instance. 
    static String instanceType = "ecs.e-c1m1.large";
    // Specify the ID of the image to use to create the preemptible instance. 
    static String imagesId = "aliyun_3_9_x64_20G_alibase_20231219.vhd";
    // Specify the ID of the vSwitch to which to connect the preemptible instance. 
    static String vSwitchId = "<your-vSwitchId>";
    // Specify the ID of the security group to which to assign the preemptible instance. 
    static String securityGroupId = "<your-securityGroupId>";
    // Specify a preemption policy. 
    static String spotStrategy = "SpotAsPriceGo";
    // Specify the protection period of the preemptible instance. If you cannot determine the protection period, set the value to 0. 
    static Integer spotDuration = 0;
    // Specify the logon password of the preemptible instance. 
    static String password = "<your-password>";

    public static void main(String[] args) throws Exception {
        client = createClient();
        createInstance();
    }

    private static Client createClient() throws Exception {
        // If the project code is leaked, the AccessKey pair may be leaked and the security of all resources in your account may be compromised. The following sample code is provided for reference only. 
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
            // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is configured in the code runtime environment. 
            .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
            // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is configured in the code runtime environment. 
            .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Specify an endpoint. For information about endpoints, see the topic at the following URL: https://api.alibabacloud.com/product/Ecs.
        config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
        return new Client(config);
    }

    // Create a preemptible instance. 
    public static String createInstance() {
        try {
            // Configure the parameters of the RunInstances operation and send the request. 
            RunInstancesRequest request = new RunInstancesRequest();
            request.setRegionId(regionId);
            request.setZoneId(zoneId);
            request.setInstanceType(instanceType);
            request.setSpotDuration(spotDuration);
            request.setSpotStrategy(spotStrategy);
            request.setImageId(imagesId);
            request.setVSwitchId(vSwitchId);
            request.setSecurityGroupId(securityGroupId);
            // The preemption policy takes effect only when the InstanceChargeType parameter is set to PostPaid. 
            request.setInstanceChargeType("PostPaid");
            request.setPassword(password);
            request.setInternetMaxBandwidthOut(1);
            // Obtain the response and the instance ID. 
            RunInstancesResponse response = client.runInstances(request);
            if (null == response.getBody().getInstanceIdSets() || response.getBody().getInstanceIdSets().getInstanceIdSet().isEmpty()) {
                return null;
            }
            String instanceId = response.getBody().getInstanceIdSets().getInstanceIdSet().get(0);
            System.out.println("<Instance ID>:" + instanceId);
            return instanceId;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

ステップ2: システムディスクをインスタンスと一緒にリリースしないように設定する

このステップでは、DiskRelated Javaクラスが使用されます。 次のサンプルコードは、ModifyDiskAttribute操作を呼び出して、インスタンスと一緒にリリースされないようにシステムディスクを構成する方法の例を示しています。

import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeDisksRequest;
import com.aliyun.ecs20140526.models.DescribeDisksResponse;
import com.aliyun.ecs20140526.models.DescribeDisksResponseBody.DescribeDisksResponseBodyDisksDisk;
import com.aliyun.ecs20140526.models.ModifyDiskAttributeRequest;
import com.aliyun.ecs20140526.models.ModifyDiskAttributeResponse;
import org.apache.commons.collections4.CollectionUtils;

public class DiskRelated {
    static Client client;
    /**
     * Specify the region ID of the preemptible instance. 
     */
    static String regionId = "cn-hangzhou";
    /**
     * Specify the ID of the preemptible instance. 
     */
    //static String instanceId = "<your-instance-id>";
    static String instanceId = "i-bp18zj904wqnw5mc****";
    public static void main(String[] args) throws Exception {
        client = createClient();
        DescribeDisksResponseBodyDisksDisk disk = getDisks();
        if(null == disk){
            System.out.println("disk not exist");
            return;
        }
        String diskId = disk.getDiskId();
        modifyDiskAttribute(diskId);
        Boolean b = diskNotDeleteWithInstance();
        if(b){
            // Reconfigure the system disk not to be released together with the instance if the first-time configuration fails. 
            modifyDiskAttribute(diskId);
        }
    }

    /**
     * Query the details of the system disk. 
     */
    public static DescribeDisksResponseBodyDisksDisk getDisks(){
        DescribeDisksRequest request = new DescribeDisksRequest();
        request.setRegionId(regionId);
        request.setInstanceId(instanceId);
        request.setDiskType("system");
        try {
            DescribeDisksResponse response = client.describeDisks(request);

            if(CollectionUtils.isEmpty(response.getBody().getDisks().getDisk())){
                System.out.println(("disk not exist. instanceId: " + instanceId));
                return null;
            }
            DescribeDisksResponseBodyDisksDisk disk = response.getBody().getDisks()
                .getDisk().get(0);
            return disk;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Configure the system disk not to be released together with the instance. 
     */
    public static void modifyDiskAttribute(String diskId){
        ModifyDiskAttributeRequest request = new ModifyDiskAttributeRequest();
        request.setDeleteWithInstance(false);
        request.setRegionId(regionId);
        request.setDiskId(diskId);
        try {
            ModifyDiskAttributeResponse response = client.modifyDiskAttribute(request);
            System.out.println(response.getBody().getRequestId());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Check whether the system disk is configured to be released together with the instance. 
     */
    public static Boolean diskNotDeleteWithInstance(){
        DescribeDisksResponseBodyDisksDisk disks = getDisks();
        if (disks.getDeleteWithInstance()){
            System.out.println(("disk is delete with instance"));
        }else {
            System.out.println(("disk not delete with instance"));
        }
        return disks.getDeleteWithInstance();
    }

    private static Client createClient() throws Exception {
        // If the project code is leaked, the AccessKey pair may be leaked and the security of all resources in your account may be compromised. The following sample code is provided for reference only. 
        // We recommend that you use Security Token Service (STS) tokens, which provide higher security. For information about credential-based authentication methods, see the topic at the following URL: https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-access-credentials?spm=a2c63.p38356.0.0.cc196072Z9j9AY. 
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
            // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is configured in the code runtime environment. 
            .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
            // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is configured in the code runtime environment. 
            .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Specify an endpoint. For information about endpoints, see the topic at the following URL: https://api.alibabacloud.com/product/Ecs.
        config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
        return new Client(config);
    }
}

手順3: 中断イベントが検出されたときに自動的に作成されるカスタムイメージを設定する

プリエンプティブルインスタンスの中断イベントが検出された後、システムはJavaコードを使用してシステムディスクのスナップショットを作成し、システムディスクスナップショットからカスタムイメージを作成します。

このステップでは、CreateSpotImage Javaクラスが使用されます。 次の操作が順番に呼び出されます。

  • DescribeInstances操作を呼び出して、プリエンプティブルインスタンスのステータスを照会します。

  • プリエンプティブルインスタンスの割り込みイベントが検出されたら、CreateSnapshot操作を呼び出してシステムディスクのスナップショットを作成し、DescribeSnapshots操作を呼び出してスナップショットのステータスを照会します。

  • システムディスクスナップショットが作成されたら、CreateImage操作を呼び出して、スナップショットからカスタムイメージを作成します。

  • カスタムイメージが作成されたら、DescribeImages操作を呼び出して、カスタムイメージのステータスを照会します。 カスタムイメージが使用可能状態になると、メッセージが返されます。

import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.CreateImageRequest;
import com.aliyun.ecs20140526.models.CreateImageResponse;
import com.aliyun.ecs20140526.models.CreateSnapshotRequest;
import com.aliyun.ecs20140526.models.CreateSnapshotResponse;
import com.aliyun.ecs20140526.models.DescribeDisksRequest;
import com.aliyun.ecs20140526.models.DescribeDisksResponse;
import com.aliyun.ecs20140526.models.DescribeDisksResponseBody.DescribeDisksResponseBodyDisksDisk;
import com.aliyun.ecs20140526.models.DescribeImagesRequest;
import com.aliyun.ecs20140526.models.DescribeImagesResponse;
import com.aliyun.ecs20140526.models.DescribeImagesResponseBody.DescribeImagesResponseBodyImagesImage;
import com.aliyun.ecs20140526.models.DescribeInstancesRequest;
import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.ecs20140526.models.DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances;
import com.aliyun.ecs20140526.models.DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance;
import com.aliyun.ecs20140526.models.DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstanceOperationLocksLockReason;
import com.aliyun.ecs20140526.models.DescribeSnapshotsRequest;
import com.aliyun.ecs20140526.models.DescribeSnapshotsResponse;
import com.aliyun.ecs20140526.models.DescribeSnapshotsResponseBody.DescribeSnapshotsResponseBodySnapshotsSnapshot;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;

import java.util.List;

import com.alibaba.fastjson.JSON;

public class CreateSpotImage {
    static Client client;
    // Specify the region ID of the preemptible instance. 
    static String regionId = "cn-hangzhou";
    // Specify the ID of the preemptible instance. 
    static String instanceId = "<your-instanceId>";

    public static void main(String[] args) throws Exception {
        client = createClient();
        // Step 1: Wait for the preemptible instance to enter the To Be Released state and an interruption event to be generated. 
        waitForInstanceMarked();
        String diskId = getDiskId();
        // Step 2: Create a snapshot for the system disk of the preemptible instance when an interruption event occurs on the preemptible instance. 
        String snapshotId = createSnapshot(diskId);
        // Step 3: Wait until the system disk snapshot is created. 
        waitCreateSnapshotSuccess(snapshotId);
        // Step 4: Create a custom image from the system disk snapshot. 
        String imageId = createImage(snapshotId);
        // Step 5: Wait until the custom image is created. 
        waitCreateImageSuccess(imageId);
    }

    private static Client createClient() throws Exception {
        // If the project code is leaked, the AccessKey pair may be leaked and the security of all resources in your account may be compromised. The following sample code is provided for reference only. 
        // We recommend that you use STS tokens, which provide higher security. For information about credential-based authentication methods, see the topic at the following URL: https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-access-credentials?spm=a2c63.p38356.0.0.cc196072Z9j9AY. 
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
            // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is configured in the code runtime environment. 
            .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
            // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is configured in the code runtime environment. 
            .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Specify an endpoint. For information about endpoints, see the topic at the following URL: https://api.alibabacloud.com/product/Ecs.
        config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
        return new Client(config);
    }

    // Monitor the status of the preemptible instance and obtain the details of the instance when an interruption event occurs. 
    public static void waitForInstanceMarked() {
        // Convert the instance ID to a JSON string. 
        List<String> instanceIds = Lists.newArrayList();
        instanceIds.add(instanceId);
        String instanceIdStr = JSON.toJSONString(instanceIds);
        boolean isMarked = false;
        // Determine whether an interruption event occurs on the preemptible instance. 
        while (!isMarked) {
            try {
                // Configure the parameters of the DescribeInstances operation and send the request. 
                DescribeInstancesRequest request = new DescribeInstancesRequest();
                // Specify the region ID of the preemptible instance. 
                request.setRegionId(regionId);
                // Specify the ID of the preemptible instance to query the details of the instance. 
                request.setInstanceIds(instanceIdStr);
                // Obtain the response. 
                DescribeInstancesResponse response = client.describeInstances(request);
                // Obtain the response data of the preemptible instance. 
                DescribeInstancesResponseBodyInstances instances = response.getBody().getInstances();
                // If the details of the instance are not found, break out of the loop. 
                if (CollectionUtils.isEmpty(instances.getInstance())) {
                    break;
                }
                DescribeInstancesResponseBodyInstancesInstance instance = instances.getInstance().get(0);
                // If the instance is not interrupted, restart the loop. 
                if (instance.getOperationLocks() == null || instance.getOperationLocks().getLockReason().size() == 0) {
                    continue;
                }
                for (DescribeInstancesResponseBodyInstancesInstanceOperationLocksLockReason lockReason : instance
                    .getOperationLocks().getLockReason()) {
                    // If the instance is interrupted, return the ID of the instance and the cause of the interruption. 
                    System.out.println("instance:" + instance.getInstanceId() + "-->lockReason:" + lockReason.getLockReason() + ",vmStatus:" + instance.getStatus());
                    if ("Recycling".equals(lockReason.getLockReason())) {
                        isMarked = true;
                    }
                }

                Thread.sleep(2 * 1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static String getDiskId(){
        String diskId = null;
        DescribeDisksRequest request = new DescribeDisksRequest();
        request.setRegionId(regionId);
        request.setInstanceId(instanceId);
        request.setDiskType("system");
        try {
            DescribeDisksResponse response = client.describeDisks(request);

            List<DescribeDisksResponseBodyDisksDisk> disks = response.getBody().getDisks().getDisk();
            if (CollectionUtils.isEmpty(disks) ){
                System.out.println("disk not exist. instance: " + instanceId);
                return null;
            }
            diskId = disks.get(0).getDiskId();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return diskId;
    }

    /**
     * Create a snapshot for the system disk. 
     */
    public static String createSnapshot(String diskId){
        CreateSnapshotRequest request = new CreateSnapshotRequest();
        request.setDiskId(diskId);
        request.setSnapshotName("disk_test");

        try {
            CreateSnapshotResponse  response= client.createSnapshot(request);
            System.out.println(JSON.toJSONString(response.getBody()));
            System.out.println(response.getBody().getSnapshotId());
            return response.getBody().getSnapshotId();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Check whether the system disk snapshot is created. 
     */
    public static void waitCreateSnapshotSuccess(String snapshotId){
        boolean isSuccess = false;
        while (!isSuccess) {
            DescribeSnapshotsResponseBodySnapshotsSnapshot snapshot = describeSnapshots(snapshotId);
            if (null == snapshot) {
                System.err.println("image not exist. imageId: " + snapshotId);
                break;
            }
            if("accomplished".equals(snapshot.getStatus())){
                System.out.println("snapshot created successfully.");
                isSuccess = true;
            }
        }
    }

    /**
     * Call the DescribeSnapshots operation to query the status of the system disk snapshot. 
     */
    public static DescribeSnapshotsResponseBodySnapshotsSnapshot describeSnapshots(String snapshotId){
        DescribeSnapshotsRequest request = new DescribeSnapshotsRequest();
        request.setRegionId(regionId);
        List<String> snapshotIds = Lists.newArrayList(snapshotId);
        String s = JSON.toJSONString(snapshotIds);
        request.setSnapshotIds(s);
        try {
            DescribeSnapshotsResponse response = client.describeSnapshots(request);
            if (CollectionUtils.isEmpty(response.getBody().getSnapshots().getSnapshot())) {
                return null;
            }
            return  response.getBody().getSnapshots().getSnapshot().get(0);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    // Create a custom image. 
    public static String createImage(String snapshotId) {
        try {
            // Configure the request parameters of the CreateImage operation and send the request. 
            CreateImageRequest request = new CreateImageRequest();
            request.setRegionId(regionId);
            request.setSnapshotId(snapshotId);
            request.setImageName("image_test");
            // Obtain the response and the ID of the custom image. 
            CreateImageResponse response = client.createImage(request);
            System.out.println("imageID:" + response.getBody().getImageId());
            return response.getBody().getImageId();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    // Check whether the custom image is created. 
    public static void waitCreateImageSuccess(String imageId) {
        boolean isSuccess = false;
        while (!isSuccess) {
            DescribeImagesResponseBodyImagesImage image = describeImage(imageId);
            if (null == image) {
                System.err.println("image not exist. imageId: " + imageId);
                break;
            }
            if ("Available".equals(image.getStatus())) {
                System.out.println("Image created successfully.");
                isSuccess = true;
            }
        }
    }

    // Call the DescribeImages operation to query the status of the custom image. 
    public static DescribeImagesResponseBodyImagesImage describeImage(String imageId) {
        try {
            Thread.sleep(6 * 60 * 1000);
            DescribeImagesRequest imagesRequest = new DescribeImagesRequest();
            imagesRequest.setRegionId(regionId);
            imagesRequest.setImageId(imageId);
            imagesRequest.setPageSize(100);
            DescribeImagesResponse imagesResponse = client.describeImages(imagesRequest);
            if (null == imagesResponse.getBody().getImages() || CollectionUtils.isEmpty(imagesResponse.getBody().getImages().getImage())) {
                return null;
            }
            return imagesResponse.getBody().getImages().getImage().get(0);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

手順4: カスタムイメージからプリエンプティブルインスタンスを作成してデータを復元する

このステップでは、CreateSpotInstanceFromImage Javaクラスが使用されます。 次のサンプルコードでは、RunInstances操作を呼び出してカスタムイメージからプリエンプティブルインスタンスを作成する方法の例を示します。

import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.RunInstancesRequest;
import com.aliyun.ecs20140526.models.RunInstancesResponse;

public class CreateSpotInstanceFromImage {
    static Client client;
    // Specify the ID of the region in which to create the instance. We recommend that you create the instance in the same region as the source preemptible instance. 
    static String regionId = "cn-hangzhou";
    // Specify the ID of the zone in which to create the instance. We recommend that you create the instance in the same zone as the source preemptible instance. 
    static String zoneId = "cn-hangzhou-i";
    // Specify the instance type of the preemptible instance. 
    static String instanceType = "ecs.s6-c1m1.small";
    // Specify the ID of the custom image. 
    static String imagesId = "<your-imagesId>";
    // Specify the ID of the vSwitch to which to connect the preemptible instance. 
    static String vSwitchId = "<your-vSwitchId>";
    // Specify the ID of the security group to which to assign the preemptible instance. 
    static String securityGroupId = "<your-securityGroupId>";
    // Specify a preemption policy. 
    static String spotStrategy = "SpotAsPriceGo";
    // Specify the protection period of the preemptible instance. If you cannot determine the protection period, set the value to 0. 
    static Integer spotDuration = 0;
    // Specify the logon password of the preemptible instance. 
    static String password = "<your-password>";


    public static void main(String[] args) throws Exception {
        client = createClient();
        createInstance();
    }

    private static Client createClient() throws Exception {
        // If the project code is leaked, the AccessKey pair may be leaked and the security of all resources in your account may be compromised. The following sample code is provided for reference only. 
        // We recommend that you use STS tokens, which provide higher security. For information about credential-based authentication methods, see the topic at the following URL: https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-access-credentials?spm=a2c63.p38356.0.0.cc196072Z9j9AY. 
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
            // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is configured in the code runtime environment. 
            .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
            // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is configured in the code runtime environment. 
            .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Specify an endpoint. For information about endpoints, see the topic at the following URL: https://api.alibabacloud.com/product/Ecs.
        config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
        return new Client(config);
    }

    // Call the RunInstances operation to create a preemptible instance. 
    public static String createInstance() {
        try {
            RunInstancesRequest request = new RunInstancesRequest();
            request.setRegionId(regionId);
            request.setZoneId(zoneId);
            request.setInstanceType(instanceType);
            request.setSpotDuration(spotDuration);
            request.setSpotStrategy(spotStrategy);
            request.setImageId(imagesId);
            request.setVSwitchId(vSwitchId);
            request.setSecurityGroupId(securityGroupId);
            request.setInstanceChargeType("PostPaid");
            request.setPassword(password);
            request.setInternetMaxBandwidthOut(1);
            RunInstancesResponse response = client.runInstances(request);
            if (null == response.getBody().getInstanceIdSets() || response.getBody().getInstanceIdSets().getInstanceIdSet().isEmpty()) {
                return null;
            }
            String instanceId = response.getBody().getInstanceIdSets().getInstanceIdSet().get(0);
            System.out.println("Instance ID: " + instanceId);;
            return instanceId;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

関連ドキュメント

次のいずれかの方法を使用して、プリエンプティブルインスタンスのデータディスクに保存されている重要なデータを復元できます。