@gugananuvem/aws-local-simulator 1.0.14 → 1.0.15

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 (77) hide show
  1. package/README.md +594 -481
  2. package/bin/aws-local-simulator.js +63 -63
  3. package/package.json +11 -10
  4. package/src/config/config-loader.js +114 -114
  5. package/src/config/default-config.js +68 -68
  6. package/src/config/env-loader.js +68 -68
  7. package/src/index.js +146 -146
  8. package/src/index.mjs +123 -123
  9. package/src/server.js +227 -227
  10. package/src/services/apigateway/index.js +73 -73
  11. package/src/services/apigateway/server.js +507 -507
  12. package/src/services/apigateway/simulator.js +1261 -1261
  13. package/src/services/athena/index.js +75 -75
  14. package/src/services/athena/server.js +101 -101
  15. package/src/services/athena/simulador.js +998 -998
  16. package/src/services/athena/simulator.js +346 -346
  17. package/src/services/cloudformation/index.js +106 -106
  18. package/src/services/cloudformation/server.js +417 -417
  19. package/src/services/cloudformation/simulador.js +1045 -1045
  20. package/src/services/cloudtrail/index.js +84 -84
  21. package/src/services/cloudtrail/server.js +235 -235
  22. package/src/services/cloudtrail/simulador.js +719 -719
  23. package/src/services/cloudwatch/index.js +84 -84
  24. package/src/services/cloudwatch/server.js +366 -366
  25. package/src/services/cloudwatch/simulador.js +1173 -1173
  26. package/src/services/cognito/index.js +79 -70
  27. package/src/services/cognito/server.js +301 -279
  28. package/src/services/cognito/simulator.js +1655 -1119
  29. package/src/services/config/index.js +96 -96
  30. package/src/services/config/server.js +215 -215
  31. package/src/services/config/simulador.js +1260 -1260
  32. package/src/services/dynamodb/index.js +74 -74
  33. package/src/services/dynamodb/server.js +125 -123
  34. package/src/services/dynamodb/simulator.js +630 -630
  35. package/src/services/ecs/index.js +65 -65
  36. package/src/services/ecs/server.js +235 -233
  37. package/src/services/ecs/simulator.js +844 -844
  38. package/src/services/eventbridge/index.js +89 -89
  39. package/src/services/eventbridge/server.js +209 -209
  40. package/src/services/eventbridge/simulator.js +684 -684
  41. package/src/services/index.js +45 -45
  42. package/src/services/kms/index.js +75 -75
  43. package/src/services/kms/server.js +67 -67
  44. package/src/services/kms/simulator.js +324 -324
  45. package/src/services/lambda/handler-loader.js +183 -183
  46. package/src/services/lambda/index.js +78 -78
  47. package/src/services/lambda/route-registry.js +274 -274
  48. package/src/services/lambda/server.js +145 -145
  49. package/src/services/lambda/simulator.js +199 -182
  50. package/src/services/parameter-store/index.js +80 -80
  51. package/src/services/parameter-store/server.js +50 -50
  52. package/src/services/parameter-store/simulator.js +201 -201
  53. package/src/services/s3/index.js +73 -73
  54. package/src/services/s3/server.js +329 -245
  55. package/src/services/s3/simulator.js +565 -496
  56. package/src/services/secret-manager/index.js +80 -80
  57. package/src/services/secret-manager/server.js +50 -50
  58. package/src/services/secret-manager/simulator.js +171 -171
  59. package/src/services/sns/index.js +89 -89
  60. package/src/services/sns/server.js +580 -580
  61. package/src/services/sns/simulator.js +1482 -1482
  62. package/src/services/sqs/index.js +93 -93
  63. package/src/services/sqs/server.js +349 -347
  64. package/src/services/sqs/simulator.js +441 -441
  65. package/src/services/sts/index.js +37 -37
  66. package/src/services/sts/server.js +144 -142
  67. package/src/services/sts/simulator.js +69 -69
  68. package/src/services/xray/index.js +83 -83
  69. package/src/services/xray/server.js +308 -308
  70. package/src/services/xray/simulador.js +994 -994
  71. package/src/template/aws-config-template.js +87 -87
  72. package/src/template/aws-config-template.mjs +90 -90
  73. package/src/template/config-template.json +203 -203
  74. package/src/utils/aws-config.js +91 -91
  75. package/src/utils/cloudtrail-audit.js +129 -129
  76. package/src/utils/local-store.js +83 -83
  77. package/src/utils/logger.js +59 -59
package/README.md CHANGED
@@ -1,481 +1,594 @@
1
- # AWS Local Simulator
2
-
3
- [![npm version](https://badge.fury.io/js/aws-local-simulator.svg)](https://badge.fury.io/js/aws-local-simulator)
4
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
- [![Node.js Version](https://img.shields.io/node/v/aws-local-simulator.svg)](https://nodejs.org)
6
-
7
- Simulador local completo para serviços AWS. Desenvolva e teste suas aplicações AWS localmente sem custos!
8
-
9
- ## 🚀 Serviços Suportados
10
-
11
- | Serviço | Status | Porta Padrão | Descrição |
12
- |---------|--------|--------------|-----------|
13
- | DynamoDB | ✅ | 8000 | Banco de dados NoSQL |
14
- | S3 | ✅ | 4566 | Armazenamento de objetos |
15
- | SQS | ✅ | 9324 | Filas de mensagens |
16
- | Lambda | ✅ | 3001 | Funções serverless |
17
- | Cognito | ✅ | 9229 | Autenticação e autorização |
18
- | API Gateway | ✅ | 4567 | APIs REST e HTTP |
19
- | STS | ✅ | 9326 | Credenciais temporárias |
20
- | SNS | ✅ | 9911 | Notificações pub/sub |
21
- | EventBridge | ✅ | 4010 | Barramento de eventos |
22
- | KMS | ✅ | 4000 | Gerenciamento de chaves |
23
- | Secrets Manager | ✅ | 4001 | Gerenciamento de segredos |
24
- | Parameter Store | ✅ | 4002 | Armazenamento de parâmetros |
25
- | CloudWatch | ✅ | 4011 | Logs, métricas e alarmes |
26
- | CloudTrail | ✅ | 4012 | Auditoria de API calls |
27
- | AWS Config | ✅ | 4013 | Conformidade e configuração |
28
- | CloudFormation | ✅ | 4580 | Infraestrutura como código |
29
- | Athena | ✅ | 4599 | Consultas SQL em dados no S3 |
30
- | X-Ray | ✅ | 4015 | Rastreamento distribuído |
31
- | ECS/Fargate | 🚧 | 8080 | Orquestração de containers (em desenvolvimento) |
32
-
33
- ## 📦 Instalação
34
-
35
- ```bash
36
- npm install --save-dev aws-local-simulator
37
- ```
38
-
39
- ## 🚀 Uso Rápido
40
-
41
- ### 1. Crie um arquivo de configuração `aws-local-simulator.json`:
42
-
43
- ```json
44
- {
45
- "services": {
46
- "dynamodb": true,
47
- "s3": true,
48
- "sqs": true,
49
- "lambda": true,
50
- "cognito": true,
51
- "apigateway": true,
52
- "sts": true,
53
- "sns": true,
54
- "eventbridge": true,
55
- "kms": true,
56
- "secret-manager": true,
57
- "parameter-store": true,
58
- "cloudwatch": true,
59
- "cloudtrail": true,
60
- "cloudformation": true,
61
- "xray": true,
62
- "config": true,
63
- "athena": true
64
- },
65
- "lambdas": [
66
- {
67
- "name": "my-function",
68
- "handler": "./src/handlers/users.js",
69
- "env": {
70
- "TABLE_NAME": "users-table"
71
- }
72
- }
73
- ],
74
- "dynamodb": {
75
- "tables": [
76
- {
77
- "TableName": "users-table",
78
- "KeySchema": [{ "AttributeName": "id", "KeyType": "HASH" }],
79
- "AttributeDefinitions": [{ "AttributeName": "id", "AttributeType": "S" }]
80
- }
81
- ]
82
- },
83
- "s3": {
84
- "buckets": ["my-bucket"]
85
- },
86
- "sqs": {
87
- "queues": ["my-queue", "dead-letter-queue"]
88
- },
89
- "cognito": {
90
- "userPools": [
91
- {
92
- "PoolName": "my-user-pool",
93
- "AutoVerifiedAttributes": ["email"]
94
- }
95
- ]
96
- }
97
- }
98
- ```
99
-
100
- ### 2. Inicie o simulador:
101
-
102
- ```bash
103
- # Via CLI
104
- npx aws-local-simulator start
105
-
106
- # Ou via código
107
- const { AWSLocalSimulator } = require('aws-local-simulator');
108
- const simulator = new AWSLocalSimulator();
109
- await simulator.start();
110
- ```
111
-
112
- ### 3. Configure seu código para usar os serviços locais:
113
-
114
- ```javascript
115
- const { dynamoDB, s3, sqs, cognito } = require('aws-local-simulator/aws-config');
116
-
117
- await dynamoDB.send(new PutCommand({
118
- TableName: 'users-table',
119
- Item: { id: '123', name: 'John' }
120
- }));
121
- ```
122
-
123
- ## 🔧 Configuração por Variáveis de Ambiente
124
-
125
- | Variável | Descrição | Padrão |
126
- |---------|----------|-------|
127
- | AWS_LOCAL_SIMULATOR_DYNAMODB | Habilita DynamoDB | true |
128
- | AWS_LOCAL_SIMULATOR_S3 | Habilita S3 | true |
129
- | AWS_LOCAL_SIMULATOR_SQS | Habilita SQS | true |
130
- | AWS_LOCAL_SIMULATOR_LAMBDA | Habilita Lambda | true |
131
- | AWS_LOCAL_SIMULATOR_COGNITO | Habilita Cognito | false |
132
- | AWS_LOCAL_SIMULATOR_APIGATEWAY | Habilita API Gateway | false |
133
- | AWS_LOCAL_SIMULATOR_STS | Habilita STS | true |
134
- | AWS_LOCAL_SIMULATOR_SNS | Habilita SNS | false |
135
- | AWS_LOCAL_SIMULATOR_EVENTBRIDGE | Habilita EventBridge | false |
136
- | AWS_LOCAL_SIMULATOR_KMS | Habilita KMS | false |
137
- | AWS_LOCAL_SIMULATOR_SECRET_MANAGER | Habilita Secrets Manager | false |
138
- | AWS_LOCAL_SIMULATOR_PARAMETER_STORE | Habilita Parameter Store | false |
139
- | AWS_LOCAL_SIMULATOR_CLOUDWATCH | Habilita CloudWatch | false |
140
- | AWS_LOCAL_SIMULATOR_CLOUDTRAIL | Habilita CloudTrail | false |
141
- | AWS_LOCAL_SIMULATOR_CLOUDFORMATION | Habilita CloudFormation | false |
142
- | AWS_LOCAL_SIMULATOR_ATHENA | Habilita Athena | false |
143
- | AWS_LOCAL_SIMULATOR_XRAY | Habilita X-Ray | false |
144
- | AWS_LOCAL_SIMULATOR_CONFIG | Habilita AWS Config | false |
145
- | AWS_LOCAL_SIMULATOR_ECS | Habilita ECS/Fargate | false |
146
- | AWS_LOCAL_SIMULATOR_DYNAMODB_PORT | Porta DynamoDB | 8000 |
147
- | AWS_LOCAL_SIMULATOR_S3_PORT | Porta S3 | 4566 |
148
- | AWS_LOCAL_SIMULATOR_SQS_PORT | Porta SQS | 9324 |
149
- | AWS_LOCAL_SIMULATOR_LAMBDA_PORT | Porta Lambda | 3001 |
150
- | AWS_LOCAL_SIMULATOR_COGNITO_PORT | Porta Cognito | 9229 |
151
- | AWS_LOCAL_SIMULATOR_APIGATEWAY_PORT | Porta API Gateway | 4567 |
152
- | AWS_LOCAL_SIMULATOR_STS_PORT | Porta STS | 9326 |
153
- | AWS_LOCAL_SIMULATOR_SNS_PORT | Porta SNS | 9911 |
154
- | AWS_LOCAL_SIMULATOR_EVENTBRIDGE_PORT | Porta EventBridge | 4010 |
155
- | AWS_LOCAL_SIMULATOR_KMS_PORT | Porta KMS | 4000 |
156
- | AWS_LOCAL_SIMULATOR_SECRET_MANAGER_PORT | Porta Secrets Manager | 4001 |
157
- | AWS_LOCAL_SIMULATOR_PARAMETER_STORE_PORT | Porta Parameter Store | 4002 |
158
- | AWS_LOCAL_SIMULATOR_CLOUDWATCH_PORT | Porta CloudWatch | 4011 |
159
- | AWS_LOCAL_SIMULATOR_CLOUDTRAIL_PORT | Porta CloudTrail | 4012 |
160
- | AWS_LOCAL_SIMULATOR_CONFIG_PORT | Porta AWS Config | 4013 |
161
- | AWS_LOCAL_SIMULATOR_XRAY_PORT | Porta X-Ray | 4015 |
162
- | AWS_LOCAL_SIMULATOR_CLOUDFORMATION_PORT | Porta CloudFormation | 4580 |
163
- | AWS_LOCAL_SIMULATOR_ATHENA_PORT | Porta Athena | 4599 |
164
- | AWS_LOCAL_SIMULATOR_ECS_PORT | Porta ECS | 8080 |
165
- | AWS_LOCAL_SIMULATOR_DATA | Diretório de dados | ./aws-local-simulator-data |
166
- | AWS_LOCAL_SIMULATOR_LOG | Nível de log | info |
167
-
168
- ## 📝 Comandos CLI
169
-
170
- ```bash
171
- # Iniciar simulador
172
- npx aws-local-simulator start [configPath]
173
-
174
- # Parar simulador
175
- npx aws-local-simulator stop
176
-
177
- # Reiniciar
178
- npx aws-local-simulator restart
179
-
180
- # Resetar dados
181
- npx aws-local-simulator reset
182
-
183
- # Status
184
- npx aws-local-simulator status
185
- ```
186
-
187
- ## 🔌 Endpoints
188
-
189
- | Serviço | Endpoint | Admin |
190
- |---------|----------|-------|
191
- | DynamoDB | http://localhost:8000 | http://localhost:8000/__admin/tables |
192
- | S3 | http://localhost:4566 | http://localhost:4566/__admin/buckets |
193
- | SQS | http://localhost:9324 | http://localhost:9324/__admin/queues |
194
- | Lambda | http://localhost:3001 | http://localhost:3001/__admin/functions |
195
- | Cognito | http://localhost:9229 | http://localhost:9229/__admin/userpools |
196
- | API Gateway | http://localhost:4567 | http://localhost:4567/__admin/apis |
197
- | STS | http://localhost:9326 | |
198
- | SNS | http://localhost:9911 | http://localhost:9911/__admin/health |
199
- | EventBridge | http://localhost:4010 | |
200
- | KMS | http://localhost:4000 | — |
201
- | Secrets Manager | http://localhost:4001 | |
202
- | Parameter Store | http://localhost:4002 | — |
203
- | CloudWatch | http://localhost:4011 | — |
204
- | CloudTrail | http://localhost:4012 | — |
205
- | AWS Config | http://localhost:4013 | — |
206
- | X-Ray | http://localhost:4015 | — |
207
- | CloudFormation | http://localhost:4580 | http://localhost:4580/__admin/stacks |
208
- | Athena | http://localhost:4599 | http://localhost:4599/__admin/health |
209
- | ECS | http://localhost:8080 | http://localhost:8080/__admin/clusters |
210
-
211
- ## 🧪 Testando com AWS CLI
212
-
213
- ```bash
214
- # DynamoDB
215
- aws dynamodb list-tables --endpoint-url http://localhost:8000
216
-
217
- # S3
218
- aws s3 ls --endpoint-url http://localhost:4566
219
-
220
- # SQS
221
- aws sqs list-queues --endpoint-url http://localhost:9324
222
-
223
- # Lambda
224
- aws lambda invoke \
225
- --function-name my-function \
226
- --payload '{"key":"value"}' \
227
- --endpoint-url http://localhost:3001 \
228
- output.json
229
-
230
- # Cognito
231
- aws cognito-idp list-user-pools --max-results 10 --endpoint-url http://localhost:9229
232
-
233
- # STS
234
- aws sts get-caller-identity --endpoint-url http://localhost:9326
235
- aws sts assume-role \
236
- --role-arn "arn:aws:iam::123456789012:role/my-role" \
237
- --role-session-name "my-session" \
238
- --endpoint-url http://localhost:9326
239
-
240
- # SNS
241
- aws sns list-topics --endpoint-url http://localhost:9911
242
-
243
- # EventBridge
244
- aws events list-event-buses --endpoint-url http://localhost:4010
245
-
246
- # KMS
247
- aws kms list-keys --endpoint-url http://localhost:4000
248
-
249
- # Secrets Manager
250
- aws secretsmanager list-secrets --endpoint-url http://localhost:4001
251
-
252
- # Criar secret
253
- aws secretsmanager create-secret \
254
- --name "local/app/db-credentials" \
255
- --description "Credenciais do banco" \
256
- --secret-string '{"username":"admin","password":"secret123"}' \
257
- --endpoint-url http://localhost:4001
258
-
259
- # Ler secret
260
- aws secretsmanager get-secret-value \
261
- --secret-id "local/app/db-credentials" \
262
- --endpoint-url http://localhost:4001
263
-
264
- # Parameter Store
265
- aws ssm describe-parameters --endpoint-url http://localhost:4002
266
-
267
- # Criar parâmetro String
268
- aws ssm put-parameter \
269
- --name "/local/app/config" \
270
- --value '{"timeout":30,"maxRetries":3}' \
271
- --type String \
272
- --endpoint-url http://localhost:4002
273
-
274
- # Criar parâmetro SecureString
275
- aws ssm put-parameter \
276
- --name "/local/app/api-key" \
277
- --value "my-secret-api-key" \
278
- --type SecureString \
279
- --endpoint-url http://localhost:4002
280
-
281
- # Ler parâmetro
282
- aws ssm get-parameter \
283
- --name "/local/app/config" \
284
- --endpoint-url http://localhost:4002
285
-
286
- # CloudWatch
287
- aws cloudwatch list-metrics --endpoint-url http://localhost:4011
288
- aws logs describe-log-groups --endpoint-url http://localhost:4011
289
-
290
- # CloudTrail
291
- aws cloudtrail describe-trails --endpoint-url http://localhost:4012
292
-
293
- # CloudFormation
294
- aws cloudformation list-stacks --endpoint-url http://localhost:4580
295
-
296
- # X-Ray
297
- aws xray get-trace-summaries \
298
- --start-time $(date -d '1 hour ago' +%s) \
299
- --end-time $(date +%s) \
300
- --endpoint-url http://localhost:4015
301
-
302
- # AWS Config
303
- aws configservice describe-configuration-recorders --endpoint-url http://localhost:4013
304
-
305
- # API Gateway
306
- aws apigateway get-rest-apis --endpoint-url http://localhost:4567
307
-
308
- # Cloudformation
309
- aws cloudformation create-stack \
310
- --stack-name test-stack \
311
- --template-body file://templates/test-stack.yaml \
312
- --parameters \
313
- ParameterKey=Environment,ParameterValue=local \
314
- ParameterKey=BucketName,ParameterValue=meu-bucket \
315
- ParameterKey=QueueName,ParameterValue=minha-fila \
316
- ParameterKey=TableName,ParameterValue=minha-tabela \
317
- --endpoint-url http://localhost:4580
318
-
319
- # Ver Cloudformation resultado
320
- aws cloudformation describe-stacks \
321
- --stack-name test-stack \
322
- --endpoint-url http://localhost:4580
323
-
324
- # Athena
325
- # Criar workgroup
326
- aws athena create-work-group \
327
- --name my-workgroup \
328
- --configuration ResultConfiguration={OutputLocation=s3://meu-bucket/athena-results/} \
329
- --endpoint-url http://localhost:4599
330
-
331
- # Listar workgroups
332
- aws athena list-work-groups --endpoint-url http://localhost:4599
333
-
334
- # Executar query
335
- aws athena start-query-execution \
336
- --query-string "SELECT * FROM my_table LIMIT 10" \
337
- --query-execution-context Database=default \
338
- --result-configuration OutputLocation=s3://meu-bucket/athena-results/ \
339
- --endpoint-url http://localhost:4599
340
-
341
- # Verificar status da query
342
- aws athena get-query-execution \
343
- --query-execution-id <id-retornado> \
344
- --endpoint-url http://localhost:4599
345
-
346
- # Buscar resultados
347
- aws athena get-query-results \
348
- --query-execution-id <id-retornado> \
349
- --endpoint-url http://localhost:4599
350
-
351
- # Criar named query
352
- aws athena create-named-query \
353
- --name "my-saved-query" \
354
- --database default \
355
- --query-string "SELECT id, value FROM my_table WHERE status = 'active'" \
356
- --endpoint-url http://localhost:4599
357
-
358
- # Listar named queries
359
- aws athena list-named-queries --endpoint-url http://localhost:4599
360
- ```
361
-
362
- ## ⚙️ Configuração de Lambdas
363
-
364
- Lambdas são registradas por **nome** e invocadas via API de invocação (igual à AWS real). O roteamento HTTP é feito pelo API Gateway.
365
-
366
- ```json
367
- {
368
- "lambdas": [
369
- {
370
- "name": "my-user-function",
371
- "handler": "./src/handlers/my-user-function.js",
372
- "env": {
373
- "TABLE_NAME": "users-table",
374
- "BUCKET_NAME": "my-bucket"
375
- }
376
- }
377
- ]
378
- }
379
- ```
380
-
381
- ## ⚙️ Configuração API GATEWAY
382
-
383
- O valor do **lambdaName** deve igual ao nome Lambda que está registrada com o valor **name**. Ex: "my-user-function".
384
-
385
- ```json
386
- {
387
- "apigateway": {
388
- "apis": [
389
- {
390
- "name": "Users API",
391
- "description": "API para gerenciamento de usuários",
392
- "endpoints": [
393
- {
394
- "path": "/user",
395
- "method": "GET",
396
- "lambdaName": "my-user-function",
397
- "integrationType": "lambda"
398
- },
399
- {
400
- "path": "/user",
401
- "method": "POST",
402
- "lambdaName": "my-user-function",
403
- "integrationType": "lambda"
404
- },
405
- {
406
- "path": "/user/{id}",
407
- "method": "GET",
408
- "lambdaName": "my-user-function",
409
- "integrationType": "lambda"
410
- },
411
- {
412
- "path": "/user/{id}",
413
- "method": "DELETE",
414
- "lambdaName": "my-user-function",
415
- "integrationType": "lambda"
416
- }
417
- ]
418
- }
419
- ]
420
- },
421
-
422
- }
423
- ```
424
-
425
- O handler deve exportar uma função padrão:
426
-
427
- ```javascript
428
- exports.handler = async (event, context) => {
429
- return {
430
- statusCode: 200,
431
- body: JSON.stringify({ message: 'Hello from Lambda!' })
432
- };
433
- };
434
- ```
435
-
436
- ## 📁 Estrutura de Dados
437
-
438
- Os dados são persistidos em:
439
-
440
- ```text
441
- .aws-local-simulator-data/
442
- ├── dynamodb/
443
- ├── s3/
444
- ├── sqs/
445
- ├── cognito/
446
- ├── apigateway/
447
- ├── ecs/
448
- ├── kms/
449
- ├── secret-manager/
450
- ├── parameter-store/
451
- ├── cloudwatch/
452
- ├── cloudtrail/
453
- ├── cloudformation/
454
- ├── athena/
455
- ├── xray/
456
- └── config/
457
- ```
458
-
459
- ## 🐛 Debug
460
-
461
- ```bash
462
- AWS_LOCAL_SIMULATOR_LOG=verbose npx aws-local-simulator start
463
- ```
464
-
465
- ## 🤝 Contribuindo
466
-
467
- 1. Fork o projeto
468
- 2. Crie sua feature branch (`git checkout -b feature/AmazingFeature`)
469
- 3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)
470
- 4. Push para a branch (`git push origin feature/AmazingFeature`)
471
- 5. Abra um Pull Request
472
-
473
- ## 📄 Licença
474
-
475
- MIT © Luiz Gustavo Ribeiro
476
-
477
- ## ⚠️ Limitações
478
-
479
- - ECS/Fargate em desenvolvimento
480
- - WebSocket APIs em desenvolvimento
481
- - Para uso em desenvolvimento e testes apenas
1
+ # AWS Local Simulator
2
+
3
+ [![npm version](https://badge.fury.io/js/aws-local-simulator.svg)](https://badge.fury.io/js/aws-local-simulator)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![Node.js Version](https://img.shields.io/node/v/aws-local-simulator.svg)](https://nodejs.org)
6
+
7
+ Simulador local completo para serviços AWS. Desenvolva e teste suas aplicações AWS localmente sem custos!
8
+
9
+ ## 🚀 Serviços Suportados
10
+
11
+ | Serviço | Status | Porta Padrão | Descrição |
12
+ |---------|--------|--------------|-----------|
13
+ | DynamoDB | ✅ | 8000 | Banco de dados NoSQL |
14
+ | S3 | ✅ | 4566 | Armazenamento de objetos |
15
+ | SQS | ✅ | 9324 | Filas de mensagens |
16
+ | Lambda | ✅ | 3001 | Funções serverless |
17
+ | Cognito | ✅ | 9229 | Autenticação e autorização |
18
+ | API Gateway | ✅ | 4567 | APIs REST e HTTP |
19
+ | STS | ✅ | 9326 | Credenciais temporárias |
20
+ | SNS | ✅ | 9911 | Notificações pub/sub |
21
+ | EventBridge | ✅ | 4010 | Barramento de eventos |
22
+ | KMS | ✅ | 4000 | Gerenciamento de chaves |
23
+ | Secrets Manager | ✅ | 4001 | Gerenciamento de segredos |
24
+ | Parameter Store | ✅ | 4002 | Armazenamento de parâmetros |
25
+ | CloudWatch | ✅ | 4011 | Logs, métricas e alarmes |
26
+ | CloudTrail | ✅ | 4012 | Auditoria de API calls |
27
+ | AWS Config | ✅ | 4013 | Conformidade e configuração |
28
+ | CloudFormation | ✅ | 4580 | Infraestrutura como código |
29
+ | Athena | ✅ | 4599 | Consultas SQL em dados no S3 |
30
+ | X-Ray | ✅ | 4015 | Rastreamento distribuído |
31
+ | ECS/Fargate | 🚧 | 8080 | Orquestração de containers (em desenvolvimento) |
32
+
33
+ ## 📦 Instalação
34
+
35
+ ```bash
36
+ npm install --save-dev aws-local-simulator
37
+ ```
38
+
39
+ ## 🚀 Uso Rápido
40
+
41
+ ### 1. Crie um arquivo de configuração `aws-local-simulator.json`:
42
+
43
+ ```json
44
+ {
45
+ "services": {
46
+ "dynamodb": true,
47
+ "s3": true,
48
+ "sqs": true,
49
+ "lambda": true,
50
+ "cognito": true,
51
+ "apigateway": true,
52
+ "sts": true,
53
+ "sns": true,
54
+ "eventbridge": true,
55
+ "kms": true,
56
+ "secret-manager": true,
57
+ "parameter-store": true,
58
+ "cloudwatch": true,
59
+ "cloudtrail": true,
60
+ "cloudformation": true,
61
+ "xray": true,
62
+ "config": true,
63
+ "athena": true
64
+ },
65
+ "lambdas": [
66
+ {
67
+ "name": "my-function",
68
+ "handler": "./src/handlers/users.js",
69
+ "env": {
70
+ "TABLE_NAME": "users-table"
71
+ }
72
+ }
73
+ ],
74
+ "dynamodb": {
75
+ "tables": [
76
+ {
77
+ "TableName": "users-table",
78
+ "KeySchema": [{ "AttributeName": "id", "KeyType": "HASH" }],
79
+ "AttributeDefinitions": [{ "AttributeName": "id", "AttributeType": "S" }]
80
+ }
81
+ ]
82
+ },
83
+ "s3": {
84
+ "buckets": [
85
+ { "name": "my-bucket", "region": "us-east-1" }
86
+ ]
87
+ },
88
+ "sqs": {
89
+ "queues": ["my-queue", "dead-letter-queue"]
90
+ },
91
+ "cognito": {
92
+ "userPools": [
93
+ {
94
+ "PoolName": "my-user-pool",
95
+ "AutoVerifiedAttributes": ["email"]
96
+ }
97
+ ]
98
+ }
99
+ }
100
+ ```
101
+
102
+ ### 2. Inicie o simulador:
103
+
104
+ ```bash
105
+ # Via CLI
106
+ npx aws-local-simulator start
107
+
108
+ # Ou via código
109
+ const { AWSLocalSimulator } = require('aws-local-simulator');
110
+ const simulator = new AWSLocalSimulator();
111
+ await simulator.start();
112
+ ```
113
+
114
+ ### 3. Configure seu código para usar os serviços locais:
115
+
116
+ ```javascript
117
+ const { dynamoDB, s3, sqs, cognito } = require('aws-local-simulator/aws-config');
118
+
119
+ await dynamoDB.send(new PutCommand({
120
+ TableName: 'users-table',
121
+ Item: { id: '123', name: 'John' }
122
+ }));
123
+ ```
124
+
125
+ ## 🔧 Configuração por Variáveis de Ambiente
126
+
127
+ | Variável | Descrição | Padrão |
128
+ |---------|----------|-------|
129
+ | AWS_LOCAL_SIMULATOR_DYNAMODB | Habilita DynamoDB | true |
130
+ | AWS_LOCAL_SIMULATOR_S3 | Habilita S3 | true |
131
+ | AWS_LOCAL_SIMULATOR_SQS | Habilita SQS | true |
132
+ | AWS_LOCAL_SIMULATOR_LAMBDA | Habilita Lambda | true |
133
+ | AWS_LOCAL_SIMULATOR_COGNITO | Habilita Cognito | false |
134
+ | AWS_LOCAL_SIMULATOR_APIGATEWAY | Habilita API Gateway | false |
135
+ | AWS_LOCAL_SIMULATOR_STS | Habilita STS | true |
136
+ | AWS_LOCAL_SIMULATOR_SNS | Habilita SNS | false |
137
+ | AWS_LOCAL_SIMULATOR_EVENTBRIDGE | Habilita EventBridge | false |
138
+ | AWS_LOCAL_SIMULATOR_KMS | Habilita KMS | false |
139
+ | AWS_LOCAL_SIMULATOR_SECRET_MANAGER | Habilita Secrets Manager | false |
140
+ | AWS_LOCAL_SIMULATOR_PARAMETER_STORE | Habilita Parameter Store | false |
141
+ | AWS_LOCAL_SIMULATOR_CLOUDWATCH | Habilita CloudWatch | false |
142
+ | AWS_LOCAL_SIMULATOR_CLOUDTRAIL | Habilita CloudTrail | false |
143
+ | AWS_LOCAL_SIMULATOR_CLOUDFORMATION | Habilita CloudFormation | false |
144
+ | AWS_LOCAL_SIMULATOR_ATHENA | Habilita Athena | false |
145
+ | AWS_LOCAL_SIMULATOR_XRAY | Habilita X-Ray | false |
146
+ | AWS_LOCAL_SIMULATOR_CONFIG | Habilita AWS Config | false |
147
+ | AWS_LOCAL_SIMULATOR_ECS | Habilita ECS/Fargate | false |
148
+ | AWS_LOCAL_SIMULATOR_DYNAMODB_PORT | Porta DynamoDB | 8000 |
149
+ | AWS_LOCAL_SIMULATOR_S3_PORT | Porta S3 | 4566 |
150
+ | AWS_LOCAL_SIMULATOR_SQS_PORT | Porta SQS | 9324 |
151
+ | AWS_LOCAL_SIMULATOR_LAMBDA_PORT | Porta Lambda | 3001 |
152
+ | AWS_LOCAL_SIMULATOR_COGNITO_PORT | Porta Cognito | 9229 |
153
+ | AWS_LOCAL_SIMULATOR_APIGATEWAY_PORT | Porta API Gateway | 4567 |
154
+ | AWS_LOCAL_SIMULATOR_STS_PORT | Porta STS | 9326 |
155
+ | AWS_LOCAL_SIMULATOR_SNS_PORT | Porta SNS | 9911 |
156
+ | AWS_LOCAL_SIMULATOR_EVENTBRIDGE_PORT | Porta EventBridge | 4010 |
157
+ | AWS_LOCAL_SIMULATOR_KMS_PORT | Porta KMS | 4000 |
158
+ | AWS_LOCAL_SIMULATOR_SECRET_MANAGER_PORT | Porta Secrets Manager | 4001 |
159
+ | AWS_LOCAL_SIMULATOR_PARAMETER_STORE_PORT | Porta Parameter Store | 4002 |
160
+ | AWS_LOCAL_SIMULATOR_CLOUDWATCH_PORT | Porta CloudWatch | 4011 |
161
+ | AWS_LOCAL_SIMULATOR_CLOUDTRAIL_PORT | Porta CloudTrail | 4012 |
162
+ | AWS_LOCAL_SIMULATOR_CONFIG_PORT | Porta AWS Config | 4013 |
163
+ | AWS_LOCAL_SIMULATOR_XRAY_PORT | Porta X-Ray | 4015 |
164
+ | AWS_LOCAL_SIMULATOR_CLOUDFORMATION_PORT | Porta CloudFormation | 4580 |
165
+ | AWS_LOCAL_SIMULATOR_ATHENA_PORT | Porta Athena | 4599 |
166
+ | AWS_LOCAL_SIMULATOR_ECS_PORT | Porta ECS | 8080 |
167
+ | AWS_LOCAL_SIMULATOR_DATA | Diretório de dados | ./aws-local-simulator-data |
168
+ | AWS_LOCAL_SIMULATOR_LOG | Nível de log | info |
169
+
170
+ ## 📝 Comandos CLI
171
+
172
+ ```bash
173
+ # Iniciar simulador
174
+ npx aws-local-simulator start [configPath]
175
+
176
+ # Parar simulador
177
+ npx aws-local-simulator stop
178
+
179
+ # Reiniciar
180
+ npx aws-local-simulator restart
181
+
182
+ # Resetar dados
183
+ npx aws-local-simulator reset
184
+
185
+ # Status
186
+ npx aws-local-simulator status
187
+ ```
188
+
189
+ ## 🔌 Endpoints
190
+
191
+ | Serviço | Endpoint | Admin |
192
+ |---------|----------|-------|
193
+ | DynamoDB | http://localhost:8000 | http://localhost:8000/__admin/tables |
194
+ | S3 | http://localhost:4566 | http://localhost:4566/__admin/buckets |
195
+ | S3 Website | http://localhost:4566/website/{bucket}/ | — |
196
+ | SQS | http://localhost:9324 | http://localhost:9324/__admin/queues |
197
+ | Lambda | http://localhost:3001 | http://localhost:3001/__admin/functions |
198
+ | Cognito | http://localhost:9229 | http://localhost:9229/__admin/userpools |
199
+ | API Gateway | http://localhost:4567 | http://localhost:4567/__admin/apis |
200
+ | STS | http://localhost:9326 | — |
201
+ | SNS | http://localhost:9911 | http://localhost:9911/__admin/health |
202
+ | EventBridge | http://localhost:4010 | — |
203
+ | KMS | http://localhost:4000 | — |
204
+ | Secrets Manager | http://localhost:4001 | — |
205
+ | Parameter Store | http://localhost:4002 | — |
206
+ | CloudWatch | http://localhost:4011 | — |
207
+ | CloudTrail | http://localhost:4012 | |
208
+ | AWS Config | http://localhost:4013 | |
209
+ | X-Ray | http://localhost:4015 | |
210
+ | CloudFormation | http://localhost:4580 | http://localhost:4580/__admin/stacks |
211
+ | Athena | http://localhost:4599 | http://localhost:4599/__admin/health |
212
+ | ECS | http://localhost:8080 | http://localhost:8080/__admin/clusters |
213
+
214
+ ## 🧪 Testando com AWS CLI
215
+
216
+ ```bash
217
+ # DynamoDB
218
+ aws dynamodb list-tables --endpoint-url http://localhost:8000
219
+
220
+ # S3
221
+ aws s3 ls --endpoint-url http://localhost:4566
222
+
223
+ # SQS
224
+ aws sqs list-queues --endpoint-url http://localhost:9324
225
+
226
+ # Lambda
227
+ aws lambda invoke \
228
+ --function-name my-function \
229
+ --payload '{"key":"value"}' \
230
+ --endpoint-url http://localhost:3001 \
231
+ output.json
232
+
233
+ # Cognito
234
+ aws cognito-idp list-user-pools --max-results 10 --endpoint-url http://localhost:9229
235
+
236
+ # Cognito cadastrar um usuario pelo adminstrador
237
+ aws cognito-idp admin-create-user \
238
+ --user-pool-id us-east-xxxx\
239
+ --username usuario@email.com \
240
+ --user-attributes \
241
+ Name=email,Value=usuario@email.com \
242
+ Name=email_verified,Value=false \
243
+ Name=name,Value="nome usuario" \
244
+ Name=custom:role,Value="user" \
245
+ temporary-password "Teste@123456" \
246
+ --message-action SUPPRESS \
247
+ --endpoint-url http://localhost:9229
248
+
249
+ # Cognito excluir um usuario
250
+ aws cognito-idp admin-delete-user \
251
+ --user-pool-id us-east-xxxx \
252
+ --username usuario@email.com
253
+ --endpoint-url http://localhost:9229
254
+
255
+ # Cognito Registrar usuário
256
+ aws cognito-idp sign-up \
257
+ --client-id $CLIENT_ID \
258
+ --username usuario@email.com \
259
+ --password "Teste@123456" \
260
+ --user-attributes Name=email,Value=usuario@email.com Name=name,Value="nome usuario"
261
+ --endpoint-url http://localhost:9229
262
+
263
+ # 2. Confirmar usuário administrativamente
264
+ aws cognito-idp admin-confirm-sign-up \
265
+ --user-pool-id us-east-xxxx \
266
+ --username usuario@email.com
267
+ --endpoint-url http://localhost:9229
268
+
269
+ # O código chega no e-mail do usuário. Algo como: "Your confirmation code is 123456"
270
+ aws cognito-idp confirm-sign-up \
271
+ --client-id 3n4b5urk1ft4fl3mg5e62d9ado \
272
+ --username usuario@email.com \
273
+ --confirmation-code 123456
274
+ --endpoint-url http://localhost:9229
275
+
276
+ # STS
277
+ aws sts get-caller-identity --endpoint-url http://localhost:9326
278
+ aws sts assume-role \
279
+ --role-arn "arn:aws:iam::123456789012:role/my-role" \
280
+ --role-session-name "my-session" \
281
+ --endpoint-url http://localhost:9326
282
+
283
+ # SNS
284
+ aws sns list-topics --endpoint-url http://localhost:9911
285
+
286
+ # EventBridge
287
+ aws events list-event-buses --endpoint-url http://localhost:4010
288
+
289
+ # KMS
290
+ aws kms list-keys --endpoint-url http://localhost:4000
291
+
292
+ # Secrets Manager
293
+ aws secretsmanager list-secrets --endpoint-url http://localhost:4001
294
+
295
+ # Criar secret
296
+ aws secretsmanager create-secret \
297
+ --name "local/app/db-credentials" \
298
+ --description "Credenciais do banco" \
299
+ --secret-string '{"username":"admin","password":"secret123"}' \
300
+ --endpoint-url http://localhost:4001
301
+
302
+ # Ler secret
303
+ aws secretsmanager get-secret-value \
304
+ --secret-id "local/app/db-credentials" \
305
+ --endpoint-url http://localhost:4001
306
+
307
+ # Parameter Store
308
+ aws ssm describe-parameters --endpoint-url http://localhost:4002
309
+
310
+ # Criar parâmetro String
311
+ aws ssm put-parameter \
312
+ --name "/local/app/config" \
313
+ --value '{"timeout":30,"maxRetries":3}' \
314
+ --type String \
315
+ --endpoint-url http://localhost:4002
316
+
317
+ # Criar parâmetro SecureString
318
+ aws ssm put-parameter \
319
+ --name "/local/app/api-key" \
320
+ --value "my-secret-api-key" \
321
+ --type SecureString \
322
+ --endpoint-url http://localhost:4002
323
+
324
+ # Ler parâmetro
325
+ aws ssm get-parameter \
326
+ --name "/local/app/config" \
327
+ --endpoint-url http://localhost:4002
328
+
329
+ # CloudWatch
330
+ aws cloudwatch list-metrics --endpoint-url http://localhost:4011
331
+ aws logs describe-log-groups --endpoint-url http://localhost:4011
332
+
333
+ # CloudTrail
334
+ aws cloudtrail describe-trails --endpoint-url http://localhost:4012
335
+
336
+ # CloudFormation
337
+ aws cloudformation list-stacks --endpoint-url http://localhost:4580
338
+
339
+ # X-Ray
340
+ aws xray get-trace-summaries \
341
+ --start-time $(date -d '1 hour ago' +%s) \
342
+ --end-time $(date +%s) \
343
+ --endpoint-url http://localhost:4015
344
+
345
+ # AWS Config
346
+ aws configservice describe-configuration-recorders --endpoint-url http://localhost:4013
347
+
348
+ # API Gateway
349
+ aws apigateway get-rest-apis --endpoint-url http://localhost:4567
350
+
351
+ # Cloudformation
352
+ aws cloudformation create-stack \
353
+ --stack-name test-stack \
354
+ --template-body file://templates/test-stack.yaml \
355
+ --parameters \
356
+ ParameterKey=Environment,ParameterValue=local \
357
+ ParameterKey=BucketName,ParameterValue=meu-bucket \
358
+ ParameterKey=QueueName,ParameterValue=minha-fila \
359
+ ParameterKey=TableName,ParameterValue=minha-tabela \
360
+ --endpoint-url http://localhost:4580
361
+
362
+ # Ver Cloudformation resultado
363
+ aws cloudformation describe-stacks \
364
+ --stack-name test-stack \
365
+ --endpoint-url http://localhost:4580
366
+
367
+ # Athena
368
+ # Criar workgroup
369
+ aws athena create-work-group \
370
+ --name my-workgroup \
371
+ --configuration ResultConfiguration={OutputLocation=s3://meu-bucket/athena-results/} \
372
+ --endpoint-url http://localhost:4599
373
+
374
+ # Listar workgroups
375
+ aws athena list-work-groups --endpoint-url http://localhost:4599
376
+
377
+ # Executar query
378
+ aws athena start-query-execution \
379
+ --query-string "SELECT * FROM my_table LIMIT 10" \
380
+ --query-execution-context Database=default \
381
+ --result-configuration OutputLocation=s3://meu-bucket/athena-results/ \
382
+ --endpoint-url http://localhost:4599
383
+
384
+ # Verificar status da query
385
+ aws athena get-query-execution \
386
+ --query-execution-id <id-retornado> \
387
+ --endpoint-url http://localhost:4599
388
+
389
+ # Buscar resultados
390
+ aws athena get-query-results \
391
+ --query-execution-id <id-retornado> \
392
+ --endpoint-url http://localhost:4599
393
+
394
+ # Criar named query
395
+ aws athena create-named-query \
396
+ --name "my-saved-query" \
397
+ --database default \
398
+ --query-string "SELECT id, value FROM my_table WHERE status = 'active'" \
399
+ --endpoint-url http://localhost:4599
400
+
401
+ # Listar named queries
402
+ aws athena list-named-queries --endpoint-url http://localhost:4599
403
+ ```
404
+
405
+ ## ⚙️ Configuração S3
406
+
407
+ ### Buckets simples
408
+
409
+ ```json
410
+ {
411
+ "s3": {
412
+ "buckets": [
413
+ "my-bucket"
414
+ ]
415
+ }
416
+ }
417
+ ```
418
+
419
+ ### Buckets com região e website estático
420
+
421
+ ```json
422
+ {
423
+ "s3": {
424
+ "buckets": [
425
+ { "name": "my-bucket", "region": "us-east-1" },
426
+ {
427
+ "name": "my-site-bucket",
428
+ "region": "us-east-1",
429
+ "websiteConfiguration": {
430
+ "IndexDocument": { "Suffix": "index.html" },
431
+ "ErrorDocument": { "Key": "error.html" }
432
+ }
433
+ }
434
+ ]
435
+ }
436
+ }
437
+ ```
438
+
439
+ Quando `websiteConfiguration` está presente, o bucket serve arquivos estáticos.
440
+
441
+ ### URL do website estático
442
+
443
+ ```
444
+ http://localhost:4566/website/{bucket-name}/
445
+ http://localhost:4566/website/{bucket-name}/caminho/pagina.html
446
+ ```
447
+
448
+ Exemplos:
449
+ ```
450
+ http://localhost:4566/website/my-site-bucket/ → serve index.html
451
+ http://localhost:4566/website/my-site-bucket/about.html → serve about.html
452
+ http://localhost:4566/website/my-site-bucket/app/ → serve app/index.html
453
+ ```
454
+
455
+ ### Gerenciar website config via AWS CLI
456
+
457
+ ```bash
458
+ # Habilitar website em um bucket existente
459
+ aws s3api put-bucket-website \
460
+ --bucket my-site-bucket \
461
+ --website-configuration '{"IndexDocument":{"Suffix":"index.html"},"ErrorDocument":{"Key":"error.html"}}' \
462
+ --endpoint-url http://localhost:4566
463
+
464
+ # Ver configuração de website
465
+ aws s3api get-bucket-website \
466
+ --bucket my-site-bucket \
467
+ --endpoint-url http://localhost:4566
468
+
469
+ # Remover website
470
+ aws s3api delete-bucket-website \
471
+ --bucket my-site-bucket \
472
+ --endpoint-url http://localhost:4566
473
+ ```
474
+
475
+ ## ⚙️ Configuração de Lambdas
476
+
477
+ Lambdas são registradas por **nome** e invocadas via API de invocação (igual à AWS real). O roteamento HTTP é feito pelo API Gateway.
478
+
479
+ ```json
480
+ {
481
+ "lambdas": [
482
+ {
483
+ "name": "my-user-function",
484
+ "handler": "./src/handlers/my-user-function.js",
485
+ "env": {
486
+ "TABLE_NAME": "users-table",
487
+ "BUCKET_NAME": "my-bucket"
488
+ }
489
+ }
490
+ ]
491
+ }
492
+ ```
493
+
494
+ ## ⚙️ Configuração API GATEWAY
495
+
496
+ O valor do **lambdaName** deve igual ao nome Lambda que está registrada com o valor **name**. Ex: "my-user-function".
497
+
498
+ ```json
499
+ {
500
+ "apigateway": {
501
+ "apis": [
502
+ {
503
+ "name": "Users API",
504
+ "description": "API para gerenciamento de usuários",
505
+ "endpoints": [
506
+ {
507
+ "path": "/user",
508
+ "method": "GET",
509
+ "lambdaName": "my-user-function",
510
+ "integrationType": "lambda"
511
+ },
512
+ {
513
+ "path": "/user",
514
+ "method": "POST",
515
+ "lambdaName": "my-user-function",
516
+ "integrationType": "lambda"
517
+ },
518
+ {
519
+ "path": "/user/{id}",
520
+ "method": "GET",
521
+ "lambdaName": "my-user-function",
522
+ "integrationType": "lambda"
523
+ },
524
+ {
525
+ "path": "/user/{id}",
526
+ "method": "DELETE",
527
+ "lambdaName": "my-user-function",
528
+ "integrationType": "lambda"
529
+ }
530
+ ]
531
+ }
532
+ ]
533
+ },
534
+
535
+ }
536
+ ```
537
+
538
+ O handler deve exportar uma função padrão:
539
+
540
+ ```javascript
541
+ exports.handler = async (event, context) => {
542
+ return {
543
+ statusCode: 200,
544
+ body: JSON.stringify({ message: 'Hello from Lambda!' })
545
+ };
546
+ };
547
+ ```
548
+
549
+ ## 📁 Estrutura de Dados
550
+
551
+ Os dados são persistidos em:
552
+
553
+ ```text
554
+ .aws-local-simulator-data/
555
+ ├── dynamodb/
556
+ ├── s3/
557
+ ├── sqs/
558
+ ├── cognito/
559
+ ├── apigateway/
560
+ ├── ecs/
561
+ ├── kms/
562
+ ├── secret-manager/
563
+ ├── parameter-store/
564
+ ├── cloudwatch/
565
+ ├── cloudtrail/
566
+ ├── cloudformation/
567
+ ├── athena/
568
+ ├── xray/
569
+ └── config/
570
+ ```
571
+
572
+ ## 🐛 Debug
573
+
574
+ ```bash
575
+ AWS_LOCAL_SIMULATOR_LOG=verbose npx aws-local-simulator start
576
+ ```
577
+
578
+ ## 🤝 Contribuindo
579
+
580
+ 1. Fork o projeto
581
+ 2. Crie sua feature branch (`git checkout -b feature/AmazingFeature`)
582
+ 3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)
583
+ 4. Push para a branch (`git push origin feature/AmazingFeature`)
584
+ 5. Abra um Pull Request
585
+
586
+ ## 📄 Licença
587
+
588
+ MIT © Luiz Gustavo Ribeiro
589
+
590
+ ## ⚠️ Limitações
591
+
592
+ - ECS/Fargate em desenvolvimento
593
+ - WebSocket APIs em desenvolvimento
594
+ - Para uso em desenvolvimento e testes apenas