88# Thread-local storage for progress tracking
99thread_local = threading .local ()
1010
11+
1112def get_log_group_resource_policies_count (logs_client ):
1213 """Get count of log group resource policies."""
1314 try :
@@ -17,6 +18,7 @@ def get_log_group_resource_policies_count(logs_client):
1718 print (f"Error getting resource policies: { e } " )
1819 return 0
1920
21+
2022def get_log_groups_filters (logs_client ):
2123 """Fetch all log groups and return the subscription filters."""
2224 paginator = logs_client .get_paginator ('describe_log_groups' )
@@ -41,6 +43,7 @@ def get_log_groups_filters(logs_client):
4143
4244 return log_groups_with_two_filters
4345
46+
4447def get_active_accounts ():
4548 """Get all active accounts from AWS Organizations."""
4649 print ("Fetching active accounts from AWS Organizations..." )
@@ -59,6 +62,7 @@ def get_active_accounts():
5962 print (f"Found { len (active_accounts )} active accounts" )
6063 return active_accounts
6164
65+
6266def assume_role_and_get_logs_client (account_id , role_name , region ):
6367 """Assume role in target account and return logs client."""
6468 sts_client = boto3 .client ('sts' )
@@ -78,6 +82,7 @@ def assume_role_and_get_logs_client(account_id, role_name, region):
7882 aws_session_token = credentials ['SessionToken' ]
7983 )
8084
85+
8186def process_account (account , role_name , region ):
8287 """Process a single account in a specific region and return results."""
8388 account_id = account ['Id' ]
@@ -93,24 +98,25 @@ def process_account(account, role_name, region):
9398 resource_policies_count = get_log_group_resource_policies_count (logs_client )
9499
95100 # count log groups that have two subscription filters
96- nbLogGroupsWith2Filters = sum (1 for log_group in log_groups if len (log_group ['filters' ]) == 2 )
101+ log_groups_with_two_filters_count = sum (1 for log_group in log_groups if len (log_group ['filters' ]) == 2 )
97102
98- print (f" { account_name } ({ region } ): Found { nbLogGroupsWith2Filters } log groups with 2 subscription filters" )
103+ print (f" { account_name } ({ region } ): Found { log_groups_with_two_filters_count } log groups with 2 subscription filters" )
99104 print (f" { account_name } ({ region } ): Found { resource_policies_count } log group resource policies" )
100105
101106 return {
102107 'accountId' : account_id ,
103108 'accountName' : account_name ,
104109 'region' : region ,
105110 'resourcePoliciesCount' : resource_policies_count ,
106- 'nbLogGroupsWith2Filters ' : nbLogGroupsWith2Filters ,
111+ 'logGroupsWithTwoFiltersCount ' : log_groups_with_two_filters_count ,
107112 'logGroups' : log_groups
108113 }
109114
110115 except Exception as e :
111116 print (f" { account_name } ({ region } ): Error - { e } " )
112117 return None
113118
119+
114120def main ():
115121 parser = argparse .ArgumentParser (
116122 prog = 'log-groups-check' ,
@@ -151,7 +157,12 @@ def main():
151157
152158 # Collect results as they complete
153159 for future in as_completed (future_to_pair ):
154- result = future .result ()
160+ try :
161+ result = future .result ()
162+ except Exception as e :
163+ account , region = future_to_pair [future ]
164+ print (f" { account ['Name' ]} ({ region } ): Failed to process - { e } " )
165+ result = None
155166 if result :
156167 all_results .append (result )
157168
@@ -162,23 +173,24 @@ def main():
162173 # Final report
163174 total_log_groups = sum (len (result ['logGroups' ]) for result in all_results )
164175 total_resource_policies = sum (result ['resourcePoliciesCount' ] for result in all_results )
165- print (f "\n Processing complete!" )
176+ print ("\n Processing complete!" )
166177 print (f"Results saved to: { args .output_file } " )
167178 print (f"\n Final Report: { total_log_groups } log groups across { len (all_results )} account-region combinations" )
168179 print (f"Total resource policies: { total_resource_policies } " )
169180 print ("=" * 80 )
170181
171182 for result in all_results :
172- if result ['nbLogGroupsWith2Filters ' ] > 0 or result ['resourcePoliciesCount' ] > 8 :
183+ if result ['logGroupsWithTwoFiltersCount ' ] > 0 or result ['resourcePoliciesCount' ] > 8 :
173184 print (f"\n Account: { result ['accountName' ]} ({ result ['accountId' ]} ) - Region: { result ['region' ]} " )
174185 print (f"Resource policies: { result ['resourcePoliciesCount' ]} " )
175- print (f"Log Groups with 2 filters: { ( result ['nbLogGroupsWith2Filters' ]) } " )
186+ print (f"Log Groups with 2 filters: { result ['logGroupsWithTwoFiltersCount' ] } " )
176187
177188 for lg in result ['logGroups' ]:
178189 if len (lg ['filters' ]) >= 2 :
179190 print (f" • { lg ['logGroupName' ]} " )
180191 for i , filter_info in enumerate (lg ['filters' ], 1 ):
181192 print (f" Filter { i } : { filter_info ['filterName' ]} -> { filter_info ['destinationArn' ]} " )
182193
194+
183195if __name__ == "__main__" :
184196 main ()
0 commit comments