diff --git a/aws_visualizer/dot/graph_region.py b/aws_visualizer/dot/graph_region.py index ca920ce..f903de8 100644 --- a/aws_visualizer/dot/graph_region.py +++ b/aws_visualizer/dot/graph_region.py @@ -174,6 +174,8 @@ def __init__(self): self.ips = {} self.exclude_security_groups = set() self.ArnToAssume = None + self.group_pair_in_table = [] + self.group_targ_in_table = [] def connect(self): @@ -253,13 +255,13 @@ def load_assigned_security_groups(self): self.assigned_security_groups = {} for instance in self.instances: self.assigned_security_groups[instance] = list(map( - lambda g: SecurityGroup(g), instance['SecurityGroups'])) + lambda g: SecurityGroup(g), instance.get('SecurityGroups', []))) def load_assigned_lb_security_groups(self): self.assigned_lb_security_groups = {} for lb in self.loadbalancers: self.assigned_lb_security_groups[lb] = list(map( - lambda g: self.get_security_group_by_id(g), lb['SecurityGroups'])) + lambda g: self.get_security_group_by_id(g), lb.get('SecurityGroups', []))) def get_networks_of_rule_refering_to_external_address(self, vpc, rule): cidrs = rule['IpRanges'] if 'IpRanges' in rule else set() @@ -339,6 +341,11 @@ def _add_security_group_to_table(self, target, group): if group['GroupId'] in self.exclude_security_groups: return + tpair = (str(target), group['GroupId']) + if tpair in self.group_targ_in_table: + return + self.group_targ_in_table.append(tpair) + for rule in list(map(lambda r: IpPermissions(r), group['IpPermissions'])): if 'IpRanges' in rule: for cidr in rule['IpRanges']: @@ -347,6 +354,12 @@ def _add_security_group_to_table(self, target, group): if 'UserIdGroupPairs' in rule: for group_pairs in rule['UserIdGroupPairs']: + + gpair = (group['GroupId'], group_pairs['GroupId']) + if gpair in self.group_pair_in_table: + continue + self.group_pair_in_table.append(gpair) + granted_group_id = self.get_security_group_by_id(group_pairs[ 'GroupId']) sources = self.find_instances_with_assigned_security_group( @@ -371,7 +384,7 @@ def load_security_table_of_vpc(self, vpc_id): self._add_security_group_to_table(instance, group) for loadbalancer in self.get_loadbalancers_in_vpc(vpc_id): - for sg in loadbalancer['SecurityGroups']: + for sg in loadbalancer.get('SecurityGroups', []): group = self.get_security_group_by_id(sg) self._add_security_group_to_table(loadbalancer, group)