本教程详细介绍如何使用Alibaba Cloud SDK for Java创建专有网络VPC及其交换机、NAT网关。

前提条件

在使用本教程前,请确保已完成以下操作:
  • 使用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.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-vpc -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-vpc</artifactId>
            <version>3.0.6</version>
        </dependency>
    </dependencies>

代码示例

本文操作示例主要以代码形式体现,具体代码如下:
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vpc.model.v20160428.*;
import com.google.gson.Gson;
import java.util.UUID;

/**
 * CreateVpc        创建一个专有网络(VPC)
 * CreateVSwitch    创建一个交换机
 * CreateNatGateway 创建一个NAT网关
 */
public class Demo {

    public static void main(String[] args) {
        // 初始化公共请求参数
        IAcsClient client = initialization();
        // 创建一个专有网络VPC
        CreateVpcResponse createVpcResponse = createVpc(client);
        // 获取到新创建的专有网络VPC实例的VpcId
        String vpcId = createVpcResponse.getVpcId();
        // 创建交换机
        createVSwitch(client, vpcId);
        // 创建NAT网关
        createNatGateway(client, vpcId);
    }

    /**
     * CreateNatGateway 创建一个NAT网关
     */
    private static void createNatGateway(IAcsClient client, String vpcId) {
        CreateNatGatewayRequest request = new CreateNatGatewayRequest();
        // VPC的ID
        request.setVpcId(vpcId);
        // NAT网关的名称
        // 名称在\2,128个字符之间,必须以英文字母或中文开头,不能以 http:// 和 https:// 开头,可包含数字,“.”,“_”或“-”
        // 如果没有指定该参数,默认使用网关ID
        request.setName("TestNat");
        // NAT网关的规格。取值:
        //
        // Small(默认值):小型
        // Middle:中型
        // Large:大型
        // XLarge.1:超大型
        request.setSpec("Small");
        //  NAT网关的描述
        // 描述在2-256个字符之间,不能以 http:// 和 https:// 开头
        request.setDescription("This is a test program.");
        // 用于保证请求的幂等性。由客户端生成该参数值,要保证在不同请求间唯一,最大值不超过 64 个 ASCII 字符
        request.setClientToken(UUID.randomUUID().toString());
        try {
            CreateNatGatewayResponse response = client.getAcsResponse(request);
            System.out.println("------------------createNatGateway-------------------");
            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());
        }
    }

    /**
     * CreateVSwitch    创建一个交换机
     */
    private static void createVSwitch(IAcsClient client, String vpcId) {
        CreateVSwitchRequest request = new CreateVSwitchRequest();
        // 交换机所属的VPC ID
        request.setVpcId(vpcId);
        // 交换机的网段。交换机网段要求如下:
        //
        // 交换机网段的掩码长度范围为16-29位
        // 交换机的网段必须从属于所在VPC的网段
        // 交换机的网段不能与所在VPC中路由条目的目标网段相同,但可以是目标网段的子集
        // 如果交换机的网段与所在VPC的网段相同时,VPC只能有一个交换机
        request.setCidrBlock("172.16.0.0/24");
        // 交换机所属区的ID
        // 您可以通过调用DescribeZones接口获取地域ID
        request.setZoneId("cn-shanghai-b");
        // 交换机的描述信息
        // 长度为 2-256个字符,必须以字母或中文开头,但不能以http:// 或https://开头
        request.setDescription("This is a test program.");
        // 交换机的名称
        // 长度为 2-128个字符,必须以字母或中文开头,但不能以http:// 或https://开头
        request.setVSwitchName("TestVSwitch");
        // 客户端token,用于保证请求的幂等性
        // 由客户端生成该参数值,要保证在不同请求间唯一,最大不值过64个 ASCII 字符
        request.setClientToken(UUID.randomUUID().toString());
        try {
            CreateVSwitchResponse response = client.getAcsResponse(request);
            System.out.println("------------------createVSwitch-------------------");
            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());
        }
    }

    /**
     * CreateVpc    创建一个专有网络(VPC)
     */
    private static CreateVpcResponse createVpc(IAcsClient client) {
        CreateVpcRequest request = new CreateVpcRequest();
        // VPC的名称
        // 长度为2-128个字符,必须以字母或中文开头,可包含数字,点号(.),下划线(_)和短横线(-),但不能以http:// 或https://开头
        request.setVpcName("TestVpc");
        // VPC的网段。您可以使用以下网段或其子集:
        //
        // 10.0.0.0/8
        // 172.16.0.0/12(默认值)
        // 192.168.0.0/16
        request.setCidrBlock("172.16.0.0/12");
        // 客户端token,用于保证请求的幂等性。由客户端生成该参数值,要保证在不同请求间唯一,最大值不超过64个ASCII字符
        request.setClientToken(UUID.randomUUID().toString());
        // VPC的描述信息。长度为2-256个字符,必须以字母或中文开头,但不能以http://或https://开头
        request.setDescription("This is a test program.");
        // 是否开启IPv6网段,取值:
        //
        // false(默认值):不开启
        // true:开启
        request.setEnableIpv6(false);
        /*
         * 用户侧网络的网段,如需定义多个网段请使用半角逗号隔开,最多支持3个网段
         *
         * VPC定义的默认私网转发网段为10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、100.64.0.0/10和VPC CIDR网段。
         * 如果ECS实例或弹性网卡已经具备了公网访问能力(ECS实例分配了固定公网IP、ECS实例或弹性网卡绑定了公网IP、ECS实
         * 例或弹性网卡设置了DNAT IP映射规则),这类资源访问非上述默认私网转发网段的请求均会通过公网IP直接转发至公网。
         * 当希望按照路由表在私网(如VPC内、通过VPN/高速通道/云企业网搭建的混合云网络)转发访问非上述默认私网网段的请求
         * 时,需要将网络请求的目的网段设置为ECS或弹性网卡所在VPC的UserCidr。为VPC设置UserCidr后,该VPC中访问UserCidr
         * 地址的请求将按照路由表进行转发,而不通过公网IP转发。
         */
        request.setUserCidr("189.16.0.0/12");
        try {
            CreateVpcResponse response = client.getAcsResponse(request);
            System.out.println("------------------createVpc-------------------");
            System.out.println(new Gson().toJson(response));
            return 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());
            throw new RuntimeException(e);
        }
        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);
    }
}

执行结果

正确的执行结果类似如下:
------------------createVpc-------------------
{
  "requestId": "6BE1C6F6-8A0F-47AC-81FB-FAB894D1C591",
  "vpcId": "vpc-uf66uio7md****",
  "vRouterId": "vrt-uf64cqu16****",
  "routeTableId": "vtb-uf6b6****",
  "resourceGroupId": "rg-acfmxazb4ph6aiy"
}
------------------createVSwitch-------------------
{
  "requestId": "5DAA80CC-667C-470A-882C-ED585659976A",
  "vSwitchId": "vsw-uf6xl****"
}
------------------createNatGateway-------------------
{
  "requestId": "93DE9ED0-DB34-4E0B-99AD-C21CBB3B6DE4",
  "natGatewayId": "ngw-uf64hax****",
  "forwardTableIds": [
    "ftb-uf6s9ke1s****"
  ],
  "snatTableIds": [
    "stb-uf6q99f5****"
  ],
  "bandwidthPackageIds": []
}