regscale-cli 6.27.3.0__py3-none-any.whl → 6.28.0.0__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.
Potentially problematic release.
This version of regscale-cli might be problematic. Click here for more details.
- regscale/_version.py +1 -1
- regscale/core/app/utils/app_utils.py +11 -2
- regscale/dev/cli.py +26 -0
- regscale/dev/version.py +72 -0
- regscale/integrations/commercial/__init__.py +15 -1
- regscale/integrations/commercial/amazon/amazon/__init__.py +0 -0
- regscale/integrations/commercial/amazon/amazon/common.py +204 -0
- regscale/integrations/commercial/amazon/common.py +48 -58
- regscale/integrations/commercial/aws/audit_manager_compliance.py +2671 -0
- regscale/integrations/commercial/aws/cli.py +3093 -55
- regscale/integrations/commercial/aws/cloudtrail_control_mappings.py +333 -0
- regscale/integrations/commercial/aws/cloudtrail_evidence.py +501 -0
- regscale/integrations/commercial/aws/cloudwatch_control_mappings.py +357 -0
- regscale/integrations/commercial/aws/cloudwatch_evidence.py +490 -0
- regscale/integrations/commercial/aws/config_compliance.py +914 -0
- regscale/integrations/commercial/aws/conformance_pack_mappings.py +198 -0
- regscale/integrations/commercial/aws/evidence_generator.py +283 -0
- regscale/integrations/commercial/aws/guardduty_control_mappings.py +340 -0
- regscale/integrations/commercial/aws/guardduty_evidence.py +1053 -0
- regscale/integrations/commercial/aws/iam_control_mappings.py +368 -0
- regscale/integrations/commercial/aws/iam_evidence.py +574 -0
- regscale/integrations/commercial/aws/inventory/__init__.py +223 -22
- regscale/integrations/commercial/aws/inventory/base.py +107 -5
- regscale/integrations/commercial/aws/inventory/resources/audit_manager.py +513 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudtrail.py +315 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudtrail_logs_metadata.py +476 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudwatch.py +191 -0
- regscale/integrations/commercial/aws/inventory/resources/compute.py +66 -9
- regscale/integrations/commercial/aws/inventory/resources/config.py +464 -0
- regscale/integrations/commercial/aws/inventory/resources/containers.py +74 -9
- regscale/integrations/commercial/aws/inventory/resources/database.py +106 -31
- regscale/integrations/commercial/aws/inventory/resources/guardduty.py +286 -0
- regscale/integrations/commercial/aws/inventory/resources/iam.py +470 -0
- regscale/integrations/commercial/aws/inventory/resources/inspector.py +476 -0
- regscale/integrations/commercial/aws/inventory/resources/integration.py +175 -61
- regscale/integrations/commercial/aws/inventory/resources/kms.py +447 -0
- regscale/integrations/commercial/aws/inventory/resources/networking.py +103 -67
- regscale/integrations/commercial/aws/inventory/resources/s3.py +394 -0
- regscale/integrations/commercial/aws/inventory/resources/security.py +268 -72
- regscale/integrations/commercial/aws/inventory/resources/securityhub.py +473 -0
- regscale/integrations/commercial/aws/inventory/resources/storage.py +53 -29
- regscale/integrations/commercial/aws/inventory/resources/systems_manager.py +657 -0
- regscale/integrations/commercial/aws/inventory/resources/vpc.py +655 -0
- regscale/integrations/commercial/aws/kms_control_mappings.py +288 -0
- regscale/integrations/commercial/aws/kms_evidence.py +879 -0
- regscale/integrations/commercial/aws/ocsf/__init__.py +7 -0
- regscale/integrations/commercial/aws/ocsf/constants.py +115 -0
- regscale/integrations/commercial/aws/ocsf/mapper.py +435 -0
- regscale/integrations/commercial/aws/org_control_mappings.py +286 -0
- regscale/integrations/commercial/aws/org_evidence.py +666 -0
- regscale/integrations/commercial/aws/s3_control_mappings.py +356 -0
- regscale/integrations/commercial/aws/s3_evidence.py +632 -0
- regscale/integrations/commercial/aws/scanner.py +851 -206
- regscale/integrations/commercial/aws/security_hub.py +319 -0
- regscale/integrations/commercial/aws/session_manager.py +282 -0
- regscale/integrations/commercial/aws/ssm_control_mappings.py +291 -0
- regscale/integrations/commercial/aws/ssm_evidence.py +492 -0
- regscale/integrations/compliance_integration.py +308 -38
- regscale/integrations/due_date_handler.py +3 -0
- regscale/integrations/scanner_integration.py +399 -84
- regscale/models/integration_models/cisa_kev_data.json +34 -4
- regscale/models/integration_models/synqly_models/capabilities.json +1 -1
- regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +17 -9
- regscale/models/regscale_models/assessment.py +2 -1
- regscale/models/regscale_models/control_objective.py +74 -5
- regscale/models/regscale_models/file.py +2 -0
- regscale/models/regscale_models/issue.py +2 -5
- {regscale_cli-6.27.3.0.dist-info → regscale_cli-6.28.0.0.dist-info}/METADATA +1 -1
- {regscale_cli-6.27.3.0.dist-info → regscale_cli-6.28.0.0.dist-info}/RECORD +112 -33
- tests/regscale/integrations/commercial/aws/__init__.py +0 -0
- tests/regscale/integrations/commercial/aws/test_audit_manager_compliance.py +1304 -0
- tests/regscale/integrations/commercial/aws/test_audit_manager_evidence_aggregation.py +341 -0
- tests/regscale/integrations/commercial/aws/test_aws_audit_manager_collector.py +1155 -0
- tests/regscale/integrations/commercial/aws/test_aws_cloudtrail_collector.py +534 -0
- tests/regscale/integrations/commercial/aws/test_aws_config_collector.py +400 -0
- tests/regscale/integrations/commercial/aws/test_aws_guardduty_collector.py +315 -0
- tests/regscale/integrations/commercial/aws/test_aws_iam_collector.py +458 -0
- tests/regscale/integrations/commercial/aws/test_aws_inspector_collector.py +353 -0
- tests/regscale/integrations/commercial/aws/test_aws_inventory_integration.py +530 -0
- tests/regscale/integrations/commercial/aws/test_aws_kms_collector.py +919 -0
- tests/regscale/integrations/commercial/aws/test_aws_s3_collector.py +722 -0
- tests/regscale/integrations/commercial/aws/test_aws_scanner_integration.py +722 -0
- tests/regscale/integrations/commercial/aws/test_aws_securityhub_collector.py +792 -0
- tests/regscale/integrations/commercial/aws/test_aws_systems_manager_collector.py +918 -0
- tests/regscale/integrations/commercial/aws/test_aws_vpc_collector.py +996 -0
- tests/regscale/integrations/commercial/aws/test_cli_evidence.py +431 -0
- tests/regscale/integrations/commercial/aws/test_cloudtrail_control_mappings.py +452 -0
- tests/regscale/integrations/commercial/aws/test_cloudtrail_evidence.py +788 -0
- tests/regscale/integrations/commercial/aws/test_config_compliance.py +298 -0
- tests/regscale/integrations/commercial/aws/test_conformance_pack_mappings.py +200 -0
- tests/regscale/integrations/commercial/aws/test_evidence_generator.py +386 -0
- tests/regscale/integrations/commercial/aws/test_guardduty_control_mappings.py +564 -0
- tests/regscale/integrations/commercial/aws/test_guardduty_evidence.py +1041 -0
- tests/regscale/integrations/commercial/aws/test_iam_control_mappings.py +718 -0
- tests/regscale/integrations/commercial/aws/test_iam_evidence.py +1375 -0
- tests/regscale/integrations/commercial/aws/test_kms_control_mappings.py +656 -0
- tests/regscale/integrations/commercial/aws/test_kms_evidence.py +1163 -0
- tests/regscale/integrations/commercial/aws/test_ocsf_mapper.py +370 -0
- tests/regscale/integrations/commercial/aws/test_org_control_mappings.py +546 -0
- tests/regscale/integrations/commercial/aws/test_org_evidence.py +1240 -0
- tests/regscale/integrations/commercial/aws/test_s3_control_mappings.py +672 -0
- tests/regscale/integrations/commercial/aws/test_s3_evidence.py +987 -0
- tests/regscale/integrations/commercial/aws/test_scanner_evidence.py +373 -0
- tests/regscale/integrations/commercial/aws/test_security_hub_config_filtering.py +539 -0
- tests/regscale/integrations/commercial/aws/test_session_manager.py +516 -0
- tests/regscale/integrations/commercial/aws/test_ssm_control_mappings.py +588 -0
- tests/regscale/integrations/commercial/aws/test_ssm_evidence.py +735 -0
- tests/regscale/integrations/commercial/test_aws.py +55 -56
- {regscale_cli-6.27.3.0.dist-info → regscale_cli-6.28.0.0.dist-info}/LICENSE +0 -0
- {regscale_cli-6.27.3.0.dist-info → regscale_cli-6.28.0.0.dist-info}/WHEEL +0 -0
- {regscale_cli-6.27.3.0.dist-info → regscale_cli-6.28.0.0.dist-info}/entry_points.txt +0 -0
- {regscale_cli-6.27.3.0.dist-info → regscale_cli-6.28.0.0.dist-info}/top_level.txt +0 -0
|
@@ -1,12 +1,32 @@
|
|
|
1
1
|
"""AWS application integration resource collectors."""
|
|
2
2
|
|
|
3
|
-
from typing import Dict, List, Any
|
|
3
|
+
from typing import Dict, List, Any, Optional
|
|
4
4
|
|
|
5
5
|
from ..base import BaseCollector
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class IntegrationCollector(BaseCollector):
|
|
9
|
-
"""Collector for AWS application integration resources."""
|
|
9
|
+
"""Collector for AWS application integration resources with filtering support."""
|
|
10
|
+
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
session: Any,
|
|
14
|
+
region: str,
|
|
15
|
+
account_id: Optional[str] = None,
|
|
16
|
+
tags: Optional[Dict[str, str]] = None,
|
|
17
|
+
enabled_services: Optional[Dict[str, bool]] = None,
|
|
18
|
+
):
|
|
19
|
+
"""
|
|
20
|
+
Initialize integration collector with filtering support.
|
|
21
|
+
|
|
22
|
+
:param session: AWS session to use for API calls
|
|
23
|
+
:param str region: AWS region to collect from
|
|
24
|
+
:param str account_id: Optional AWS account ID to filter resources
|
|
25
|
+
:param dict tags: Optional tag filters (AND logic)
|
|
26
|
+
:param dict enabled_services: Optional dict of service names to boolean flags for enabling/disabling collection
|
|
27
|
+
"""
|
|
28
|
+
super().__init__(session, region, account_id, tags)
|
|
29
|
+
self.enabled_services = enabled_services or {}
|
|
10
30
|
|
|
11
31
|
def get_api_gateways(self) -> Dict[str, List[Dict[str, Any]]]:
|
|
12
32
|
"""
|
|
@@ -84,9 +104,75 @@ class IntegrationCollector(BaseCollector):
|
|
|
84
104
|
self._handle_error(e, "API Gateway APIs")
|
|
85
105
|
return apis
|
|
86
106
|
|
|
107
|
+
def _should_include_topic(self, sns, topic_arn: str) -> bool:
|
|
108
|
+
"""
|
|
109
|
+
Check if topic should be included based on account and tag filters.
|
|
110
|
+
|
|
111
|
+
:param sns: SNS client
|
|
112
|
+
:param str topic_arn: Topic ARN
|
|
113
|
+
:return: True if topic should be included, False otherwise
|
|
114
|
+
:rtype: bool
|
|
115
|
+
"""
|
|
116
|
+
if not self._matches_account(topic_arn):
|
|
117
|
+
return False
|
|
118
|
+
|
|
119
|
+
if self.tags:
|
|
120
|
+
try:
|
|
121
|
+
tags_response = sns.list_tags_for_resource(ResourceArn=topic_arn)
|
|
122
|
+
topic_tags = tags_response.get("Tags", [])
|
|
123
|
+
return self._matches_tags(topic_tags)
|
|
124
|
+
except Exception:
|
|
125
|
+
return False
|
|
126
|
+
|
|
127
|
+
return True
|
|
128
|
+
|
|
129
|
+
def _get_topic_subscriptions(self, sns, topic_arn: str) -> List[Dict[str, Any]]:
|
|
130
|
+
"""
|
|
131
|
+
Get all subscriptions for a topic.
|
|
132
|
+
|
|
133
|
+
:param sns: SNS client
|
|
134
|
+
:param str topic_arn: Topic ARN
|
|
135
|
+
:return: List of subscriptions
|
|
136
|
+
:rtype: List[Dict[str, Any]]
|
|
137
|
+
"""
|
|
138
|
+
subs = []
|
|
139
|
+
sub_paginator = sns.get_paginator("list_subscriptions_by_topic")
|
|
140
|
+
for sub_page in sub_paginator.paginate(TopicArn=topic_arn):
|
|
141
|
+
subs.extend(sub_page.get("Subscriptions", []))
|
|
142
|
+
return subs
|
|
143
|
+
|
|
144
|
+
def _build_topic_data(self, topic_arn: str, attrs: Dict[str, Any], subs: List[Dict[str, Any]]) -> Dict[str, Any]:
|
|
145
|
+
"""
|
|
146
|
+
Build topic data dictionary.
|
|
147
|
+
|
|
148
|
+
:param str topic_arn: Topic ARN
|
|
149
|
+
:param attrs: Topic attributes
|
|
150
|
+
:param subs: List of subscriptions
|
|
151
|
+
:return: Processed topic data
|
|
152
|
+
:rtype: Dict[str, Any]
|
|
153
|
+
"""
|
|
154
|
+
return {
|
|
155
|
+
"Region": self.region,
|
|
156
|
+
"TopicArn": topic_arn,
|
|
157
|
+
"Owner": attrs.get("Owner"),
|
|
158
|
+
"Policy": attrs.get("Policy"),
|
|
159
|
+
"DisplayName": attrs.get("DisplayName"),
|
|
160
|
+
"SubscriptionsConfirmed": attrs.get("SubscriptionsConfirmed"),
|
|
161
|
+
"SubscriptionsPending": attrs.get("SubscriptionsPending"),
|
|
162
|
+
"SubscriptionsDeleted": attrs.get("SubscriptionsDeleted"),
|
|
163
|
+
"Subscriptions": [
|
|
164
|
+
{
|
|
165
|
+
"SubscriptionArn": sub.get("SubscriptionArn"),
|
|
166
|
+
"Protocol": sub.get("Protocol"),
|
|
167
|
+
"Endpoint": sub.get("Endpoint"),
|
|
168
|
+
}
|
|
169
|
+
for sub in subs
|
|
170
|
+
],
|
|
171
|
+
}
|
|
172
|
+
|
|
87
173
|
def get_sns_topics(self) -> List[Dict[str, Any]]:
|
|
88
174
|
"""
|
|
89
|
-
Get information about SNS topics.
|
|
175
|
+
Get information about SNS topics with filtering.
|
|
90
176
|
|
|
91
177
|
:return: List of SNS topic information
|
|
92
178
|
:rtype: List[Dict[str, Any]]
|
|
@@ -99,43 +185,73 @@ class IntegrationCollector(BaseCollector):
|
|
|
99
185
|
for page in paginator.paginate():
|
|
100
186
|
for topic in page.get("Topics", []):
|
|
101
187
|
try:
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
topics.append(
|
|
111
|
-
{
|
|
112
|
-
"Region": self.region,
|
|
113
|
-
"TopicArn": topic.get("TopicArn"),
|
|
114
|
-
"Owner": attrs.get("Owner"),
|
|
115
|
-
"Policy": attrs.get("Policy"),
|
|
116
|
-
"DisplayName": attrs.get("DisplayName"),
|
|
117
|
-
"SubscriptionsConfirmed": attrs.get("SubscriptionsConfirmed"),
|
|
118
|
-
"SubscriptionsPending": attrs.get("SubscriptionsPending"),
|
|
119
|
-
"SubscriptionsDeleted": attrs.get("SubscriptionsDeleted"),
|
|
120
|
-
"Subscriptions": [
|
|
121
|
-
{
|
|
122
|
-
"SubscriptionArn": sub.get("SubscriptionArn"),
|
|
123
|
-
"Protocol": sub.get("Protocol"),
|
|
124
|
-
"Endpoint": sub.get("Endpoint"),
|
|
125
|
-
}
|
|
126
|
-
for sub in subs
|
|
127
|
-
],
|
|
128
|
-
}
|
|
129
|
-
)
|
|
188
|
+
topic_arn = topic["TopicArn"]
|
|
189
|
+
|
|
190
|
+
if not self._should_include_topic(sns, topic_arn):
|
|
191
|
+
continue
|
|
192
|
+
|
|
193
|
+
attrs = sns.get_topic_attributes(TopicArn=topic_arn)["Attributes"]
|
|
194
|
+
subs = self._get_topic_subscriptions(sns, topic_arn)
|
|
195
|
+
topic_data = self._build_topic_data(topic_arn, attrs, subs)
|
|
196
|
+
topics.append(topic_data)
|
|
130
197
|
except Exception as e:
|
|
131
198
|
self._handle_error(e, f"SNS topic {topic['TopicArn']}")
|
|
132
199
|
except Exception as e:
|
|
133
200
|
self._handle_error(e, "SNS topics")
|
|
134
201
|
return topics
|
|
135
202
|
|
|
203
|
+
def _should_include_queue(self, sqs, queue_arn: str, queue_url: str) -> bool:
|
|
204
|
+
"""
|
|
205
|
+
Check if queue should be included based on account and tag filters.
|
|
206
|
+
|
|
207
|
+
:param sqs: SQS client
|
|
208
|
+
:param str queue_arn: Queue ARN
|
|
209
|
+
:param str queue_url: Queue URL
|
|
210
|
+
:return: True if queue should be included, False otherwise
|
|
211
|
+
:rtype: bool
|
|
212
|
+
"""
|
|
213
|
+
if not self._matches_account(queue_arn):
|
|
214
|
+
return False
|
|
215
|
+
|
|
216
|
+
if self.tags:
|
|
217
|
+
try:
|
|
218
|
+
tags_response = sqs.list_queue_tags(QueueUrl=queue_url)
|
|
219
|
+
queue_tags = tags_response.get("Tags", {})
|
|
220
|
+
return self._matches_tags(queue_tags)
|
|
221
|
+
except Exception:
|
|
222
|
+
return False
|
|
223
|
+
|
|
224
|
+
return True
|
|
225
|
+
|
|
226
|
+
def _build_queue_data(self, queue_url: str, attrs: Dict[str, Any]) -> Dict[str, Any]:
|
|
227
|
+
"""
|
|
228
|
+
Build queue data dictionary.
|
|
229
|
+
|
|
230
|
+
:param str queue_url: Queue URL
|
|
231
|
+
:param attrs: Queue attributes
|
|
232
|
+
:return: Processed queue data
|
|
233
|
+
:rtype: Dict[str, Any]
|
|
234
|
+
"""
|
|
235
|
+
return {
|
|
236
|
+
"Region": self.region,
|
|
237
|
+
"QueueUrl": queue_url,
|
|
238
|
+
"QueueArn": attrs.get("QueueArn"),
|
|
239
|
+
"ApproximateNumberOfMessages": attrs.get("ApproximateNumberOfMessages"),
|
|
240
|
+
"ApproximateNumberOfMessagesNotVisible": attrs.get("ApproximateNumberOfMessagesNotVisible"),
|
|
241
|
+
"ApproximateNumberOfMessagesDelayed": attrs.get("ApproximateNumberOfMessagesDelayed"),
|
|
242
|
+
"CreatedTimestamp": attrs.get("CreatedTimestamp"),
|
|
243
|
+
"LastModifiedTimestamp": attrs.get("LastModifiedTimestamp"),
|
|
244
|
+
"VisibilityTimeout": attrs.get("VisibilityTimeout"),
|
|
245
|
+
"MaximumMessageSize": attrs.get("MaximumMessageSize"),
|
|
246
|
+
"MessageRetentionPeriod": attrs.get("MessageRetentionPeriod"),
|
|
247
|
+
"DelaySeconds": attrs.get("DelaySeconds"),
|
|
248
|
+
"Policy": attrs.get("Policy"),
|
|
249
|
+
"RedrivePolicy": attrs.get("RedrivePolicy"),
|
|
250
|
+
}
|
|
251
|
+
|
|
136
252
|
def get_sqs_queues(self) -> List[Dict[str, Any]]:
|
|
137
253
|
"""
|
|
138
|
-
Get information about SQS queues.
|
|
254
|
+
Get information about SQS queues with filtering.
|
|
139
255
|
|
|
140
256
|
:return: List of SQS queue information
|
|
141
257
|
:rtype: List[Dict[str, Any]]
|
|
@@ -148,29 +264,14 @@ class IntegrationCollector(BaseCollector):
|
|
|
148
264
|
for page in paginator.paginate():
|
|
149
265
|
for queue_url in page.get("QueueUrls", []):
|
|
150
266
|
try:
|
|
151
|
-
# Get queue attributes
|
|
152
267
|
attrs = sqs.get_queue_attributes(QueueUrl=queue_url, AttributeNames=["All"])["Attributes"]
|
|
268
|
+
queue_arn = attrs.get("QueueArn", "")
|
|
153
269
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
"ApproximateNumberOfMessages": attrs.get("ApproximateNumberOfMessages"),
|
|
160
|
-
"ApproximateNumberOfMessagesNotVisible": attrs.get(
|
|
161
|
-
"ApproximateNumberOfMessagesNotVisible"
|
|
162
|
-
),
|
|
163
|
-
"ApproximateNumberOfMessagesDelayed": attrs.get("ApproximateNumberOfMessagesDelayed"),
|
|
164
|
-
"CreatedTimestamp": attrs.get("CreatedTimestamp"),
|
|
165
|
-
"LastModifiedTimestamp": attrs.get("LastModifiedTimestamp"),
|
|
166
|
-
"VisibilityTimeout": attrs.get("VisibilityTimeout"),
|
|
167
|
-
"MaximumMessageSize": attrs.get("MaximumMessageSize"),
|
|
168
|
-
"MessageRetentionPeriod": attrs.get("MessageRetentionPeriod"),
|
|
169
|
-
"DelaySeconds": attrs.get("DelaySeconds"),
|
|
170
|
-
"Policy": attrs.get("Policy"),
|
|
171
|
-
"RedrivePolicy": attrs.get("RedrivePolicy"),
|
|
172
|
-
}
|
|
173
|
-
)
|
|
270
|
+
if not self._should_include_queue(sqs, queue_arn, queue_url):
|
|
271
|
+
continue
|
|
272
|
+
|
|
273
|
+
queue_data = self._build_queue_data(queue_url, attrs)
|
|
274
|
+
queues.append(queue_data)
|
|
174
275
|
except Exception as e:
|
|
175
276
|
self._handle_error(e, f"SQS queue {queue_url}")
|
|
176
277
|
except Exception as e:
|
|
@@ -224,14 +325,27 @@ class IntegrationCollector(BaseCollector):
|
|
|
224
325
|
|
|
225
326
|
def collect(self) -> Dict[str, Any]:
|
|
226
327
|
"""
|
|
227
|
-
Collect
|
|
328
|
+
Collect application integration resources based on enabled_services configuration.
|
|
228
329
|
|
|
229
|
-
:return: Dictionary containing
|
|
330
|
+
:return: Dictionary containing enabled application integration resource information
|
|
230
331
|
:rtype: Dict[str, Any]
|
|
231
332
|
"""
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
"
|
|
237
|
-
|
|
333
|
+
result = {}
|
|
334
|
+
|
|
335
|
+
# API Gateway
|
|
336
|
+
if self.enabled_services.get("api_gateway", True):
|
|
337
|
+
result["APIGateway"] = self.get_api_gateways()
|
|
338
|
+
|
|
339
|
+
# SNS Topics
|
|
340
|
+
if self.enabled_services.get("sns", True):
|
|
341
|
+
result["SNSTopics"] = self.get_sns_topics()
|
|
342
|
+
|
|
343
|
+
# SQS Queues
|
|
344
|
+
if self.enabled_services.get("sqs", True):
|
|
345
|
+
result["SQSQueues"] = self.get_sqs_queues()
|
|
346
|
+
|
|
347
|
+
# EventBridge Rules
|
|
348
|
+
if self.enabled_services.get("eventbridge", True):
|
|
349
|
+
result["EventBridgeRules"] = self.get_eventbridge_rules()
|
|
350
|
+
|
|
351
|
+
return result
|