前置条件
1.已 注册 华为云,并完成 实名认证
2.获取华为云开发工具包(SDK),您也可以查看安装JAVA SDK。
3.已获取华为云账号对应的Access Key(AK)和Secret Access Key(SK)。请在华为云控制台“我的凭证 > 访问密钥”页面上创建和查看您的AK/SK。具体请参见 访问密钥 。
4.已具备开发环境 ,支持Java JDK 1.8及其以上版本。
代码示例
以下代码展示如何配置云服务器高可用的虚拟IP功能
Copied!
import com.huaweicloud.sdk.core.auth.BasicCredentials;
import com.huaweicloud.sdk.core.auth.ICredential;
import com.huaweicloud.sdk.core.exception.ClientRequestException;
import com.huaweicloud.sdk.core.exception.ServerResponseException;
import com.huaweicloud.sdk.vpc.v2.VpcClient;
import com.huaweicloud.sdk.vpc.v2.model.AllowedAddressPair;
import com.huaweicloud.sdk.vpc.v2.model.CreatePortOption;
import com.huaweicloud.sdk.vpc.v2.model.CreatePortRequest;
import com.huaweicloud.sdk.vpc.v2.model.CreatePortRequestBody;
import com.huaweicloud.sdk.vpc.v2.model.CreatePortResponse;
import com.huaweicloud.sdk.vpc.v2.model.FixedIp;
import com.huaweicloud.sdk.vpc.v2.model.ListPortsRequest;
import com.huaweicloud.sdk.vpc.v2.model.ListPortsResponse;
import com.huaweicloud.sdk.vpc.v2.model.ShowSubnetRequest;
import com.huaweicloud.sdk.vpc.v2.model.ShowSubnetResponse;
import com.huaweicloud.sdk.vpc.v2.model.UpdatePortOption;
import com.huaweicloud.sdk.vpc.v2.model.UpdatePortRequest;
import com.huaweicloud.sdk.vpc.v2.model.UpdatePortRequestBody;
import com.huaweicloud.sdk.vpc.v2.model.UpdatePortResponse;
import com.huaweicloud.sdk.vpc.v2.region.VpcRegion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
public class VPCPortBindIpv6AddressDemo {
private static final Logger logger = LoggerFactory.getLogger(VPCPortBindIpv6AddressDemo.class.getName());
public static void main(String[] args) {
String ak = System.getenv("HUAWEICLOUD_SDK_AK");
String sk = System.getenv("HUAWEICLOUD_SDK_SK");
ICredential auth = new BasicCredentials()
.withAk(ak)
.withSk(sk);
VpcClient vpcClient = VpcClient.newBuilder()
.withCredential(auth)
.withRegion(VpcRegion.valueOf("cn-north-4"))
.build();
String ecsId = "{ecs_ipv6_id}";
String subnetId = "{subnet_id}";
VPCPortBindIpv6AddressDemo demo = new VPCPortBindIpv6AddressDemo();
ShowSubnetResponse showSubnetResponse = demo.showSubnet(vpcClient, subnetId);
String networkId = showSubnetResponse.getSubnet().getNeutronNetworkId();
String subnetIdV6 = showSubnetResponse.getSubnet().getNeutronSubnetIdV6();
CreatePortResponse createPortResponse = demo.createPort(vpcClient, networkId, subnetIdV6);
ListPortsResponse listPortsResponse = demo.listPorts(vpcClient, ecsId, networkId);
String portId = listPortsResponse.getPorts().get(0).getId();
String ipAddress = listPortsResponse.getPorts().get(0).getFixedIps().get(1).getIpAddress();
UpdatePortRequest updatePortRequest = new UpdatePortRequest()
.withPortId(createPortResponse.getPort().getId())
.withBody(new UpdatePortRequestBody()
.withPort(new UpdatePortOption()
.withAllowedAddressPairs(
Arrays.asList(new AllowedAddressPair().withIpAddress(ipAddress)))
)
);
demo.updatePort(vpcClient, updatePortRequest);
UpdatePortRequest updatePortReq = new UpdatePortRequest()
.withPortId(portId)
.withBody(new UpdatePortRequestBody()
.withPort(new UpdatePortOption()
.withAllowedAddressPairs(
Arrays.asList(new AllowedAddressPair().withIpAddress("1.1.1.1/0")))
)
);
demo.updatePort(vpcClient, updatePortReq);
}
public ShowSubnetResponse showSubnet(VpcClient vpcClient, String subnetId) {
ShowSubnetRequest showSubnetRequest = new ShowSubnetRequest().withSubnetId(subnetId);
ShowSubnetResponse showSubnetResponse = null;
try {
showSubnetResponse = vpcClient.showSubnet(showSubnetRequest);
logger.info(showSubnetResponse.toString());
} catch (ClientRequestException e) {
logger.error(String.valueOf(e.getHttpStatusCode()));
logger.error(e.toString());
} catch (ServerResponseException e) {
logger.error(String.valueOf(e.getHttpStatusCode()));
logger.error(e.getMessage());
}
return showSubnetResponse;
}
public CreatePortResponse createPort(VpcClient vpcClient, String networkId, String subnetIdV6) {
CreatePortRequest createPortRequest = new CreatePortRequest()
.withBody(new CreatePortRequestBody()
.withPort(new CreatePortOption()
.withNetworkId(networkId)
.withName("{port_name}")
.withDeviceOwner("neutron:VIP_PORT")
.withFixedIps(Arrays.asList(new FixedIp().
withSubnetId(subnetIdV6)))
));
CreatePortResponse createPortResponse = null;
try {
createPortResponse = vpcClient.createPort(createPortRequest);
logger.info(createPortResponse.toString());
} catch (ClientRequestException e) {
logger.error(String.valueOf(e.getHttpStatusCode()));
logger.error(e.toString());
} catch (ServerResponseException e) {
logger.error(String.valueOf(e.getHttpStatusCode()));
logger.error(e.getMessage());
}
return createPortResponse;
}
public ListPortsResponse listPorts(VpcClient vpcClient, String ecsId, String networkId) {
ListPortsRequest listPortsRequest = new ListPortsRequest().withDeviceId(ecsId).withNetworkId(networkId);
ListPortsResponse listPortsResponse = null;
try {
listPortsResponse = vpcClient.listPorts(listPortsRequest);
logger.info(listPortsResponse.toString());
} catch (ClientRequestException e) {
logger.error(String.valueOf(e.getHttpStatusCode()));
logger.error(e.toString());
} catch (ServerResponseException e) {
logger.error(String.valueOf(e.getHttpStatusCode()));
logger.error(e.getMessage());
}
return listPortsResponse;
}
public UpdatePortResponse updatePort(VpcClient vpcClient, UpdatePortRequest updatePortRequest) {
UpdatePortResponse updatePortResponse = null;
try {
updatePortResponse = vpcClient.updatePort(updatePortRequest);
logger.info(updatePortResponse.toString());
} catch (ClientRequestException e) {
logger.error(String.valueOf(e.getHttpStatusCode()));
logger.error(e.toString());
} catch (ServerResponseException e) {
logger.error(String.valueOf(e.getHttpStatusCode()));
logger.error(e.getMessage());
}
return updatePortResponse;
}
}
您可以在 虚拟私有云VPC服务文档 和API Explorer 查看具体信息。
版本说明
本示例配套的SDK版本为:3.0.59及以上版本
配置云服务器高可用的IPv6虚拟IP功能
本示例展示如何配置云服务器高可用的IPv6虚拟IP功能
功能介绍
配置云服务器高可用的IPv6虚拟IP功能
前置条件
1.已 注册 华为云,并完成 实名认证
2.获取华为云开发工具包(SDK),您也可以查看安装JAVA SDK。
3.已获取华为云账号对应的Access Key(AK)和Secret Access Key(SK)。请在华为云控制台“我的凭证 > 访问密钥”页面上创建和查看您的AK/SK。具体请参见 访问密钥 。
4.已具备开发环境 ,支持Java JDK 1.8及其以上版本。
SDK获取和安装
您可以通过Maven配置所依赖的虚拟私有云服务SDK
具体的SDK版本号请参见 SDK开发中心 (产品类别:虚拟私有云服务)
代码示例
以下代码展示如何配置云服务器高可用的虚拟IP功能
import com.huaweicloud.sdk.core.auth.BasicCredentials; import com.huaweicloud.sdk.core.auth.ICredential; import com.huaweicloud.sdk.core.exception.ClientRequestException; import com.huaweicloud.sdk.core.exception.ServerResponseException; import com.huaweicloud.sdk.vpc.v2.VpcClient; import com.huaweicloud.sdk.vpc.v2.model.AllowedAddressPair; import com.huaweicloud.sdk.vpc.v2.model.CreatePortOption; import com.huaweicloud.sdk.vpc.v2.model.CreatePortRequest; import com.huaweicloud.sdk.vpc.v2.model.CreatePortRequestBody; import com.huaweicloud.sdk.vpc.v2.model.CreatePortResponse; import com.huaweicloud.sdk.vpc.v2.model.FixedIp; import com.huaweicloud.sdk.vpc.v2.model.ListPortsRequest; import com.huaweicloud.sdk.vpc.v2.model.ListPortsResponse; import com.huaweicloud.sdk.vpc.v2.model.ShowSubnetRequest; import com.huaweicloud.sdk.vpc.v2.model.ShowSubnetResponse; import com.huaweicloud.sdk.vpc.v2.model.UpdatePortOption; import com.huaweicloud.sdk.vpc.v2.model.UpdatePortRequest; import com.huaweicloud.sdk.vpc.v2.model.UpdatePortRequestBody; import com.huaweicloud.sdk.vpc.v2.model.UpdatePortResponse; import com.huaweicloud.sdk.vpc.v2.region.VpcRegion; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; /** * 配置云服务器高可用的IPv6虚拟IP功能 */ public class VPCPortBindIpv6AddressDemo { private static final Logger logger = LoggerFactory.getLogger(VPCPortBindIpv6AddressDemo.class.getName()); public static void main(String[] args) { // 认证用的ak和sk直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); ICredential auth = new BasicCredentials() .withAk(ak) .withSk(sk); VpcClient vpcClient = VpcClient.newBuilder() .withCredential(auth) .withRegion(VpcRegion.valueOf("cn-north-4")) .build(); // 双栈ECS 北京四region目前只支持可用区2 sn3规格实例,上海一region目前只支持C3 M3规格实例 String ecsId = "{ecs_ipv6_id}"; // 云服务器所在双栈VPC下的双栈子网 String subnetId = "{subnet_id}"; VPCPortBindIpv6AddressDemo demo = new VPCPortBindIpv6AddressDemo(); // 查询subnet获取networkId ShowSubnetResponse showSubnetResponse = demo.showSubnet(vpcClient, subnetId); String networkId = showSubnetResponse.getSubnet().getNeutronNetworkId(); String subnetIdV6 = showSubnetResponse.getSubnet().getNeutronSubnetIdV6(); // 1.创建IPv6虚拟IP CreatePortResponse createPortResponse = demo.createPort(vpcClient, networkId, subnetIdV6); // 2.通过云服务器的ID查询网卡信息,fixed_ips中存在IPv4地址和IPv6地址 ListPortsResponse listPortsResponse = demo.listPorts(vpcClient, ecsId, networkId); String portId = listPortsResponse.getPorts().get(0).getId(); String ipAddress = listPortsResponse.getPorts().get(0).getFixedIps().get(1).getIpAddress(); // 3.将云服务器与虚拟IP绑定 UpdatePortRequest updatePortRequest = new UpdatePortRequest() .withPortId(createPortResponse.getPort().getId()) .withBody(new UpdatePortRequestBody() .withPort(new UpdatePortOption() .withAllowedAddressPairs( Arrays.asList(new AllowedAddressPair().withIpAddress(ipAddress))) ) ); demo.updatePort(vpcClient, updatePortRequest); // 4.关闭云服务器网卡的源/目的检查 UpdatePortRequest updatePortReq = new UpdatePortRequest() .withPortId(portId) .withBody(new UpdatePortRequestBody() .withPort(new UpdatePortOption() .withAllowedAddressPairs( Arrays.asList(new AllowedAddressPair().withIpAddress("1.1.1.1/0"))) ) ); demo.updatePort(vpcClient, updatePortReq); } public ShowSubnetResponse showSubnet(VpcClient vpcClient, String subnetId) { ShowSubnetRequest showSubnetRequest = new ShowSubnetRequest().withSubnetId(subnetId); ShowSubnetResponse showSubnetResponse = null; try { showSubnetResponse = vpcClient.showSubnet(showSubnetRequest); logger.info(showSubnetResponse.toString()); } catch (ClientRequestException e) { logger.error(String.valueOf(e.getHttpStatusCode())); logger.error(e.toString()); } catch (ServerResponseException e) { logger.error(String.valueOf(e.getHttpStatusCode())); logger.error(e.getMessage()); } return showSubnetResponse; } public CreatePortResponse createPort(VpcClient vpcClient, String networkId, String subnetIdV6) { CreatePortRequest createPortRequest = new CreatePortRequest() .withBody(new CreatePortRequestBody() .withPort(new CreatePortOption() .withNetworkId(networkId) .withName("{port_name}") .withDeviceOwner("neutron:VIP_PORT") .withFixedIps(Arrays.asList(new FixedIp(). withSubnetId(subnetIdV6))) )); CreatePortResponse createPortResponse = null; try { createPortResponse = vpcClient.createPort(createPortRequest); logger.info(createPortResponse.toString()); } catch (ClientRequestException e) { logger.error(String.valueOf(e.getHttpStatusCode())); logger.error(e.toString()); } catch (ServerResponseException e) { logger.error(String.valueOf(e.getHttpStatusCode())); logger.error(e.getMessage()); } return createPortResponse; } public ListPortsResponse listPorts(VpcClient vpcClient, String ecsId, String networkId) { ListPortsRequest listPortsRequest = new ListPortsRequest().withDeviceId(ecsId).withNetworkId(networkId); ListPortsResponse listPortsResponse = null; try { listPortsResponse = vpcClient.listPorts(listPortsRequest); logger.info(listPortsResponse.toString()); } catch (ClientRequestException e) { logger.error(String.valueOf(e.getHttpStatusCode())); logger.error(e.toString()); } catch (ServerResponseException e) { logger.error(String.valueOf(e.getHttpStatusCode())); logger.error(e.getMessage()); } return listPortsResponse; } public UpdatePortResponse updatePort(VpcClient vpcClient, UpdatePortRequest updatePortRequest) { UpdatePortResponse updatePortResponse = null; try { updatePortResponse = vpcClient.updatePort(updatePortRequest); logger.info(updatePortResponse.toString()); } catch (ClientRequestException e) { logger.error(String.valueOf(e.getHttpStatusCode())); logger.error(e.toString()); } catch (ServerResponseException e) { logger.error(String.valueOf(e.getHttpStatusCode())); logger.error(e.getMessage()); } return updatePortResponse; } }
您可以在 虚拟私有云VPC服务文档 和API Explorer 查看具体信息。
修订记录