文档

使用Alibaba Cloud ESS SDK快速创建多可用区伸缩组

更新时间:

本文以Java语言和Python语言为例介绍如何使用Alibaba Cloud ESS SDK快速创建多可用区的伸缩组。

前提条件

  • 使用本教程进行操作前,请确保您已经注册了阿里云账号。如还未注册,请先完成账号注册

  • 已配置Alibaba Cloud Credentials。

    通过配置环境变量(ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET)的方式配置Alibaba Cloud Credentials工具的身份验证,实现以非AK硬编码的方式访问阿里云OpenAPI。更多信息,请参见默认凭据链

背景信息

创建专有网络伸缩组时,您需要配置伸缩组对应的交换机,伸缩组创建完成后,通过该伸缩组弹性扩张的ECS实例也都使用该交换机。由于原弹性伸缩服务限定一个专有网络伸缩组只能配置一个交换机,而一个交换机只归属于一个可用区,当您配置好伸缩组的交换机以后,如果交换机所在的可用区因库存不足等原因不能创建ECS实例,您伸缩组中的伸缩配置、伸缩规则以及伸缩组对应的报警任务等都将失效。

基于上述问题,您可以通过使用Alibaba Cloud ESS SDK快速创建多可用区伸缩组(为伸缩组新增多可用区参数VSwitchIds.N)来优化该问题。创建伸缩组时,您可以使用该参数为伸缩组配置多个交换机,当一个交换机所在可用区无法创建ECS实例的时候,弹性伸缩服务会为您自动切换到其他交换机所在的可用区,从而提高伸缩组的可用性。

注意事项

为了提高伸缩组的可用性,创建伸缩组时,您可以新增多可用区参数(VSwitchIds.N)为伸缩组配置多个交换机,使用该参数时需要注意以下几点:

  • 使用VSwitchIds.N多可用区参数时,VSwitchId参数将被忽略。

  • VSwitchIds.N可用区参数中,N代表交换机的优先级(N的取值范围:1~5),编号为1的交换机为创建实例的第一选择,交换机优先级随编号的增大依次降低。

    当优先级较高的交换机所在可用区无法创建实例时,会自动选择下一优先级的交换机来创建实例。在使用多可用区参数时,建议设置同一地域下不同可用区的交换机,降低因单可用区库存不足无法创建ECS实例的概率。

  • VSwitchIds.N可用区参数中,指定的多个交换机必须在同一个专有网络下。

使用Alibaba Cloud ESS SDK for Java创建多可用区伸缩组

  1. 导入Alibaba Cloud ESS SDK for Java。

    使用Maven来管理您Java项目的依赖库,在项目对应的pom.xml文件中加入下面依赖:

    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>tea-openapi</artifactId>
      <version>0.2.8</version>
    </dependency>
     <dependency>
          <groupId>com.aliyun</groupId>
          <artifactId>ess20220222</artifactId>
          <version>1.0.5</version>
        </dependency>
        <dependency>
          <groupId>com.aliyun</groupId>
          <artifactId>credentials-java</artifactId>
          <version>0.2.11</version>
        </dependency>
  2. 使用Java SDK创建多可用区伸缩组。

    将Alibaba Cloud ESS SDK for Java导入到Java工程后,您即可以通过SDK编码创建多可用区伸缩组,示例代码如下:

    import com.aliyun.teaopenapi.models.Config;
    import java.util.Arrays;
    import java.util.List;
    
    public class EssSdkDemo {
        public static final String       REGION_ID          = "cn-hangzhou";
        public static final Integer      MAX_SIZE           = 10;
        public static final Integer      MIN_SIZE           = 1;
        public static final String       SCALING_GROUP_NAME = "TestScalingGroup";
    
        //交换机列表,交换机优先级从前往后依次降低,第一位的交换机优先级最高。
        public static final String[]     vswitchIdArray     = { "vsw-id1", "vsw-id2" };
        public static final List<String> vswitchIds         = Arrays.asList(vswitchIdArray);
    
        public static void main(String[] args) throws Exception {
            com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
            com.aliyun.teaopenapi.models.Config config = new Config();
            config.setCredential(credentialClient);
            config.setEndpoint("ess.aliyuncs.com");
            com.aliyun.ess20220222.Client client = new com.aliyun.ess20220222.Client(config);
            createScalingGroup(client);
    
        }
    
        public static String createScalingGroup(com.aliyun.ess20220222.Client client) throws Exception {
            com.aliyun.ess20220222.models.CreateScalingGroupRequest request = new com.aliyun.ess20220222.models.CreateScalingGroupRequest();
            request.setRegionId(REGION_ID);
            request.setMaxSize(MAX_SIZE);
            request.setMinSize(MIN_SIZE);
            request.setScalingGroupName(SCALING_GROUP_NAME);
            request.setVSwitchIds(vswitchIds);
            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
            com.aliyun.ess20220222.models.CreateScalingGroupResponse scalingGroupWithOptions = client.createScalingGroupWithOptions(request, runtime);
            return scalingGroupWithOptions.getBody().toMap().toString();
        }
    
    }       

    上述代码中,vSwitch的优先级随其在列表中出现的顺序依次降低,排在列表最前面的vSwitch优先级最高。

使用Alibaba Cloud ESS SDK for Python创建多可用区伸缩组

  1. 安装Alibaba Cloud ESS SDK for Python。

    执行以下命令,安装以下两个依赖。

    pip install alibabacloud_ess20220222==1.7.4
  2. 使用Python SDK创建多可用区伸缩组。

    导入Alibaba Cloud ESS SDK for Python依赖库后,您即可通过SDK编码创建多可用区伸缩组,示例代码如下:

    # -*- coding: utf-8 -*-
    import os
    import sys
    
    from typing import List
    
    from alibabacloud_ess20220222.client import Client as Ess20220222Client
    from alibabacloud_tea_openapi import models as open_api_models
    from alibabacloud_ess20220222 import models as ess_20220222_models
    from alibabacloud_tea_util import models as util_models
    from alibabacloud_tea_util.client import Client as UtilClient
    
    
    class Sample:
        def __init__(self):
            pass
    
        @staticmethod
        def create_client() -> Ess20220222Client:
            """
            使用AK&SK初始化账号Client
            @return: Client
            @throws Exception
            """
            # 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
            config = open_api_models.Config(
                # 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。,
                access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
                # 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。,
                access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
            )
            config.endpoint = f'ess.aliyuncs.com'
            return Ess20220222Client(config)
    
        @staticmethod
        def main(
                args: List[str],
        ) -> None:
            client = Sample.create_client()
            create_scaling_group_request = ess_20220222_models.CreateScalingGroupRequest(
                region_id='cn-hangzhou',
                scaling_group_name='py-sdk-create-scaling-group-sample',
                min_size=1,
                max_size=1,
                v_switch_ids=[
                    'vsw-bp******g',
                    'vsw-bp******y'
                ]
            )
            runtime = util_models.RuntimeOptions()
            try:
                # 复制代码运行请自行打印 API 的返回值
                client.create_scaling_group_with_options(create_scaling_group_request, runtime)
            except Exception as error:
                # 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
                # 错误 message
                print(error.message)
                # 诊断地址
                print(error.data.get("Recommend"))
                UtilClient.assert_as_string(error.message)
    
    
    if __name__ == '__main__':
        Sample.main(sys.argv[1:])
    

    上述代码中,以Python 3.9版本为例,其中,vSwitch的优先级随其在列表中出现的顺序依次降低,排在列表最前面的vSwitch优先级最高。