本教程详细介绍如何使用Alibaba Cloud SDK for Java更新安全组规则。

前提条件

在使用本教程之前,请确保已完成以下操作:

代码示例

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

/**
 * 以下是本文所需要的各API接口
 * DescribeSecurityGroups    查询您创建的安全组的基本信息集合
 * DescribeSecurityGroupAttribute    查询一个安全组的详情
 * AuthorizeSecurityGroup    增加一条安全组入方向规则
 * RevokeSecurityGroup    删除一条安全组入方向规则
 */
public class UpdataSecurityGroup {

    public static void main(String[] args) {
        // 初始化公共请求参数
        IAcsClient client = Initialization();
        // 查询安全组基本信息集合
        List<DescribeSecurityGroupsResponse.SecurityGroup> securityGroups = DescribeSecurityGroups(client);
        // 获取您所需要的安全组对象
        DescribeSecurityGroupsResponse.SecurityGroup securityGroup = securityGroups.get(0);
        String securityGroupId = securityGroup.getSecurityGroupId();
        // 查询其中一个安全组详情
        DescribeSecurityGroupAttribute(client, securityGroupId);
        // 增加一条安全组入方向规则
        AuthorizeSecurityGroup(securityGroupId, client);
        // 删除一条安全组入方向规则
        RevokeSecurityGroup(client, securityGroupId);
    }

    /**
     * RevokeSecurityGroup    删除一条安全组入方向规则
     * 必须有以下参数才能定位到一条安全组规则,进行精确删除
     * IpProtocol、PortRange、(可选)SourcePortRange、NicType、Policy、DestCidrIp 和 (可选)SourceCidrIp
     */
    private static void RevokeSecurityGroup(IAcsClient client, String securityGroupId) {
        RevokeSecurityGroupRequest request = new RevokeSecurityGroupRequest();
        // 传输层协议。参数值大小写敏感。取值范围:
        // icmp
        // gre
        // tcp
        // udp
        // all:支持所有协议
        request.setIpProtocol("udp");
        // 目的端安全组开放的传输层协议相关的端口范围。取值范围:
        // TCP/UDP协议:取值范围为1~65535。使用斜线(/)隔开起始端口和终止端口。正确示范:1/200;错误示范:200/1。
        // ICMP协议:-1/-1。
        // GRE协议:-1/-1。
        // all:-1/-1。
        request.setPortRange("1/200");
        // 网卡类型。取值范围:
        // internet:公网网卡。
        // intranet:内网网卡。
        // 当撤销安全组之间互相访问时,即指定了SourceGroupId且没有指定SourceCidrIp时,参数NicType取值只能为intranet。 默认值:internet
        request.setNicType("intranet");
        // 访问权限。取值范围:
        // accept:接受访问。
        // drop:拒绝访问,不发回拒绝信息。
        // 默认值:accept
        request.setPolicy("accept");
        // 目的端IP地址范围。支持CIDR格式和IPv4格式的IP地址范围。默认值:0.0.0.0/0
        request.setDestCidrIp("127.30.XX.XX");
        // 源端IP地址范围。支持CIDR格式和IPv4格式的IP地址范围。默认值:0.0.0.0/0
        request.setSourceCidrIp("10.X.X.X");
        // 目的端安全组ID。
        request.setSecurityGroupId(securityGroupId);
        try {
            RevokeSecurityGroupResponse response = client.getAcsResponse(request);
            System.out.println("--------------------入方向安全组删除成功--------------------");
            System.out.println(new Gson().toJson(response));
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
    }

    /**
     * 增加一条安全组入方向规则
     */
    private static void AuthorizeSecurityGroup(String securityGroupId, IAcsClient client) {
        AuthorizeSecurityGroupRequest request = new AuthorizeSecurityGroupRequest();
        // 目标安全组ID。
        request.setSecurityGroupId(securityGroupId);
        // 传输层协议。取值大小写敏感。取值范围:tcp udp icmp gre all:支持所有协议。
        request.setIpProtocol("udp");
        // SecurityGroupId方开放的传输层协议相关的端口范围。取值范围。
        // TCP/UDP协议:取值范围为1~65535。使用斜线(/)隔开起始端口和终止端口。正确示范:1/200;错误示范:200/1。
        // ICMP协议:-1/-1。
        // GRE协议:-1/-1。
        // IpProtocol取值为all:-1/-1。
        request.setPortRange("1/200");
        // 网卡类型。取值范围:
        // internet:公网网卡。
        // intranet:内网网卡。
        request.setNicType("intranet");
        // 设置访问权限。取值范围:
        // accept(默认):接受访问。
        // drop:拒绝访问,不返回拒绝信息。
        request.setPolicy("accept");
        // 安全组规则优先级。取值范围:1~100。
        request.setPriority("1");
        // 源端IPv4 CIDR地址段。支持CIDR格式和IPv4格式的IP地址范围。
        // 需要设置访问权限的源端安全组ID。至少设置一项SourceGroupId或者SourceCidrIp参数。
        // 如果指定了SourceGroupId没有指定参数SourceCidrIp,则参数NicType取值只能为intranet。
        // 如果同时指定了SourceGroupId和SourceCidrIp,则默认以SourceCidrIp为准。
        request.setSourceCidrIp("10.X.X.X");
        try {
            AuthorizeSecurityGroupResponse response = client.getAcsResponse(request);
            System.out.println("--------------------入方向安全组新增成功--------------------");
            System.out.println(new Gson().toJson(response));
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
    }

    /**
     * 查询一个安全组的详情。
     */
    private static void DescribeSecurityGroupAttribute(IAcsClient client, String securityGroupId) {
        DescribeSecurityGroupAttributeRequest request = new DescribeSecurityGroupAttributeRequest();
        request.setSecurityGroupId(securityGroupId);
        // 网卡类型 取值范围:
        // internet:公网;
        // intranet:内网;
        // 默认值:internet
        request.setNicType("internet");
        // 安全组规则授权方向。取值范围:
        // egress:安全组出方向
        // ingress:安全组入方向
        // all:不区分方向
        // 默认值:all
        request.setDirection("ingress");
        try {
            DescribeSecurityGroupAttributeResponse response = client.getAcsResponse(request);
            System.out.println("--------------------查询一个安全组的详情--------------------");
            System.out.println(new Gson().toJson(response));
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
            throw new RuntimeException();
        }

    }

    /**
     * DescribeSecurityGroups    查询您创建的安全组的基本信息集合
     */
    private static List<DescribeSecurityGroupsResponse.SecurityGroup> DescribeSecurityGroups(IAcsClient client) {
        DescribeSecurityGroupsRequest request = new DescribeSecurityGroupsRequest();
        // 网络类型
        request.setNetworkType("vpc");
        // 安全组名称
        request.setSecurityGroupName("sg-bp168k8XXXXX");
        try {
            DescribeSecurityGroupsResponse response = client.getAcsResponse(request);
            List<DescribeSecurityGroupsResponse.SecurityGroup> securityGroups = response.getSecurityGroups();
            System.out.println("--------------------查询安全组列表--------------------");
            System.out.println(new Gson().toJson(response));
            return securityGroups;
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
            throw new RuntimeException();
        }
    }

    /**
     * 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": "4D1E9065-C874-451D-9FC0-CD37CEA125EC", 
    "regionId": "cn-hangzhou", 
    "totalCount": 1, 
    "pageNumber": 1, 
    "pageSize": 10, 
    "securityGroups": [
        {
            "securityGroupId": "sg-bp168k8dwrx9b7c5b483", 
            "description": "System created security group.", 
            "securityGroupName": "sg-bp168k8XXXXX", 
            "vpcId": "vpc-bp1m7vXXXXXX", 
            "creationTime": "2019-04-08T00:07:28Z", 
            "resourceGroupId": "", 
            "tags": [...]
        }
    ]
}
--------------------查询一个安全组的详情--------------------
{
    "requestId": "D8894C74-1779-4DF4-A272-792D14DF25AE", 
    "regionId": "cn-hangzhou", 
    "securityGroupId": "sg-bp168k8XXXXX", 
    "description": "System created security group.", 
    "securityGroupName": "sg-bp168kXXXXX", 
    "vpcId": "vpc-bp1m7vXXXXX", 
    "innerAccessPolicy": "Accept", 
    "permissions": [
        {
            "ipProtocol": "TCP", 
            "portRange": "22/22", 
            "sourcePortRange": "", 
            "sourceGroupId": "sg-bp156XXXXX", 
            "sourceGroupName": "TEST", 
            "sourceCidrIp": "", 
            "policy": "Accept", 
            "nicType": "intranet", 
            "sourceGroupOwnerAccount": "", 
            "destGroupId": "", 
            "destGroupName": "", 
            "destCidrIp": "", 
            "destGroupOwnerAccount": "", 
            "priority": "1", 
            "direction": "ingress", 
            "description": "XXXXXX", 
            "createTime": "2019-08-16T05:20:48Z"
        }, 
        {
            "ipProtocol": "TCP", 
            "portRange": "80/80", 
            "sourcePortRange": "", 
            "sourceGroupId": "sg-bp156XXXXX", 
            "sourceGroupName": "TEST", 
            "sourceCidrIp": "", 
            "policy": "Accept", 
            "nicType": "intranet", 
            "sourceGroupOwnerAccount": "", 
            "destGroupId": "", 
            "destGroupName": "", 
            "destCidrIp": "", 
            "destGroupOwnerAccount": "", 
            "priority": "1", 
            "direction": "ingress", 
            "description": "XXXXXX", 
            "createTime": "2019-08-10T07:22:01Z"
        }
    ]
}
--------------------入方向安全组新增成功--------------------
{"requestId":"4ECA3CEF-E2F7-41A3-A5E6-6DF000572072"}
--------------------入方向安全组删除成功--------------------
{"requestId":"4ECA3CEF-E2F7-41A3-A5E6-6DF000572072"}