runbooks 1.1.3__py3-none-any.whl → 1.1.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. runbooks/__init__.py +31 -2
  2. runbooks/__init___optimized.py +18 -4
  3. runbooks/_platform/__init__.py +1 -5
  4. runbooks/_platform/core/runbooks_wrapper.py +141 -138
  5. runbooks/aws2/accuracy_validator.py +812 -0
  6. runbooks/base.py +7 -0
  7. runbooks/cfat/WEIGHT_CONFIG_README.md +1 -1
  8. runbooks/cfat/assessment/compliance.py +8 -8
  9. runbooks/cfat/assessment/runner.py +1 -0
  10. runbooks/cfat/cloud_foundations_assessment.py +227 -239
  11. runbooks/cfat/models.py +6 -2
  12. runbooks/cfat/tests/__init__.py +6 -1
  13. runbooks/cli/__init__.py +13 -0
  14. runbooks/cli/commands/cfat.py +274 -0
  15. runbooks/cli/commands/finops.py +1164 -0
  16. runbooks/cli/commands/inventory.py +379 -0
  17. runbooks/cli/commands/operate.py +239 -0
  18. runbooks/cli/commands/security.py +248 -0
  19. runbooks/cli/commands/validation.py +825 -0
  20. runbooks/cli/commands/vpc.py +310 -0
  21. runbooks/cli/registry.py +107 -0
  22. runbooks/cloudops/__init__.py +23 -30
  23. runbooks/cloudops/base.py +96 -107
  24. runbooks/cloudops/cost_optimizer.py +549 -547
  25. runbooks/cloudops/infrastructure_optimizer.py +5 -4
  26. runbooks/cloudops/interfaces.py +226 -227
  27. runbooks/cloudops/lifecycle_manager.py +5 -4
  28. runbooks/cloudops/mcp_cost_validation.py +252 -235
  29. runbooks/cloudops/models.py +78 -53
  30. runbooks/cloudops/monitoring_automation.py +5 -4
  31. runbooks/cloudops/notebook_framework.py +179 -215
  32. runbooks/cloudops/security_enforcer.py +125 -159
  33. runbooks/common/accuracy_validator.py +11 -0
  34. runbooks/common/aws_pricing.py +349 -326
  35. runbooks/common/aws_pricing_api.py +211 -212
  36. runbooks/common/aws_profile_manager.py +341 -0
  37. runbooks/common/aws_utils.py +75 -80
  38. runbooks/common/business_logic.py +127 -105
  39. runbooks/common/cli_decorators.py +36 -60
  40. runbooks/common/comprehensive_cost_explorer_integration.py +456 -464
  41. runbooks/common/cross_account_manager.py +198 -205
  42. runbooks/common/date_utils.py +27 -39
  43. runbooks/common/decorators.py +235 -0
  44. runbooks/common/dry_run_examples.py +173 -208
  45. runbooks/common/dry_run_framework.py +157 -155
  46. runbooks/common/enhanced_exception_handler.py +15 -4
  47. runbooks/common/enhanced_logging_example.py +50 -64
  48. runbooks/common/enhanced_logging_integration_example.py +65 -37
  49. runbooks/common/env_utils.py +16 -16
  50. runbooks/common/error_handling.py +40 -38
  51. runbooks/common/lazy_loader.py +41 -23
  52. runbooks/common/logging_integration_helper.py +79 -86
  53. runbooks/common/mcp_cost_explorer_integration.py +478 -495
  54. runbooks/common/mcp_integration.py +63 -74
  55. runbooks/common/memory_optimization.py +140 -118
  56. runbooks/common/module_cli_base.py +37 -58
  57. runbooks/common/organizations_client.py +176 -194
  58. runbooks/common/patterns.py +204 -0
  59. runbooks/common/performance_monitoring.py +67 -71
  60. runbooks/common/performance_optimization_engine.py +283 -274
  61. runbooks/common/profile_utils.py +248 -39
  62. runbooks/common/rich_utils.py +643 -92
  63. runbooks/common/sre_performance_suite.py +177 -186
  64. runbooks/enterprise/__init__.py +1 -1
  65. runbooks/enterprise/logging.py +144 -106
  66. runbooks/enterprise/security.py +187 -204
  67. runbooks/enterprise/validation.py +43 -56
  68. runbooks/finops/__init__.py +29 -33
  69. runbooks/finops/account_resolver.py +1 -1
  70. runbooks/finops/advanced_optimization_engine.py +980 -0
  71. runbooks/finops/automation_core.py +268 -231
  72. runbooks/finops/business_case_config.py +184 -179
  73. runbooks/finops/cli.py +660 -139
  74. runbooks/finops/commvault_ec2_analysis.py +157 -164
  75. runbooks/finops/compute_cost_optimizer.py +336 -320
  76. runbooks/finops/config.py +20 -20
  77. runbooks/finops/cost_optimizer.py +488 -622
  78. runbooks/finops/cost_processor.py +332 -214
  79. runbooks/finops/dashboard_runner.py +1006 -172
  80. runbooks/finops/ebs_cost_optimizer.py +991 -657
  81. runbooks/finops/elastic_ip_optimizer.py +317 -257
  82. runbooks/finops/enhanced_mcp_integration.py +340 -0
  83. runbooks/finops/enhanced_progress.py +40 -37
  84. runbooks/finops/enhanced_trend_visualization.py +3 -2
  85. runbooks/finops/enterprise_wrappers.py +230 -292
  86. runbooks/finops/executive_export.py +203 -160
  87. runbooks/finops/helpers.py +130 -288
  88. runbooks/finops/iam_guidance.py +1 -1
  89. runbooks/finops/infrastructure/__init__.py +80 -0
  90. runbooks/finops/infrastructure/commands.py +506 -0
  91. runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
  92. runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
  93. runbooks/finops/markdown_exporter.py +338 -175
  94. runbooks/finops/mcp_validator.py +1952 -0
  95. runbooks/finops/nat_gateway_optimizer.py +1513 -482
  96. runbooks/finops/network_cost_optimizer.py +657 -587
  97. runbooks/finops/notebook_utils.py +226 -188
  98. runbooks/finops/optimization_engine.py +1136 -0
  99. runbooks/finops/optimizer.py +25 -29
  100. runbooks/finops/rds_snapshot_optimizer.py +367 -411
  101. runbooks/finops/reservation_optimizer.py +427 -363
  102. runbooks/finops/scenario_cli_integration.py +77 -78
  103. runbooks/finops/scenarios.py +1278 -439
  104. runbooks/finops/schemas.py +218 -182
  105. runbooks/finops/snapshot_manager.py +2289 -0
  106. runbooks/finops/tests/test_finops_dashboard.py +3 -3
  107. runbooks/finops/tests/test_reference_images_validation.py +2 -2
  108. runbooks/finops/tests/test_single_account_features.py +17 -17
  109. runbooks/finops/tests/validate_test_suite.py +1 -1
  110. runbooks/finops/types.py +3 -3
  111. runbooks/finops/validation_framework.py +263 -269
  112. runbooks/finops/vpc_cleanup_exporter.py +191 -146
  113. runbooks/finops/vpc_cleanup_optimizer.py +593 -575
  114. runbooks/finops/workspaces_analyzer.py +171 -182
  115. runbooks/hitl/enhanced_workflow_engine.py +1 -1
  116. runbooks/integration/__init__.py +89 -0
  117. runbooks/integration/mcp_integration.py +1920 -0
  118. runbooks/inventory/CLAUDE.md +816 -0
  119. runbooks/inventory/README.md +3 -3
  120. runbooks/inventory/Tests/common_test_data.py +30 -30
  121. runbooks/inventory/__init__.py +2 -2
  122. runbooks/inventory/cloud_foundations_integration.py +144 -149
  123. runbooks/inventory/collectors/aws_comprehensive.py +28 -11
  124. runbooks/inventory/collectors/aws_networking.py +111 -101
  125. runbooks/inventory/collectors/base.py +4 -0
  126. runbooks/inventory/core/collector.py +495 -313
  127. runbooks/inventory/discovery.md +2 -2
  128. runbooks/inventory/drift_detection_cli.py +69 -96
  129. runbooks/inventory/find_ec2_security_groups.py +1 -1
  130. runbooks/inventory/inventory_mcp_cli.py +48 -46
  131. runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
  132. runbooks/inventory/mcp_inventory_validator.py +549 -465
  133. runbooks/inventory/mcp_vpc_validator.py +359 -442
  134. runbooks/inventory/organizations_discovery.py +56 -52
  135. runbooks/inventory/rich_inventory_display.py +33 -32
  136. runbooks/inventory/unified_validation_engine.py +278 -251
  137. runbooks/inventory/vpc_analyzer.py +733 -696
  138. runbooks/inventory/vpc_architecture_validator.py +293 -348
  139. runbooks/inventory/vpc_dependency_analyzer.py +382 -378
  140. runbooks/inventory/vpc_flow_analyzer.py +3 -3
  141. runbooks/main.py +152 -9147
  142. runbooks/main_final.py +91 -60
  143. runbooks/main_minimal.py +22 -10
  144. runbooks/main_optimized.py +131 -100
  145. runbooks/main_ultra_minimal.py +7 -2
  146. runbooks/mcp/__init__.py +36 -0
  147. runbooks/mcp/integration.py +679 -0
  148. runbooks/metrics/dora_metrics_engine.py +2 -2
  149. runbooks/monitoring/performance_monitor.py +9 -4
  150. runbooks/operate/dynamodb_operations.py +3 -1
  151. runbooks/operate/ec2_operations.py +145 -137
  152. runbooks/operate/iam_operations.py +146 -152
  153. runbooks/operate/mcp_integration.py +1 -1
  154. runbooks/operate/networking_cost_heatmap.py +33 -10
  155. runbooks/operate/privatelink_operations.py +1 -1
  156. runbooks/operate/rds_operations.py +223 -254
  157. runbooks/operate/s3_operations.py +107 -118
  158. runbooks/operate/vpc_endpoints.py +1 -1
  159. runbooks/operate/vpc_operations.py +648 -618
  160. runbooks/remediation/base.py +1 -1
  161. runbooks/remediation/commons.py +10 -7
  162. runbooks/remediation/commvault_ec2_analysis.py +71 -67
  163. runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
  164. runbooks/remediation/multi_account.py +24 -21
  165. runbooks/remediation/rds_snapshot_list.py +91 -65
  166. runbooks/remediation/remediation_cli.py +92 -146
  167. runbooks/remediation/universal_account_discovery.py +83 -79
  168. runbooks/remediation/workspaces_list.py +49 -44
  169. runbooks/security/__init__.py +19 -0
  170. runbooks/security/assessment_runner.py +1150 -0
  171. runbooks/security/baseline_checker.py +812 -0
  172. runbooks/security/cloudops_automation_security_validator.py +509 -535
  173. runbooks/security/compliance_automation_engine.py +17 -17
  174. runbooks/security/config/__init__.py +2 -2
  175. runbooks/security/config/compliance_config.py +50 -50
  176. runbooks/security/config_template_generator.py +63 -76
  177. runbooks/security/enterprise_security_framework.py +1 -1
  178. runbooks/security/executive_security_dashboard.py +519 -508
  179. runbooks/security/integration_test_enterprise_security.py +5 -3
  180. runbooks/security/multi_account_security_controls.py +959 -1210
  181. runbooks/security/real_time_security_monitor.py +422 -444
  182. runbooks/security/run_script.py +1 -1
  183. runbooks/security/security_baseline_tester.py +1 -1
  184. runbooks/security/security_cli.py +143 -112
  185. runbooks/security/test_2way_validation.py +439 -0
  186. runbooks/security/two_way_validation_framework.py +852 -0
  187. runbooks/sre/mcp_reliability_engine.py +6 -6
  188. runbooks/sre/production_monitoring_framework.py +167 -177
  189. runbooks/tdd/__init__.py +15 -0
  190. runbooks/tdd/cli.py +1071 -0
  191. runbooks/utils/__init__.py +14 -17
  192. runbooks/utils/logger.py +7 -2
  193. runbooks/utils/version_validator.py +51 -48
  194. runbooks/validation/__init__.py +6 -6
  195. runbooks/validation/cli.py +9 -3
  196. runbooks/validation/comprehensive_2way_validator.py +754 -708
  197. runbooks/validation/mcp_validator.py +906 -228
  198. runbooks/validation/terraform_citations_validator.py +104 -115
  199. runbooks/validation/terraform_drift_detector.py +447 -451
  200. runbooks/vpc/README.md +617 -0
  201. runbooks/vpc/__init__.py +8 -1
  202. runbooks/vpc/analyzer.py +577 -0
  203. runbooks/vpc/cleanup_wrapper.py +476 -413
  204. runbooks/vpc/cli_cloudtrail_commands.py +339 -0
  205. runbooks/vpc/cli_mcp_validation_commands.py +480 -0
  206. runbooks/vpc/cloudtrail_audit_integration.py +717 -0
  207. runbooks/vpc/config.py +92 -97
  208. runbooks/vpc/cost_engine.py +411 -148
  209. runbooks/vpc/cost_explorer_integration.py +553 -0
  210. runbooks/vpc/cross_account_session.py +101 -106
  211. runbooks/vpc/enhanced_mcp_validation.py +917 -0
  212. runbooks/vpc/eni_gate_validator.py +961 -0
  213. runbooks/vpc/heatmap_engine.py +190 -162
  214. runbooks/vpc/mcp_no_eni_validator.py +681 -640
  215. runbooks/vpc/nat_gateway_optimizer.py +358 -0
  216. runbooks/vpc/networking_wrapper.py +15 -8
  217. runbooks/vpc/pdca_remediation_planner.py +528 -0
  218. runbooks/vpc/performance_optimized_analyzer.py +219 -231
  219. runbooks/vpc/runbooks_adapter.py +1167 -241
  220. runbooks/vpc/tdd_red_phase_stubs.py +601 -0
  221. runbooks/vpc/test_data_loader.py +358 -0
  222. runbooks/vpc/tests/conftest.py +314 -4
  223. runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
  224. runbooks/vpc/tests/test_cost_engine.py +0 -2
  225. runbooks/vpc/topology_generator.py +326 -0
  226. runbooks/vpc/unified_scenarios.py +1302 -1129
  227. runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
  228. runbooks-1.1.5.dist-info/METADATA +328 -0
  229. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/RECORD +233 -200
  230. runbooks/finops/README.md +0 -414
  231. runbooks/finops/accuracy_cross_validator.py +0 -647
  232. runbooks/finops/business_cases.py +0 -950
  233. runbooks/finops/dashboard_router.py +0 -922
  234. runbooks/finops/ebs_optimizer.py +0 -956
  235. runbooks/finops/embedded_mcp_validator.py +0 -1629
  236. runbooks/finops/enhanced_dashboard_runner.py +0 -527
  237. runbooks/finops/finops_dashboard.py +0 -584
  238. runbooks/finops/finops_scenarios.py +0 -1218
  239. runbooks/finops/legacy_migration.py +0 -730
  240. runbooks/finops/multi_dashboard.py +0 -1519
  241. runbooks/finops/single_dashboard.py +0 -1113
  242. runbooks/finops/unlimited_scenarios.py +0 -393
  243. runbooks-1.1.3.dist-info/METADATA +0 -799
  244. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/WHEEL +0 -0
  245. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/entry_points.txt +0 -0
  246. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/licenses/LICENSE +0 -0
  247. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/top_level.txt +0 -0
@@ -13,7 +13,7 @@ Features:
13
13
  - Token expiration prediction and silent refresh
14
14
 
15
15
  Author: DevSecOps Security Engineer - CloudOps Runbooks Team
16
- Version: 0.9.1
16
+ Version: latest version
17
17
  Security Focus: Enterprise AWS Account Protection
18
18
  """
19
19
 
@@ -31,67 +31,67 @@ from runbooks.common.rich_utils import console
31
31
  class AWSProfileSanitizer:
32
32
  """
33
33
  Enterprise-grade AWS profile name sanitization for security logging.
34
-
34
+
35
35
  Prevents AWS account ID exposure in logs while maintaining audit trail integrity.
36
36
  Following FAANG security-as-code principles for sensitive identifier protection.
37
37
  """
38
-
38
+
39
39
  # Pattern to detect AWS account IDs in profile names
40
- ACCOUNT_ID_PATTERN = re.compile(r'\b\d{12}\b')
41
-
40
+ ACCOUNT_ID_PATTERN = re.compile(r"\b\d{12}\b")
41
+
42
42
  # Pattern to detect enterprise profile patterns
43
- ENTERPRISE_PROFILE_PATTERN = re.compile(r'(ams|aws)-.*-ReadOnlyAccess-(\d{12})')
44
-
43
+ ENTERPRISE_PROFILE_PATTERN = re.compile(r"(ams|aws)-.*-ReadOnlyAccess-(\d{12})")
44
+
45
45
  @classmethod
46
46
  def sanitize_profile_name(cls, profile_name: str, mask_style: str = "***masked***") -> str:
47
47
  """
48
48
  Sanitize AWS profile name by masking account IDs for secure logging.
49
-
49
+
50
50
  Replaces 12-digit AWS account IDs with masked values to prevent account enumeration
51
51
  while preserving profile identification capabilities for audit purposes.
52
-
52
+
53
53
  Args:
54
54
  profile_name: Original AWS profile name
55
55
  mask_style: Masking pattern for account IDs (default: ***masked***)
56
-
56
+
57
57
  Returns:
58
58
  Sanitized profile name with masked account IDs
59
-
59
+
60
60
  Example:
61
61
  'my-billing-profile-123456789012' → 'my-billing-profile-***masked***'
62
62
  """
63
63
  if not profile_name:
64
64
  return profile_name
65
-
65
+
66
66
  # Check for enterprise pattern first (more specific)
67
67
  if cls.ENTERPRISE_PROFILE_PATTERN.match(profile_name):
68
- return cls.ENTERPRISE_PROFILE_PATTERN.sub(r'\1-masked-ReadOnlyAccess-***masked***', profile_name)
69
-
68
+ return cls.ENTERPRISE_PROFILE_PATTERN.sub(r"\1-masked-ReadOnlyAccess-***masked***", profile_name)
69
+
70
70
  # General account ID masking
71
71
  return cls.ACCOUNT_ID_PATTERN.sub(mask_style, profile_name)
72
-
72
+
73
73
  @classmethod
74
74
  def sanitize_profile_list(cls, profiles: List[str]) -> List[str]:
75
75
  """
76
76
  Sanitize a list of AWS profile names for secure logging.
77
-
77
+
78
78
  Args:
79
79
  profiles: List of AWS profile names
80
-
80
+
81
81
  Returns:
82
82
  List of sanitized profile names
83
83
  """
84
84
  return [cls.sanitize_profile_name(profile) for profile in profiles]
85
-
85
+
86
86
  @classmethod
87
87
  def create_secure_log_context(cls, profile: str, operation: str) -> Dict[str, str]:
88
88
  """
89
89
  Create secure logging context with sanitized profile information.
90
-
90
+
91
91
  Args:
92
92
  profile: AWS profile name
93
93
  operation: Operation being performed
94
-
94
+
95
95
  Returns:
96
96
  Dictionary with sanitized context for secure logging
97
97
  """
@@ -99,14 +99,14 @@ class AWSProfileSanitizer:
99
99
  "operation": operation,
100
100
  "profile_sanitized": cls.sanitize_profile_name(profile),
101
101
  "profile_type": cls._classify_profile_type(profile),
102
- "timestamp": datetime.utcnow().isoformat()
102
+ "timestamp": datetime.utcnow().isoformat(),
103
103
  }
104
-
104
+
105
105
  @classmethod
106
106
  def _classify_profile_type(cls, profile_name: str) -> str:
107
107
  """Classify profile type for enhanced logging context."""
108
108
  profile_lower = profile_name.lower()
109
-
109
+
110
110
  if "billing" in profile_lower:
111
111
  return "billing"
112
112
  elif "management" in profile_lower:
@@ -122,109 +122,104 @@ class AWSProfileSanitizer:
122
122
  class AWSTokenManager:
123
123
  """
124
124
  Proactive AWS token management with security-focused error handling.
125
-
125
+
126
126
  Implements proactive token refresh, retry logic, and enhanced error messaging
127
127
  to reduce authentication timing exposure and improve operational security.
128
128
  """
129
-
129
+
130
130
  # Token refresh thresholds
131
131
  TOKEN_REFRESH_THRESHOLD_MINUTES = 15 # Refresh if expires within 15 minutes
132
132
  MAX_RETRY_ATTEMPTS = 3
133
133
  RETRY_BACKOFF_BASE = 2 # Exponential backoff base (seconds)
134
-
134
+
135
135
  def __init__(self, profile_name: str):
136
136
  """Initialize token manager for specific AWS profile."""
137
137
  self.profile_name = profile_name
138
138
  self.sanitized_profile = AWSProfileSanitizer.sanitize_profile_name(profile_name)
139
139
  self._session = None
140
140
  self._last_refresh_check = None
141
-
141
+
142
142
  def get_secure_session(self, force_refresh: bool = False) -> boto3.Session:
143
143
  """
144
144
  Get AWS session with proactive token refresh and security enhancements.
145
-
145
+
146
146
  Implements:
147
147
  - Proactive token expiration checking
148
148
  - Silent token refresh before expiration
149
149
  - Exponential backoff retry logic
150
150
  - Security-aware error messages
151
-
151
+
152
152
  Args:
153
153
  force_refresh: Force token refresh regardless of expiration status
154
-
154
+
155
155
  Returns:
156
156
  Boto3 session with valid credentials
157
-
157
+
158
158
  Raises:
159
159
  SecurityError: For authentication security issues
160
160
  TokenRefreshError: For token refresh failures
161
161
  """
162
162
  current_time = datetime.utcnow()
163
-
163
+
164
164
  # Check if proactive refresh is needed
165
- if (force_refresh or
166
- self._session is None or
167
- self._needs_token_refresh(current_time)):
168
-
165
+ if force_refresh or self._session is None or self._needs_token_refresh(current_time):
169
166
  self._session = self._refresh_session_with_retry()
170
167
  self._last_refresh_check = current_time
171
-
168
+
172
169
  # Log secure refresh event
173
- console.log(
174
- f"[dim green]✅ Token refresh completed for profile: {self.sanitized_profile}[/]"
175
- )
176
-
170
+ console.log(f"[dim green]✅ Token refresh completed for profile: {self.sanitized_profile}[/]")
171
+
177
172
  return self._session
178
-
173
+
179
174
  def _needs_token_refresh(self, current_time: datetime) -> bool:
180
175
  """Check if proactive token refresh is needed."""
181
176
  if self._last_refresh_check is None:
182
177
  return True
183
-
178
+
184
179
  # Check every 5 minutes to avoid excessive API calls
185
180
  if (current_time - self._last_refresh_check) < timedelta(minutes=5):
186
181
  return False
187
-
182
+
188
183
  try:
189
184
  # Test session validity with STS call
190
185
  if self._session:
191
- sts_client = self._session.client('sts')
186
+ sts_client = self._session.client("sts")
192
187
  sts_client.get_caller_identity()
193
188
  return False # Session still valid
194
189
  except ClientError as e:
195
- error_code = e.response.get('Error', {}).get('Code', '')
196
- if error_code in ['ExpiredToken', 'InvalidToken', 'TokenRefreshRequired']:
190
+ error_code = e.response.get("Error", {}).get("Code", "")
191
+ if error_code in ["ExpiredToken", "InvalidToken", "TokenRefreshRequired"]:
197
192
  return True
198
-
193
+
199
194
  return False
200
-
195
+
201
196
  def _refresh_session_with_retry(self) -> boto3.Session:
202
197
  """Refresh session with exponential backoff retry logic."""
203
198
  last_exception = None
204
-
199
+
205
200
  for attempt in range(self.MAX_RETRY_ATTEMPTS):
206
201
  try:
207
202
  # Create new session
208
203
  session = boto3.Session(profile_name=self.profile_name)
209
-
204
+
210
205
  # Validate session with STS call
211
- sts_client = session.client('sts')
206
+ sts_client = session.client("sts")
212
207
  caller_identity = sts_client.get_caller_identity()
213
-
208
+
214
209
  # Log successful refresh (with sanitized profile)
215
210
  console.log(
216
211
  f"[dim cyan]🔄 Session validated for {self.sanitized_profile} "
217
212
  f"(attempt {attempt + 1}/{self.MAX_RETRY_ATTEMPTS})[/]"
218
213
  )
219
-
214
+
220
215
  return session
221
-
216
+
222
217
  except (ClientError, NoCredentialsError, TokenRetrievalError) as e:
223
218
  last_exception = e
224
-
219
+
225
220
  if attempt < self.MAX_RETRY_ATTEMPTS - 1:
226
221
  # Wait with exponential backoff
227
- wait_time = self.RETRY_BACKOFF_BASE ** attempt
222
+ wait_time = self.RETRY_BACKOFF_BASE**attempt
228
223
  console.log(
229
224
  f"[yellow]⏳ Token refresh attempt {attempt + 1} failed, "
230
225
  f"retrying in {wait_time}s for {self.sanitized_profile}[/]"
@@ -233,17 +228,17 @@ class AWSTokenManager:
233
228
  else:
234
229
  # Final attempt failed, provide enhanced guidance
235
230
  self._handle_token_refresh_failure(last_exception)
236
-
231
+
237
232
  # If we get here, all attempts failed
238
233
  raise TokenRefreshError(
239
234
  f"Failed to refresh AWS session for profile {self.sanitized_profile} "
240
235
  f"after {self.MAX_RETRY_ATTEMPTS} attempts"
241
236
  )
242
-
237
+
243
238
  def _handle_token_refresh_failure(self, error: Exception) -> None:
244
239
  """Provide enhanced guidance for token refresh failures."""
245
240
  error_str = str(error)
246
-
241
+
247
242
  # Determine error type for appropriate guidance
248
243
  if "ExpiredToken" in error_str or "InvalidToken" in error_str:
249
244
  console.log(
@@ -275,59 +270,59 @@ class AWSTokenManager:
275
270
 
276
271
  class SecurityError(Exception):
277
272
  """Raised for AWS security-related errors."""
273
+
278
274
  pass
279
275
 
280
276
 
281
277
  class TokenRefreshError(Exception):
282
278
  """Raised for AWS token refresh failures."""
279
+
283
280
  pass
284
281
 
285
282
 
286
283
  def create_secure_aws_session(profile_name: str, operation_context: str = "aws_operation") -> boto3.Session:
287
284
  """
288
285
  Create secure AWS session with enterprise security enhancements.
289
-
286
+
290
287
  This is the primary entry point for secure AWS session creation across
291
288
  all CloudOps modules. Implements:
292
-
289
+
293
290
  - Profile name sanitization for secure logging
294
291
  - Proactive token refresh
295
292
  - Enhanced error handling
296
293
  - Security audit trail
297
-
294
+
298
295
  Args:
299
296
  profile_name: AWS profile name
300
297
  operation_context: Description of the operation for audit logging
301
-
298
+
302
299
  Returns:
303
300
  Secure boto3 session with valid credentials
304
-
301
+
305
302
  Raises:
306
303
  SecurityError: For security-related authentication issues
307
304
  TokenRefreshError: For token refresh failures
308
-
305
+
309
306
  Example:
310
307
  session = create_secure_aws_session("my-billing-profile-123456789012", "cost_analysis")
311
308
  """
312
309
  # Create secure logging context
313
310
  log_context = AWSProfileSanitizer.create_secure_log_context(profile_name, operation_context)
314
-
311
+
315
312
  console.log(
316
313
  f"[dim cyan]🔐 Initiating secure AWS session for {log_context['profile_sanitized']} "
317
314
  f"({log_context['profile_type']} profile)[/]"
318
315
  )
319
-
316
+
320
317
  try:
321
318
  # Initialize token manager and get secure session
322
319
  token_manager = AWSTokenManager(profile_name)
323
320
  session = token_manager.get_secure_session()
324
-
325
- console.log(
326
- f"[dim green]✅ Secure session established for {log_context['profile_sanitized']}[/]"
327
- )
328
-
321
+
322
+ console.log(f"[dim green]✅ Secure session established for {log_context['profile_sanitized']}[/]")
323
+
329
324
  return session
330
-
325
+
331
326
  except Exception as e:
332
327
  console.log(
333
328
  f"[red]❌ Failed to create secure session for {log_context['profile_sanitized']}: {str(e)[:100]}[/]"
@@ -338,10 +333,10 @@ def create_secure_aws_session(profile_name: str, operation_context: str = "aws_o
338
333
  def sanitize_aws_error_message(error_message: str) -> str:
339
334
  """
340
335
  Sanitize AWS error messages to remove sensitive account information.
341
-
336
+
342
337
  Args:
343
338
  error_message: Original AWS error message
344
-
339
+
345
340
  Returns:
346
341
  Sanitized error message with account IDs masked
347
342
  """
@@ -351,10 +346,10 @@ def sanitize_aws_error_message(error_message: str) -> str:
351
346
  def get_profile_classification(profile_name: str) -> Dict[str, str]:
352
347
  """
353
348
  Get security classification information for AWS profile.
354
-
349
+
355
350
  Args:
356
351
  profile_name: AWS profile name
357
-
352
+
358
353
  Returns:
359
354
  Dictionary with profile security classification
360
355
  """
@@ -363,5 +358,5 @@ def get_profile_classification(profile_name: str) -> Dict[str, str]:
363
358
  "original": profile_name,
364
359
  "sanitized": sanitizer.sanitize_profile_name(profile_name),
365
360
  "type": sanitizer._classify_profile_type(profile_name),
366
- "risk_level": "high" if "admin" in profile_name.lower() else "medium"
367
- }
361
+ "risk_level": "high" if "admin" in profile_name.lower() else "medium",
362
+ }