diff --git a/moto/ec2/models/security_groups.py b/moto/ec2/models/security_groups.py index 1e458e751..0e3c91665 100644 --- a/moto/ec2/models/security_groups.py +++ b/moto/ec2/models/security_groups.py @@ -550,16 +550,19 @@ class SecurityGroupBackend: def describe_security_group_rules( self, group_ids: Optional[List[str]] = None, filters: Any = None - ) -> List[SecurityRule]: + ) -> Dict[str, List[SecurityRule]]: matches = self.describe_security_groups(group_ids=group_ids, filters=filters) if not matches: raise InvalidSecurityGroupNotFoundError( "No security groups found matching the filters provided." ) - rules = [] + rules = {} for group in matches: - rules.extend(group.ingress_rules) - rules.extend(group.egress_rules) + group_rules = [] + group_rules.extend(group.ingress_rules) + group_rules.extend(group.egress_rules) + if group_rules: + rules[group.group_id] = group_rules return rules diff --git a/moto/ec2/responses/security_groups.py b/moto/ec2/responses/security_groups.py index 2742f6518..04f2f8b54 100644 --- a/moto/ec2/responses/security_groups.py +++ b/moto/ec2/responses/security_groups.py @@ -254,22 +254,25 @@ DESCRIBE_SECURITY_GROUP_RULES_RESPONSE = """ {{ request_id }} - {% for rule in rules %} - - {% if rule.from_port is not none %} - {{ rule.from_port }} - {% endif %} - {% if rule.to_port is not none %} - {{ rule.to_port }} - {% endif %} - {% if rule.ip_ranges %} - {{ rule.ip_ranges[0]['CidrIp'] }} - {% endif %} - {{ rule.ip_protocol }} - {{ rule.owner_id }} - {{ 'true' if rule.is_egress else 'false' }} - {{ rule.id }} - + {% for group, rule_list in rules.items() %} + {% for rule in rule_list %} + + {% if rule.from_port is not none %} + {{ rule.from_port }} + {% endif %} + {% if rule.to_port is not none %} + {{ rule.to_port }} + {% endif %} + {% if rule.ip_ranges %} + {{ rule.ip_ranges[0]['CidrIp'] }} + {% endif %} + {{ rule.ip_protocol }} + {{ group }} + {{ rule.owner_id }} + {{ 'true' if rule.is_egress else 'false' }} + {{ rule.id }} + + {% endfor %} {% endfor %} """ diff --git a/tests/test_ec2/test_security_groups.py b/tests/test_ec2/test_security_groups.py index c7cc6dc87..70d859d8e 100644 --- a/tests/test_ec2/test_security_groups.py +++ b/tests/test_ec2/test_security_groups.py @@ -586,6 +586,7 @@ def test_create_and_describe_security_grp_rule(): assert rules[0]["IsEgress"] is True assert rules[0]["IpProtocol"] == "-1" assert rules[0]["CidrIpv4"] == "0.0.0.0/0" + assert "GroupId" in rules[0] @mock_ec2