@@ -235,21 +235,25 @@ def cleanup_stack(stack_name, pattern_name):
235235 # Always clean up orphaned resources after deletion attempt
236236 print (f"[{ pattern_name } ] Cleaning up orphaned resources..." )
237237
238+ # Set AWS retry configuration to handle throttling
239+ os .environ ['AWS_MAX_ATTEMPTS' ] = '10'
240+ os .environ ['AWS_RETRY_MODE' ] = 'adaptive'
241+
238242 # ECR repositories
239243 stack_name_lower = stack_name .lower ()
240244 run_command (f"aws ecr describe-repositories --query 'repositories[?contains(repositoryName, `{ stack_name_lower } `)].repositoryName' --output text | xargs -r -n1 aws ecr delete-repository --repository-name --force" , check = False )
241245
242- # CloudWatch log groups
243- run_command (f"aws logs describe-log-groups --log-group-name-prefix '/aws/vendedlogs/states/{ stack_name } ' --query 'logGroups[].logGroupName' --output text | xargs -r -n1 aws logs delete-log-group --log-group-name" , check = False )
244- run_command (f"aws logs describe-log-groups --log-group-name-prefix '/aws/lambda/{ stack_name } ' --query 'logGroups[].logGroupName' --output text | xargs -r -n1 aws logs delete-log-group --log-group-name" , check = False )
245- run_command (f"aws logs describe-log-groups --log-group-name-prefix '/{ stack_name } ' --query 'logGroups[].logGroupName' --output text | xargs -r -n1 aws logs delete-log-group --log-group-name" , check = False )
246- run_command (f"aws logs describe-log-groups --log-group-name-prefix '/aws/codebuild/{ stack_name } ' --query 'logGroups[].logGroupName' --output text | xargs -r -n1 aws logs delete-log-group --log-group-name" , check = False )
247- # AppSync logs (get API ID first, then delete log group)
248- run_command (f"aws appsync list-graphql-apis --query 'graphqlApis[?contains(name, `{ stack_name } `)].apiId' --output text | xargs -r -I {{}} aws logs delete-log-group --log-group-name '/aws/appsync/apis/{{}}'" , check = False )
246+ # S3 buckets (empty and delete orphaned buckets)
247+ run_command (f"aws s3api list-buckets --query 'Buckets[?contains(Name, `{ stack_name } `)].Name' --output text | xargs -r -n1 -I {{}} sh -c 'aws s3 rm s3://{{}} --recursive && aws s3api delete-bucket --bucket {{}}'" , check = False )
248+
249+ # CloudWatch log groups (single comprehensive search)
249250 run_command (f"aws logs describe-log-groups --query 'logGroups[?contains(logGroupName, `{ stack_name } `)].logGroupName' --output text | xargs -r -n1 aws logs delete-log-group --log-group-name" , check = False )
250251
251- # Clean up CloudWatch Logs Resource Policy entries for deleted log groups
252- run_command (f"aws logs describe-resource-policies --query 'resourcePolicies[0].policyName' --output text | xargs -r aws logs delete-resource-policy --policy-name" , check = False )
252+ # AppSync logs (requires separate handling due to random API IDs)
253+ run_command (f"aws appsync list-graphql-apis --query 'graphqlApis[?contains(name, `{ stack_name } `)].apiId' --output text | xargs -r -I {{}} aws logs delete-log-group --log-group-name '/aws/appsync/apis/{{}}'" , check = False )
254+
255+ # Clean up CloudWatch Logs Resource Policy (ignore errors if policy doesn't exist)
256+ run_command (f"aws logs describe-resource-policies --query 'resourcePolicies[0].policyName' --output text | xargs -r aws logs delete-resource-policy --policy-name || true" , check = False )
253257
254258 print (f"[{ pattern_name } ] ✅ Cleanup completed" )
255259 except Exception as e :
0 commit comments