@gugananuvem/aws-local-simulator 1.0.34 → 1.0.39
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.
- package/README.md +662 -658
- package/package.json +11 -4
- package/src/config/default-config.js +71 -0
- package/src/config/env-loader.js +4 -2
- package/src/middleware/authorization.js +271 -0
- package/src/middleware/cloudtrail-logger.js +333 -0
- package/src/middleware/error-handler.js +138 -0
- package/src/middleware/index.js +79 -0
- package/src/middleware/policy-enforcement.js +407 -0
- package/src/server.js +74 -4
- package/src/services/acm/index.js +66 -0
- package/src/services/acm/models/certificate.js +202 -0
- package/src/services/acm/server.js +224 -0
- package/src/services/acm/simulator.js +293 -0
- package/src/services/alb/index.js +104 -0
- package/src/services/alb/models/loadBalancer.js +88 -0
- package/src/services/alb/models/targetGroup.js +128 -0
- package/src/services/alb/server.js +160 -0
- package/src/services/alb/simulator.js +262 -0
- package/src/services/apigateway/index.js +22 -0
- package/src/services/apigateway/server.js +247 -35
- package/src/services/apigateway/simulator.js +780 -26
- package/src/services/asg/index.js +100 -0
- package/src/services/asg/models/autoScalingGroup.js +110 -0
- package/src/services/asg/models/launchTemplate.js +41 -0
- package/src/services/asg/models/scalingPolicy.js +51 -0
- package/src/services/asg/server.js +236 -0
- package/src/services/asg/simulator.js +410 -0
- package/src/services/aurora/cluster-manager.js +731 -0
- package/src/services/aurora/data-api.js +514 -0
- package/src/services/aurora/db-engine.js +270 -0
- package/src/services/aurora/index.js +159 -0
- package/src/services/aurora/rds-api.js +189 -0
- package/src/services/aurora/server.js +213 -0
- package/src/services/aurora/sql-translator.js +334 -0
- package/src/services/cloudformation/index.js +2 -2
- package/src/services/cloudformation/server.js +1 -0
- package/src/services/cloudfront/cache-engine.js +225 -0
- package/src/services/cloudfront/geo-restrictions.js +377 -0
- package/src/services/cloudfront/index.js +220 -0
- package/src/services/cloudfront/models/behavior.js +158 -0
- package/src/services/cloudfront/models/distribution.js +284 -0
- package/src/services/cloudfront/models/index.js +99 -0
- package/src/services/cloudfront/models/invalidation.js +109 -0
- package/src/services/cloudfront/models/origin.js +155 -0
- package/src/services/cloudfront/origin-router.js +552 -0
- package/src/services/cloudfront/origin-validator.js +398 -0
- package/src/services/cloudfront/server.js +512 -0
- package/src/services/cloudfront/signed-url-generator.js +377 -0
- package/src/services/cloudfront/simulator.js +425 -0
- package/src/services/cloudfront/store.js +326 -0
- package/src/services/cloudshell/env-builder.js +27 -0
- package/src/services/cloudshell/index.js +48 -0
- package/src/services/cloudshell/routes.js +60 -0
- package/src/services/cloudshell/session-manager.js +226 -0
- package/src/services/cloudshell/static/.gitkeep +0 -0
- package/src/services/cloudshell/static/index.html +406 -0
- package/src/services/cloudshell/websocket-handler.js +107 -0
- package/src/services/cloudtrail/index.js +2 -3
- package/src/services/cloudtrail/server.js +68 -0
- package/src/services/cognito/server.js +4 -1
- package/src/services/dynamodb/server.js +4 -1
- package/src/services/dynamodb/simulator.js +2 -1
- package/src/services/ec2/index.js +101 -0
- package/src/services/ec2/instanceServer.js +311 -0
- package/src/services/ec2/models/ami.js +39 -0
- package/src/services/ec2/models/instance.js +98 -0
- package/src/services/ec2/models/networkInterface.js +74 -0
- package/src/services/ec2/models/securityGroup.js +71 -0
- package/src/services/ec2/server.js +350 -0
- package/src/services/ec2/simulator.js +436 -0
- package/src/services/eventbridge/server.js +36 -0
- package/src/services/eventbridge/simulator.js +230 -45
- package/src/services/iam/index.js +65 -0
- package/src/services/iam/middleware.js +99 -0
- package/src/services/iam/server.js +331 -0
- package/src/services/iam/simulator.js +1432 -0
- package/src/services/index.js +28 -0
- package/src/services/kinesis-analytics/index.js +105 -0
- package/src/services/kinesis-analytics/models/application.js +325 -0
- package/src/services/kinesis-analytics/models/index.js +12 -0
- package/src/services/kinesis-analytics/server.js +250 -0
- package/src/services/kinesis-analytics/simulator.js +407 -0
- package/src/services/kinesis-analytics/store.js +176 -0
- package/src/services/kinesis-data-streams/index.js +106 -0
- package/src/services/kinesis-data-streams/models/index.js +12 -0
- package/src/services/kinesis-data-streams/models/record.js +70 -0
- package/src/services/kinesis-data-streams/models/stream.js +280 -0
- package/src/services/kinesis-data-streams/server.js +255 -0
- package/src/services/kinesis-data-streams/simulator.js +514 -0
- package/src/services/kinesis-data-streams/store.js +163 -0
- package/src/services/kinesis-firehose/index.js +106 -0
- package/src/services/kinesis-firehose/models/delivery-stream.js +265 -0
- package/src/services/kinesis-firehose/models/index.js +10 -0
- package/src/services/kinesis-firehose/server.js +215 -0
- package/src/services/kinesis-firehose/simulator.js +388 -0
- package/src/services/kinesis-firehose/store.js +163 -0
- package/src/services/kms/server.js +4 -1
- package/src/services/lambda/handler-loader.js +50 -5
- package/src/services/lambda/index.js +26 -0
- package/src/services/lambda/server.js +18 -12
- package/src/services/lambda/simulator.js +73 -17
- package/src/services/opensearch/index.js +105 -0
- package/src/services/opensearch/models/document.js +115 -0
- package/src/services/opensearch/models/index.js +73 -0
- package/src/services/opensearch/server.js +310 -0
- package/src/services/opensearch/simulator.js +605 -0
- package/src/services/opensearch/store.js +162 -0
- package/src/services/organizations/control-tower-simulator.js +321 -0
- package/src/services/organizations/control-tower-store.js +182 -0
- package/src/services/organizations/iam-integration.js +413 -0
- package/src/services/organizations/index.js +172 -0
- package/src/services/organizations/models/index.js +13 -0
- package/src/services/organizations/models/invitation.js +48 -0
- package/src/services/organizations/models/organization.js +566 -0
- package/src/services/organizations/models/role.js +244 -0
- package/src/services/organizations/models/scp.js +131 -0
- package/src/services/organizations/server.js +736 -0
- package/src/services/organizations/simulator.js +593 -0
- package/src/services/organizations/store.js +235 -0
- package/src/services/organizations/vpc-integration.js +453 -0
- package/src/services/route53/index.js +67 -0
- package/src/services/route53/models/healthCheck.js +101 -0
- package/src/services/route53/models/hostedZone.js +37 -0
- package/src/services/route53/models/resourceRecord.js +106 -0
- package/src/services/route53/server.js +841 -0
- package/src/services/route53/simulator.js +350 -0
- package/src/services/s3/index.js +62 -0
- package/src/services/s3/presigned-url-generator.js +337 -0
- package/src/services/s3/server.js +231 -0
- package/src/services/s3/simulator.js +551 -4
- package/src/services/sns/index.js +31 -0
- package/src/services/sns/server.js +9 -0
- package/src/services/sqs/index.js +38 -0
- package/src/services/sqs/server.js +57 -4
- package/src/services/sqs/simulator.js +423 -33
- package/src/services/sts/simulator.js +209 -17
- package/src/services/vpc/README.md +459 -0
- package/src/services/vpc/ec2ResponseFormatter.js +431 -0
- package/src/services/vpc/index.js +90 -0
- package/src/services/vpc/models/internetGateway.js +71 -0
- package/src/services/vpc/models/routeTable.js +160 -0
- package/src/services/vpc/models/subnet.js +48 -0
- package/src/services/vpc/models/vpc.js +37 -0
- package/src/services/vpc/models/vpcEndpoint.js +100 -0
- package/src/services/vpc/models/vpcGateway.js +134 -0
- package/src/services/vpc/server.js +836 -0
- package/src/services/vpc/simulator.js +613 -0
- package/src/utils/policy-cache.js +215 -0
- package/aws-config +0 -154
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const { setupServiceMiddleware } = require('../../middleware');
|
|
1
2
|
/**
|
|
2
3
|
* @fileoverview SNS HTTP Server — Query Protocol completo
|
|
3
4
|
* Compatível com AWS SDK v3 SNS Client
|
|
@@ -45,6 +46,14 @@ function createSNSServer(simulator, config, logger) {
|
|
|
45
46
|
next();
|
|
46
47
|
});
|
|
47
48
|
|
|
49
|
+
// ── IAM enforcement (applied conditionally via injectDependencies) ──
|
|
50
|
+
app.use((req, res, next) => {
|
|
51
|
+
if (app.iamMiddleware && !req.path.startsWith('/__admin')) {
|
|
52
|
+
return app.iamMiddleware(req, res, next);
|
|
53
|
+
}
|
|
54
|
+
next();
|
|
55
|
+
});
|
|
56
|
+
|
|
48
57
|
// ── Endpoint principal (Query Protocol) ─────────────────────
|
|
49
58
|
app.post('/', async (req, res) => {
|
|
50
59
|
const body = req.body || {};
|
|
@@ -94,6 +94,44 @@ class SQSService {
|
|
|
94
94
|
getServer() {
|
|
95
95
|
return this.server;
|
|
96
96
|
}
|
|
97
|
+
|
|
98
|
+
injectDependencies(server) {
|
|
99
|
+
const lambdaService = server.getService('lambda');
|
|
100
|
+
if (lambdaService) {
|
|
101
|
+
this.lambdaService = lambdaService;
|
|
102
|
+
if (this.simulator) {
|
|
103
|
+
this.simulator.setLambdaService(lambdaService);
|
|
104
|
+
this.simulator.reattachLambdaHandlers();
|
|
105
|
+
}
|
|
106
|
+
if (this.server) {
|
|
107
|
+
this.server.lambdaService = lambdaService;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const iamService = server.getService('iam');
|
|
112
|
+
if (iamService && iamService.getSimulator()) {
|
|
113
|
+
const { createIAMEnforcementMiddleware } = require('../iam/middleware');
|
|
114
|
+
const iamSimulator = iamService.getSimulator();
|
|
115
|
+
|
|
116
|
+
const middleware = createIAMEnforcementMiddleware({
|
|
117
|
+
iamSimulator,
|
|
118
|
+
servicePrefix: 'sqs',
|
|
119
|
+
extractAction: (req) => req.body?.Action || req.query?.Action || 'Unknown',
|
|
120
|
+
extractResource: (req) => {
|
|
121
|
+
const queueUrl = req.body?.QueueUrl || req.query?.QueueUrl || '';
|
|
122
|
+
const queueName = queueUrl.split('/').pop() || req.body?.QueueName || 'unknown';
|
|
123
|
+
return `arn:aws:sqs:us-east-1:123456789012:${queueName}`;
|
|
124
|
+
},
|
|
125
|
+
formatError: (res, code, message) => {
|
|
126
|
+
res.status(403).set('Content-Type', 'text/xml').send(
|
|
127
|
+
`<ErrorResponse><Error><Type>Sender</Type><Code>${code}</Code><Message>${message}</Message></Error></ErrorResponse>`
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
this.server.iamMiddleware = middleware;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
97
135
|
}
|
|
98
136
|
|
|
99
137
|
module.exports = SQSService;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const { setupServiceMiddleware } = require('../../middleware');
|
|
1
2
|
/**
|
|
2
3
|
* SQS Server - Servidor HTTP para SQS
|
|
3
4
|
*/
|
|
@@ -9,7 +10,9 @@ const SQSSimulator = require('./simulator');
|
|
|
9
10
|
const logger = require('../../utils/logger');
|
|
10
11
|
|
|
11
12
|
class SQSServer {
|
|
12
|
-
constructor(port, config, lambdaService) {
|
|
13
|
+
constructor(port, config, lambdaService) {
|
|
14
|
+
this.organizationsService = null;
|
|
15
|
+
this.stsService = null;
|
|
13
16
|
this.port = port;
|
|
14
17
|
this.config = config;
|
|
15
18
|
this.lambdaService = lambdaService;
|
|
@@ -67,6 +70,14 @@ class SQSServer {
|
|
|
67
70
|
next();
|
|
68
71
|
});
|
|
69
72
|
|
|
73
|
+
// IAM enforcement (applied conditionally via injectDependencies)
|
|
74
|
+
this.app.use((req, res, next) => {
|
|
75
|
+
if (this.iamMiddleware && !req.path.startsWith('/__admin')) {
|
|
76
|
+
return this.iamMiddleware(req, res, next);
|
|
77
|
+
}
|
|
78
|
+
next();
|
|
79
|
+
});
|
|
80
|
+
|
|
70
81
|
this.app.post('/', (req, res) => {
|
|
71
82
|
const action = req.query.Action || req.body.Action ||
|
|
72
83
|
(req.headers['x-amz-target'] && req.headers['x-amz-target'].split('.')[1]);
|
|
@@ -161,13 +172,16 @@ class SQSServer {
|
|
|
161
172
|
MessageId: m.MessageId,
|
|
162
173
|
ReceiptHandle: m.ReceiptHandle,
|
|
163
174
|
MD5OfBody: m.MD5OfBody,
|
|
164
|
-
Body: m.Body
|
|
175
|
+
Body: m.Body,
|
|
176
|
+
Attributes: m.Attributes
|
|
165
177
|
}))
|
|
166
178
|
};
|
|
167
179
|
case 'DeleteMessage':
|
|
168
180
|
return {};
|
|
169
181
|
case 'GetQueueUrl':
|
|
170
182
|
return { QueueUrl: result.queueUrl };
|
|
183
|
+
case 'GetQueueAttributes':
|
|
184
|
+
return { Attributes: result.attributes };
|
|
171
185
|
case 'ListQueues':
|
|
172
186
|
return { QueueUrls: (result.queues || []).map(q => q.url) };
|
|
173
187
|
default:
|
|
@@ -189,8 +203,9 @@ class SQSServer {
|
|
|
189
203
|
return this.generateDeleteMessageResponse();
|
|
190
204
|
case 'SetQueueAttributes':
|
|
191
205
|
return this.generateSetQueueAttributesResponse();
|
|
206
|
+
case 'GetQueueAttributes':
|
|
207
|
+
return this.generateGetQueueAttributesResponse(result.attributes);
|
|
192
208
|
case 'GetQueueUrl':
|
|
193
|
-
|
|
194
209
|
return this.generateGetQueueUrlResponse(result.queueUrl);
|
|
195
210
|
case 'ListQueues':
|
|
196
211
|
return this.generateListQueuesResponse(result.queues);
|
|
@@ -206,6 +221,29 @@ class SQSServer {
|
|
|
206
221
|
</SetQueueAttributesResponse>`;
|
|
207
222
|
}
|
|
208
223
|
|
|
224
|
+
generateGetQueueAttributesResponse(attributes) {
|
|
225
|
+
let xml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
226
|
+
<GetQueueAttributesResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
|
|
227
|
+
<GetQueueAttributesResult>
|
|
228
|
+
<Attribute>`;
|
|
229
|
+
|
|
230
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
231
|
+
xml += `
|
|
232
|
+
<Name>${key}</Name>
|
|
233
|
+
<Value>${this.escapeXml(value)}</Value>
|
|
234
|
+
</Attribute>
|
|
235
|
+
<Attribute>`;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
xml = xml.slice(0, -13); // Remove last <Attribute>
|
|
239
|
+
|
|
240
|
+
xml += `
|
|
241
|
+
</GetQueueAttributesResult>
|
|
242
|
+
<ResponseMetadata><RequestId>${crypto.randomUUID()}</RequestId></ResponseMetadata>
|
|
243
|
+
</GetQueueAttributesResponse>`;
|
|
244
|
+
|
|
245
|
+
return xml;
|
|
246
|
+
}
|
|
209
247
|
|
|
210
248
|
generateCreateQueueResponse(queueUrl) {
|
|
211
249
|
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
@@ -270,7 +308,22 @@ class SQSServer {
|
|
|
270
308
|
<MessageId>${msg.MessageId}</MessageId>
|
|
271
309
|
<ReceiptHandle>${msg.ReceiptHandle}</ReceiptHandle>
|
|
272
310
|
<MD5OfBody>${msg.MD5OfBody}</MD5OfBody>
|
|
273
|
-
<Body>${this.escapeXml(msg.Body)}</Body
|
|
311
|
+
<Body>${this.escapeXml(msg.Body)}</Body>`;
|
|
312
|
+
|
|
313
|
+
// Add message attributes if present
|
|
314
|
+
if (msg.Attributes && Object.keys(msg.Attributes).length > 0) {
|
|
315
|
+
for (const [attrKey, attrValue] of Object.entries(msg.Attributes)) {
|
|
316
|
+
if (attrValue !== null && attrValue !== undefined) {
|
|
317
|
+
xml += `
|
|
318
|
+
<Attribute>
|
|
319
|
+
<Name>${attrKey}</Name>
|
|
320
|
+
<Value>${this.escapeXml(String(attrValue))}</Value>
|
|
321
|
+
</Attribute>`;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
xml += `
|
|
274
327
|
</Message>`;
|
|
275
328
|
}
|
|
276
329
|
|