使用API扩容ECS集群

本文介绍如何使用EDAS提供的Java SDK调用API扩容ECS集群。

前提条件

在扩容ECS集群前,您必须提前完成以下准备工作:

  • 安装EDAS的Java SDK。更多信息,请参见Java SDK接入指南

  • 确定创建ECS集群的地域。

  • 创建ECS实例。假设为i-bp13o01lzmbsvhsl****i-bp13o01lzmbsvhsl****

  • 创建ECS集群,具体操作,请参见使用API创建ECS集群

    如果您已经创建了ECS集群,则可以调用ListCluster接口查询集群列表,获取目标ECS集群的集群ID(ClusterId),假设为369d06d7-450b-4f3d-bf75-9536fcd9****

背景信息

支持调用InstallAgent接口或InsertClusterMember接口向ECS集群导入ECS实例,推荐使用InstallAgent接口,不推荐使用InsertClusterMember接口。

  • 调用InsertClusterMember接口导入ECS实例时,会重装ECS实例的操作系统,重装后,实例中所有数据都会被删除并且需要重新设置实例登录密码。因此不推荐使用该接口导入ECS实例。

  • 调用InstallAgent接口导入ECS实例时,不会重装ECS实例的操作系统。因此推荐使用该接口导入ECS实例。

购买ECS实例扩容

购买ECS实例扩容,支持以下两种方式:

  • 基于现有实例购买:需要指定现有实例的实例ID。

    //基于现有实例规则购买,ECS实例的实例ID。
    request.setTemplateInstanceId("i-bp13o01lzmbsvhsl****");
  • 基于实例启动模板购买:需要设置ECS启动模板ID和模板版本。

    //ECS启动模板ID。
    request.setTemplateId("lt-****hy9s2");     
    //ECS启动模板版本,-1代表默认的启动模板版本。
    request.setTemplateVersion("-1");
    说明

    实例启动模板用于快速创建实例的模板。模板中包含了您自主选择的用于创建实例的配置信息,所有配置为可选,能够满足不同场景的个性化需求。

    实例启动模板不支持修改,但可以创建多个版本,每个版本可以配置不同的参数,通过版本管理体现实例配置的演进过程。您可以使用模板任意一个版本创建实例。

    更多关于实例启动模板和模板版本的信息,请参见创建实例启动模板创建实例启动模板的新版本

以下代码用于在ECS集群购买ECS实例。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.edas.model.v20170801.ScaleoutApplicationWithNewInstancesRequest;
import com.aliyuncs.edas.model.v20170801.ScaleoutApplicationWithNewInstancesResponse;

public class ScaleoutApplicationWithNewInstances {

    public static void main(String[] args)  {
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        // 此处以把AccessKey和AccessKeySecret保存在环境变量为例说明。您可以根据业务需要,保存到配置文件里。
        // 强烈建议不要把AccessKey和AccessKeySecret保存到代码里,会存在密钥泄漏风险。
        String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
        String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
        //集群所在地域ID。
        String region_id = "cn-hangzhou";

        DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
        DefaultAcsClient client = new DefaultAcsClient(defaultProfile);

        //创建API请求,并设置参数。
        ScaleoutApplicationWithNewInstancesRequest request = new ScaleoutApplicationWithNewInstancesRequest();
        //需要扩容的ECS集群的集群ID。
        request.setClusterId("369d06d7-450b-4f3d-bf75-9536fcd9****");
        //基于现有实例规则购买,ECS实例的实例ID。如果是基于实例模板购买,则无需设置此参数,需要设置ECS启动模板ID和模板版本。
        request.setTemplateInstanceId("i-bp13o01lzmbsvhsl****");
        //购买的ECS实例数量。
        request.setScalingNum(2);
        //购买ECS实例的计费方式,PrePaid表示包年包月,PostPaid表示按量计费。
        request.setInstanceChargeType("PrePaid");
        //包年包月计费方式的时长单位,Month表示月,Week表示周。
        request.setInstanceChargePeriodUnit("Month");
        //购买资源的时长,时长单位为Month时可设置为:1~12和12的整数倍;时长单位为Week时可设置为:1~4。
        request.setInstanceChargePeriod(12);
        //是否开启自动续费,true表示自动续费,false表示不自动续费。
        request.setAutoRenew(true);
        //单次自动续费的续费时长,时长单位为Month时可设置为:1~12和12的整数倍;时长单位为Week时可设置为:1~4。
        request.setAutoRenewPeriod(12);


        try {
            ScaleoutApplicationWithNewInstancesResponse response = client.getAcsResponse(request);
            System.out.println("Message=" + response.getMessage() + "\nInstanceIds=" + response.getInstanceIds());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

运行程序,返回的执行结果如下:

Message=success
InstanceIds=[i-bp1ilg5114r054eo****, i-bp1ilg5114r054eo****]

添加已有ECS实例扩容

以下代码用于向ECS集群导入已有ECS实例。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.edas.model.v20170801.InstallAgentRequest;
import com.aliyuncs.edas.model.v20170801.InstallAgentResponse;

public class InstallAgent {

    public static void main(String[] args)  {
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        // 此处以把AccessKey和AccessKeySecret保存在环境变量为例说明。您可以根据业务需要,保存到配置文件里。
        // 强烈建议不要把AccessKey和AccessKeySecret保存到代码里,会存在密钥泄漏风险。
        String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
        String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
        //集群所在地域ID。
        String region_id = "cn-hangzhou";

        DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
        DefaultAcsClient client = new DefaultAcsClient(defaultProfile);

        //创建API请求,并设置参数。
        InstallAgentRequest request = new InstallAgentRequest();
        //目标ECS集群的集群ID。
        request.setClusterId("369d06d7-450b-4f3d-bf75-9536fcd9****");
        //需要导入的ECS实例ID,多个实例间以半角逗号(,)分隔。
        request.setInstanceIds("i-bp13o01lzmbsvhsl****,i-bp13o01lzmbsvhsl****");


        try {
            InstallAgentResponse response = client.getAcsResponse(request);
            System.out.println("Message=" + response.getMessage());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

运行程序,返回的执行结果如下:

Message=success

结果验证

在为ECS集群购买ECS实例或添加已有ECS实例后,都可以调用InsertClusterMember接口查询集群中ECS实例列表,根据返回结果中的ECS实例ID(EcsId)判断扩容操作是否成功。

{
  "Message": "success",
  "RequestId": "C326EF8E-048E-45C8-BE87-18D512000573",
  "ClusterMemberPage": {
    "ClusterMemberList": {
      "ClusterMember": [
        {
          "Status": 1,
          "ClusterId": "369d06d7-450b-4f3d-bf75-9536fcd9****",
          "CreateTime": 1618827574965,
          "UpdateTime": 1618827655646,
          "EcuId": "08da39f3-257c-44c4-abce-9ce31ec1****",
          "ClusterMemberId": "49eeb7fa-7c97-436f-b87f-a875a8b8****",
          "EcsId": "i-bp1ilg5114r054eo****"
        },
        {
          "Status": 1,
          "ClusterId": "369d06d7-450b-4f3d-bf75-9536fcd9****",
          "CreateTime": 1618827574957,
          "UpdateTime": 1618827655645,
          "EcuId": "8287bcf6-cde3-4377-8906-086d2c32****",
          "ClusterMemberId": "f5b30a72-7137-4b5c-8d21-a2eac2f0****",
          "EcsId": "i-bp1ilg5114r054eo****"
        }
      ]
    },
    "PageSize": 20000,
    "CurrentPage": 1,
    "TotalSize": 2
  },
  "Code": 200
}