本教程详细介绍如何使用Alibaba Cloud SDK for Java为一台ECS实例挂载已购买的按量付费的数据盘。

前提条件

在使用本教程之前,请确保已完成以下操作:
  • 使用ECS管理控制台或通过API获取您需要的ECS实例ID,API接口请参见DescribeInstances
  • 使用Alibaba Cloud SDK for Java,您需要一个阿里云账号和访问密钥(AccessKey)。 请在阿里云控制台中的AccessKey管理页面上创建和查看您的AccessKey。
  • 确保您已经安装了Alibaba Cloud SDK for Java,准确的SDK版本号,请参见 阿里云开发工具包(SDK)
    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.4.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-ecs-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-ecs</artifactId>
            <version>4.17.4</version>
        </dependency>
    </dependencies>

代码示例

说明 待挂载的ECS实例的状态必须为运行中(Running)或者已停止(Stopped)。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ecs.model.v20140526.AttachDiskRequest;
import com.aliyuncs.ecs.model.v20140526.AttachDiskResponse;
import com.aliyuncs.ecs.model.v20140526.DescribeDisksRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeDisksResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.util.List;

/**
 * DescribeDisks    查询一块或多块您已经创建的云盘以及本地盘。
 * AttachDisk    为一台ECS实例挂载一块按量付费数据盘。
 */
public class TestAttachDisk {

    // (ECS实例ID)
    private static String instanceId = "i-bp1332junn5uiqg7ekr3";

    public static void main(String[] args) {
        IAcsClient client = Initialization();
        List<DescribeDisksResponse.Disk> disks = DescribeDisks(client);
        // 本示例只做简单处理来获取云盘ID,请您按照实际情况来修改此处代码
        try {
            // 获取云盘或本地盘ID。
            String diskId = disks.get(0).getDiskId();
            AttachDisk(client, instanceId, diskId);
        } catch (NullPointerException e) {
            System.out.println("--------------------没有获取到可用云盘--------------------");
            System.out.println(e);
        }
    }

    /**
     * AttachDisk    为一台ECS实例挂载一块按量付费数据盘。
     */
    private static void AttachDisk(IAcsClient client, String instanceId, String diskId) {
        AttachDiskRequest request = new AttachDiskRequest();
        // 待挂载的ECS实例ID。
        request.setInstanceId(instanceId);
        // 待挂载的云盘ID。云盘(DiskId)和实例(InstanceId)必须在同一个可用区。
        request.setDiskId(diskId);
        // 释放实例时,该云盘是否随实例一起释放。
        // 默认值:False。
        request.setDeleteWithInstance(false);
        try {
            AttachDiskResponse response = client.getAcsResponse(request);
            System.out.println("--------------------云盘挂载成功--------------------");
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
    }

    /**
     * DescribeDisks    查询一块或多块您已经创建的云盘以及本地盘。
     */
    private static List<DescribeDisksResponse.Disk> DescribeDisks(IAcsClient client) {
        DescribeDisksRequest request = new DescribeDisksRequest();
        // 云盘种类。取值范围:
        // all:所有云盘以及本地盘
        // cloud:普通云盘
        // cloud_efficiency:高效云盘
        // cloud_ssd:SSD盘
        // cloud_essd:ESSD云盘
        // local_ssd_pro:I/O密集型本地盘
        // local_hdd_pro:吞吐密集型本地盘
        // ephemeral:(已停售)本地盘
        // ephemeral_ssd:(已停售)本地SSD盘
        // 默认值:all
        request.setCategory("cloud_ssd");
        // 云盘或本地盘的计费方式。取值范围:
        // PrePaid:包年包月
        // PostPaid:按量付费
        request.setDiskChargeType("PrePaid");
        request.setStatus("Available");
        try {
            DescribeDisksResponse response = client.getAcsResponse(request);
            System.out.println("--------------------可用云盘的详细信息--------------------");
            System.out.println(new Gson().toJson(response));
            return response.getDisks();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
        return null;
    }

    /**
     * Initialization  初始化请求参数
     */
    private static IAcsClient Initialization() {
        // 初始化请求参数
        DefaultProfile profile = DefaultProfile.getProfile(
                "<your-region-id>", // 您的可用区ID
                "<your-access-key-id>", // 您的AccessKey ID
                "<your-access-key-secret>"); // 您的AccessKey Secret
        return new DefaultAcsClient(profile);
    }
}

执行结果

正确的返回结果类似如下:
--------------------可用云盘的详细信息--------------------
{
    "requestId": "61C43B32-A5D9-4608-956E-430E8F202A3B", 
    "totalCount": 1, 
    "pageNumber": 1, 
    "pageSize": 10, 
    "disks": [
        { ... }
    ]
}
--------------------云盘挂载成功--------------------
{
"RequestId":"473469C7-AA6F-4DC5-B3DB-A3DC0DE3C83E"
}