@stacksjs/ts-cloud-core 0.1.3 → 0.1.6
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 +98 -13
- package/package.json +12 -3
- package/src/advanced-features.test.ts +0 -465
- package/src/aws/cloudformation.ts +0 -421
- package/src/aws/cloudfront.ts +0 -158
- package/src/aws/credentials.test.ts +0 -132
- package/src/aws/credentials.ts +0 -545
- package/src/aws/index.ts +0 -87
- package/src/aws/s3.test.ts +0 -188
- package/src/aws/s3.ts +0 -1088
- package/src/aws/signature.test.ts +0 -670
- package/src/aws/signature.ts +0 -1155
- package/src/backup/disaster-recovery.test.ts +0 -726
- package/src/backup/disaster-recovery.ts +0 -500
- package/src/backup/index.ts +0 -34
- package/src/backup/manager.test.ts +0 -498
- package/src/backup/manager.ts +0 -432
- package/src/cicd/circleci.ts +0 -430
- package/src/cicd/github-actions.ts +0 -424
- package/src/cicd/gitlab-ci.ts +0 -255
- package/src/cicd/index.ts +0 -8
- package/src/cli/history.ts +0 -396
- package/src/cli/index.ts +0 -10
- package/src/cli/progress.ts +0 -458
- package/src/cli/repl.ts +0 -454
- package/src/cli/suggestions.ts +0 -327
- package/src/cli/table.test.ts +0 -319
- package/src/cli/table.ts +0 -332
- package/src/cloudformation/builder.test.ts +0 -327
- package/src/cloudformation/builder.ts +0 -378
- package/src/cloudformation/builders/api-gateway.ts +0 -449
- package/src/cloudformation/builders/cache.ts +0 -334
- package/src/cloudformation/builders/cdn.ts +0 -278
- package/src/cloudformation/builders/compute.ts +0 -485
- package/src/cloudformation/builders/database.ts +0 -392
- package/src/cloudformation/builders/functions.ts +0 -343
- package/src/cloudformation/builders/messaging.ts +0 -140
- package/src/cloudformation/builders/monitoring.ts +0 -300
- package/src/cloudformation/builders/network.ts +0 -264
- package/src/cloudformation/builders/queue.ts +0 -147
- package/src/cloudformation/builders/security.ts +0 -399
- package/src/cloudformation/builders/storage.ts +0 -285
- package/src/cloudformation/index.ts +0 -30
- package/src/cloudformation/types.ts +0 -173
- package/src/compliance/aws-config.ts +0 -543
- package/src/compliance/cloudtrail.ts +0 -376
- package/src/compliance/compliance.test.ts +0 -423
- package/src/compliance/guardduty.ts +0 -446
- package/src/compliance/index.ts +0 -66
- package/src/compliance/security-hub.ts +0 -456
- package/src/containers/build-optimization.ts +0 -416
- package/src/containers/containers.test.ts +0 -508
- package/src/containers/image-scanning.ts +0 -360
- package/src/containers/index.ts +0 -9
- package/src/containers/registry.ts +0 -293
- package/src/containers/service-mesh.ts +0 -520
- package/src/database/database.test.ts +0 -762
- package/src/database/index.ts +0 -9
- package/src/database/migrations.ts +0 -444
- package/src/database/performance.ts +0 -528
- package/src/database/replicas.ts +0 -534
- package/src/database/users.ts +0 -494
- package/src/dependency-graph.ts +0 -143
- package/src/deployment/ab-testing.ts +0 -582
- package/src/deployment/blue-green.ts +0 -452
- package/src/deployment/canary.ts +0 -500
- package/src/deployment/deployment.test.ts +0 -526
- package/src/deployment/index.ts +0 -61
- package/src/deployment/progressive.ts +0 -62
- package/src/dns/dns.test.ts +0 -641
- package/src/dns/dnssec.ts +0 -315
- package/src/dns/index.ts +0 -8
- package/src/dns/resolver.ts +0 -496
- package/src/dns/routing.ts +0 -593
- package/src/email/advanced/analytics.ts +0 -445
- package/src/email/advanced/index.ts +0 -11
- package/src/email/advanced/rules.ts +0 -465
- package/src/email/advanced/scheduling.ts +0 -352
- package/src/email/advanced/search.ts +0 -412
- package/src/email/advanced/shared-mailboxes.ts +0 -404
- package/src/email/advanced/templates.ts +0 -455
- package/src/email/advanced/threading.ts +0 -281
- package/src/email/analytics.ts +0 -467
- package/src/email/bounce-handling.ts +0 -425
- package/src/email/email.test.ts +0 -431
- package/src/email/handlers/__tests__/inbound.test.ts +0 -38
- package/src/email/handlers/__tests__/outbound.test.ts +0 -37
- package/src/email/handlers/converter.ts +0 -227
- package/src/email/handlers/feedback.ts +0 -228
- package/src/email/handlers/inbound.ts +0 -169
- package/src/email/handlers/outbound.ts +0 -178
- package/src/email/index.ts +0 -15
- package/src/email/reputation.ts +0 -303
- package/src/email/templates.ts +0 -352
- package/src/errors/index.test.ts +0 -434
- package/src/errors/index.ts +0 -416
- package/src/health-checks/index.ts +0 -40
- package/src/index.ts +0 -360
- package/src/intrinsic-functions.ts +0 -118
- package/src/lambda/concurrency.ts +0 -330
- package/src/lambda/destinations.ts +0 -345
- package/src/lambda/dlq.ts +0 -425
- package/src/lambda/index.ts +0 -11
- package/src/lambda/lambda.test.ts +0 -840
- package/src/lambda/layers.ts +0 -263
- package/src/lambda/versions.ts +0 -376
- package/src/lambda/vpc.ts +0 -399
- package/src/local/config.ts +0 -114
- package/src/local/index.ts +0 -6
- package/src/local/mock-aws.ts +0 -351
- package/src/modules/ai.ts +0 -340
- package/src/modules/api.ts +0 -478
- package/src/modules/auth.ts +0 -805
- package/src/modules/cache.ts +0 -417
- package/src/modules/cdn.ts +0 -1062
- package/src/modules/communication.ts +0 -1094
- package/src/modules/compute.ts +0 -3348
- package/src/modules/database.ts +0 -554
- package/src/modules/deployment.ts +0 -1079
- package/src/modules/dns.ts +0 -337
- package/src/modules/email.ts +0 -1538
- package/src/modules/filesystem.ts +0 -515
- package/src/modules/index.ts +0 -32
- package/src/modules/messaging.ts +0 -486
- package/src/modules/monitoring.ts +0 -2086
- package/src/modules/network.ts +0 -664
- package/src/modules/parameter-store.ts +0 -325
- package/src/modules/permissions.ts +0 -1081
- package/src/modules/phone.ts +0 -494
- package/src/modules/queue.ts +0 -1260
- package/src/modules/redirects.ts +0 -464
- package/src/modules/registry.ts +0 -699
- package/src/modules/search.ts +0 -401
- package/src/modules/secrets.ts +0 -416
- package/src/modules/security.ts +0 -731
- package/src/modules/sms.ts +0 -389
- package/src/modules/storage.ts +0 -1120
- package/src/modules/workflow.ts +0 -680
- package/src/multi-account/config.ts +0 -521
- package/src/multi-account/index.ts +0 -7
- package/src/multi-account/manager.ts +0 -427
- package/src/multi-region/cross-region.ts +0 -410
- package/src/multi-region/index.ts +0 -8
- package/src/multi-region/manager.ts +0 -483
- package/src/multi-region/regions.ts +0 -435
- package/src/network-security/index.ts +0 -48
- package/src/observability/index.ts +0 -9
- package/src/observability/logs.ts +0 -522
- package/src/observability/metrics.ts +0 -460
- package/src/observability/observability.test.ts +0 -782
- package/src/observability/synthetics.ts +0 -568
- package/src/observability/xray.ts +0 -358
- package/src/phone/advanced/analytics.ts +0 -349
- package/src/phone/advanced/callbacks.ts +0 -428
- package/src/phone/advanced/index.ts +0 -8
- package/src/phone/advanced/ivr-builder.ts +0 -504
- package/src/phone/advanced/recording.ts +0 -310
- package/src/phone/handlers/__tests__/incoming-call.test.ts +0 -40
- package/src/phone/handlers/incoming-call.ts +0 -117
- package/src/phone/handlers/missed-call.ts +0 -116
- package/src/phone/handlers/voicemail.ts +0 -179
- package/src/phone/index.ts +0 -9
- package/src/presets/api-backend.ts +0 -134
- package/src/presets/data-pipeline.ts +0 -204
- package/src/presets/extend.test.ts +0 -295
- package/src/presets/extend.ts +0 -297
- package/src/presets/fullstack-app.ts +0 -144
- package/src/presets/index.ts +0 -27
- package/src/presets/jamstack.ts +0 -135
- package/src/presets/microservices.ts +0 -167
- package/src/presets/ml-api.ts +0 -208
- package/src/presets/nodejs-server.ts +0 -104
- package/src/presets/nodejs-serverless.ts +0 -114
- package/src/presets/realtime-app.ts +0 -184
- package/src/presets/static-site.ts +0 -64
- package/src/presets/traditional-web-app.ts +0 -339
- package/src/presets/wordpress.ts +0 -138
- package/src/preview/github.test.ts +0 -249
- package/src/preview/github.ts +0 -297
- package/src/preview/index.ts +0 -37
- package/src/preview/manager.test.ts +0 -440
- package/src/preview/manager.ts +0 -326
- package/src/preview/notifications.test.ts +0 -582
- package/src/preview/notifications.ts +0 -341
- package/src/queue/batch-processing.ts +0 -402
- package/src/queue/dlq-monitoring.ts +0 -402
- package/src/queue/fifo.ts +0 -342
- package/src/queue/index.ts +0 -9
- package/src/queue/management.ts +0 -428
- package/src/queue/queue.test.ts +0 -429
- package/src/resource-mgmt/index.ts +0 -39
- package/src/resource-naming.ts +0 -62
- package/src/s3/index.ts +0 -523
- package/src/schema/cloud-config.schema.json +0 -554
- package/src/schema/index.ts +0 -68
- package/src/security/certificate-manager.ts +0 -492
- package/src/security/index.ts +0 -9
- package/src/security/scanning.ts +0 -545
- package/src/security/secrets-manager.ts +0 -476
- package/src/security/secrets-rotation.ts +0 -456
- package/src/security/security.test.ts +0 -738
- package/src/sms/advanced/ab-testing.ts +0 -389
- package/src/sms/advanced/analytics.ts +0 -336
- package/src/sms/advanced/campaigns.ts +0 -523
- package/src/sms/advanced/chatbot.ts +0 -224
- package/src/sms/advanced/index.ts +0 -10
- package/src/sms/advanced/link-tracking.ts +0 -248
- package/src/sms/advanced/mms.ts +0 -308
- package/src/sms/handlers/__tests__/send.test.ts +0 -40
- package/src/sms/handlers/delivery-status.ts +0 -133
- package/src/sms/handlers/receive.ts +0 -162
- package/src/sms/handlers/send.ts +0 -174
- package/src/sms/index.ts +0 -9
- package/src/stack-diff.ts +0 -389
- package/src/static-site/index.ts +0 -85
- package/src/template-builder.ts +0 -110
- package/src/template-validator.ts +0 -574
- package/src/utils/cache.ts +0 -291
- package/src/utils/diff.ts +0 -269
- package/src/utils/hash.ts +0 -227
- package/src/utils/index.ts +0 -8
- package/src/utils/parallel.ts +0 -294
- package/src/validators/credentials.test.ts +0 -274
- package/src/validators/credentials.ts +0 -233
- package/src/validators/quotas.test.ts +0 -434
- package/src/validators/quotas.ts +0 -217
- package/test/ai.test.ts +0 -327
- package/test/api.test.ts +0 -511
- package/test/auth.test.ts +0 -632
- package/test/cache.test.ts +0 -406
- package/test/cdn.test.ts +0 -247
- package/test/compute.test.ts +0 -861
- package/test/database.test.ts +0 -523
- package/test/deployment.test.ts +0 -499
- package/test/dns.test.ts +0 -270
- package/test/email.test.ts +0 -439
- package/test/filesystem.test.ts +0 -382
- package/test/integration.test.ts +0 -350
- package/test/messaging.test.ts +0 -514
- package/test/monitoring.test.ts +0 -634
- package/test/network.test.ts +0 -425
- package/test/permissions.test.ts +0 -488
- package/test/queue.test.ts +0 -484
- package/test/registry.test.ts +0 -306
- package/test/security.test.ts +0 -462
- package/test/storage.test.ts +0 -463
- package/test/template-validator.test.ts +0 -559
- package/test/workflow.test.ts +0 -592
- package/tsconfig.json +0 -16
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,500 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Disaster Recovery Module
|
|
3
|
-
* Automated failover, recovery runbooks, and DR testing
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export interface DisasterRecoveryPlan {
|
|
7
|
-
id: string
|
|
8
|
-
name: string
|
|
9
|
-
primaryRegion: string
|
|
10
|
-
secondaryRegion: string
|
|
11
|
-
rto: number // Recovery Time Objective in minutes
|
|
12
|
-
rpo: number // Recovery Point Objective in minutes
|
|
13
|
-
resources: DRResource[]
|
|
14
|
-
runbook: RecoveryRunbook
|
|
15
|
-
testSchedule?: string // Cron for automated DR testing
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface DRResource {
|
|
19
|
-
resourceId: string
|
|
20
|
-
resourceType: 'rds' | 'dynamodb' | 'efs' | 's3' | 'ec2' | 'ecs'
|
|
21
|
-
primaryArn: string
|
|
22
|
-
secondaryArn?: string
|
|
23
|
-
replicationEnabled: boolean
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface RecoveryRunbook {
|
|
27
|
-
steps: RecoveryStep[]
|
|
28
|
-
estimatedDuration: number // in minutes
|
|
29
|
-
requiredApprovals?: string[]
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface RecoveryStep {
|
|
33
|
-
order: number
|
|
34
|
-
name: string
|
|
35
|
-
description: string
|
|
36
|
-
action: string
|
|
37
|
-
automatable: boolean
|
|
38
|
-
estimatedDuration: number
|
|
39
|
-
rollbackable: boolean
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface FailoverTest {
|
|
43
|
-
id: string
|
|
44
|
-
planId: string
|
|
45
|
-
status: 'scheduled' | 'running' | 'completed' | 'failed'
|
|
46
|
-
startTime: Date
|
|
47
|
-
endTime?: Date
|
|
48
|
-
results?: FailoverTestResult[]
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export interface FailoverTestResult {
|
|
52
|
-
step: string
|
|
53
|
-
status: 'success' | 'failed' | 'skipped'
|
|
54
|
-
duration: number
|
|
55
|
-
message?: string
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Disaster recovery manager
|
|
60
|
-
*/
|
|
61
|
-
export class DisasterRecoveryManager {
|
|
62
|
-
private drPlans: Map<string, DisasterRecoveryPlan> = new Map()
|
|
63
|
-
private failoverTests: Map<string, FailoverTest> = new Map()
|
|
64
|
-
private planCounter = 0
|
|
65
|
-
private testCounter = 0
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Create disaster recovery plan
|
|
69
|
-
*/
|
|
70
|
-
createDRPlan(plan: Omit<DisasterRecoveryPlan, 'id'>): DisasterRecoveryPlan {
|
|
71
|
-
const id = `dr-plan-${Date.now()}-${this.planCounter++}`
|
|
72
|
-
|
|
73
|
-
const drPlan: DisasterRecoveryPlan = {
|
|
74
|
-
id,
|
|
75
|
-
...plan,
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
this.drPlans.set(id, drPlan)
|
|
79
|
-
|
|
80
|
-
return drPlan
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Create standard RDS DR plan
|
|
85
|
-
*/
|
|
86
|
-
createRDSDRPlan(options: {
|
|
87
|
-
primaryDbArn: string
|
|
88
|
-
secondaryDbArn: string
|
|
89
|
-
primaryRegion: string
|
|
90
|
-
secondaryRegion: string
|
|
91
|
-
rto?: number
|
|
92
|
-
rpo?: number
|
|
93
|
-
}): DisasterRecoveryPlan {
|
|
94
|
-
const {
|
|
95
|
-
primaryDbArn,
|
|
96
|
-
secondaryDbArn,
|
|
97
|
-
primaryRegion,
|
|
98
|
-
secondaryRegion,
|
|
99
|
-
rto = 60, // 1 hour
|
|
100
|
-
rpo = 5, // 5 minutes
|
|
101
|
-
} = options
|
|
102
|
-
|
|
103
|
-
return this.createDRPlan({
|
|
104
|
-
name: 'RDS Multi-Region DR',
|
|
105
|
-
primaryRegion,
|
|
106
|
-
secondaryRegion,
|
|
107
|
-
rto,
|
|
108
|
-
rpo,
|
|
109
|
-
resources: [
|
|
110
|
-
{
|
|
111
|
-
resourceId: 'primary-db',
|
|
112
|
-
resourceType: 'rds',
|
|
113
|
-
primaryArn: primaryDbArn,
|
|
114
|
-
secondaryArn: secondaryDbArn,
|
|
115
|
-
replicationEnabled: true,
|
|
116
|
-
},
|
|
117
|
-
],
|
|
118
|
-
runbook: this.generateRDSRunbook(primaryRegion, secondaryRegion),
|
|
119
|
-
testSchedule: '0 0 1 * *', // Monthly DR test
|
|
120
|
-
})
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Create DynamoDB DR plan
|
|
125
|
-
*/
|
|
126
|
-
createDynamoDBDRPlan(options: {
|
|
127
|
-
tableArn: string
|
|
128
|
-
regions: string[]
|
|
129
|
-
rto?: number
|
|
130
|
-
rpo?: number
|
|
131
|
-
}): DisasterRecoveryPlan {
|
|
132
|
-
const {
|
|
133
|
-
tableArn,
|
|
134
|
-
regions,
|
|
135
|
-
rto = 15, // 15 minutes
|
|
136
|
-
rpo = 1, // 1 minute (global tables)
|
|
137
|
-
} = options
|
|
138
|
-
|
|
139
|
-
return this.createDRPlan({
|
|
140
|
-
name: 'DynamoDB Global Tables DR',
|
|
141
|
-
primaryRegion: regions[0],
|
|
142
|
-
secondaryRegion: regions[1],
|
|
143
|
-
rto,
|
|
144
|
-
rpo,
|
|
145
|
-
resources: [
|
|
146
|
-
{
|
|
147
|
-
resourceId: 'dynamodb-table',
|
|
148
|
-
resourceType: 'dynamodb',
|
|
149
|
-
primaryArn: tableArn,
|
|
150
|
-
replicationEnabled: true,
|
|
151
|
-
},
|
|
152
|
-
],
|
|
153
|
-
runbook: this.generateDynamoDBRunbook(regions),
|
|
154
|
-
})
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Generate RDS disaster recovery runbook
|
|
159
|
-
*/
|
|
160
|
-
private generateRDSRunbook(primaryRegion: string, secondaryRegion: string): RecoveryRunbook {
|
|
161
|
-
return {
|
|
162
|
-
estimatedDuration: 60,
|
|
163
|
-
requiredApprovals: ['cto', 'engineering-lead'],
|
|
164
|
-
steps: [
|
|
165
|
-
{
|
|
166
|
-
order: 1,
|
|
167
|
-
name: 'Verify Primary Database Failure',
|
|
168
|
-
description: 'Confirm that the primary database is truly unavailable and not experiencing temporary issues',
|
|
169
|
-
action: 'aws rds describe-db-instances --region ' + primaryRegion,
|
|
170
|
-
automatable: true,
|
|
171
|
-
estimatedDuration: 2,
|
|
172
|
-
rollbackable: false,
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
order: 2,
|
|
176
|
-
name: 'Check Replication Lag',
|
|
177
|
-
description: 'Verify that the read replica is up to date',
|
|
178
|
-
action: 'Check ReplicaLag metric in CloudWatch',
|
|
179
|
-
automatable: true,
|
|
180
|
-
estimatedDuration: 1,
|
|
181
|
-
rollbackable: false,
|
|
182
|
-
},
|
|
183
|
-
{
|
|
184
|
-
order: 3,
|
|
185
|
-
name: 'Promote Read Replica',
|
|
186
|
-
description: 'Promote the read replica in the secondary region to be the new primary',
|
|
187
|
-
action: 'aws rds promote-read-replica --db-instance-identifier replica --region ' + secondaryRegion,
|
|
188
|
-
automatable: true,
|
|
189
|
-
estimatedDuration: 10,
|
|
190
|
-
rollbackable: false,
|
|
191
|
-
},
|
|
192
|
-
{
|
|
193
|
-
order: 4,
|
|
194
|
-
name: 'Update DNS Records',
|
|
195
|
-
description: 'Update Route53 records to point to the new primary database',
|
|
196
|
-
action: 'Update Route53 failover record set',
|
|
197
|
-
automatable: true,
|
|
198
|
-
estimatedDuration: 5,
|
|
199
|
-
rollbackable: true,
|
|
200
|
-
},
|
|
201
|
-
{
|
|
202
|
-
order: 5,
|
|
203
|
-
name: 'Update Application Configuration',
|
|
204
|
-
description: 'Update application connection strings if needed',
|
|
205
|
-
action: 'Deploy configuration update to ECS/Lambda',
|
|
206
|
-
automatable: true,
|
|
207
|
-
estimatedDuration: 10,
|
|
208
|
-
rollbackable: true,
|
|
209
|
-
},
|
|
210
|
-
{
|
|
211
|
-
order: 6,
|
|
212
|
-
name: 'Verify Application Connectivity',
|
|
213
|
-
description: 'Test that applications can connect to the new primary',
|
|
214
|
-
action: 'Run smoke tests',
|
|
215
|
-
automatable: true,
|
|
216
|
-
estimatedDuration: 5,
|
|
217
|
-
rollbackable: false,
|
|
218
|
-
},
|
|
219
|
-
{
|
|
220
|
-
order: 7,
|
|
221
|
-
name: 'Monitor for Issues',
|
|
222
|
-
description: 'Monitor CloudWatch metrics and application logs',
|
|
223
|
-
action: 'Monitor for 30 minutes',
|
|
224
|
-
automatable: false,
|
|
225
|
-
estimatedDuration: 30,
|
|
226
|
-
rollbackable: false,
|
|
227
|
-
},
|
|
228
|
-
],
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* Generate DynamoDB disaster recovery runbook
|
|
234
|
-
*/
|
|
235
|
-
private generateDynamoDBRunbook(regions: string[]): RecoveryRunbook {
|
|
236
|
-
return {
|
|
237
|
-
estimatedDuration: 15,
|
|
238
|
-
steps: [
|
|
239
|
-
{
|
|
240
|
-
order: 1,
|
|
241
|
-
name: 'Verify Primary Region Failure',
|
|
242
|
-
description: 'Confirm that the primary region is experiencing an outage',
|
|
243
|
-
action: 'Check AWS Health Dashboard',
|
|
244
|
-
automatable: true,
|
|
245
|
-
estimatedDuration: 2,
|
|
246
|
-
rollbackable: false,
|
|
247
|
-
},
|
|
248
|
-
{
|
|
249
|
-
order: 2,
|
|
250
|
-
name: 'Update Route53 Failover',
|
|
251
|
-
description: 'Update Route53 to direct traffic to secondary region',
|
|
252
|
-
action: 'Update Route53 health check and failover records',
|
|
253
|
-
automatable: true,
|
|
254
|
-
estimatedDuration: 5,
|
|
255
|
-
rollbackable: true,
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
order: 3,
|
|
259
|
-
name: 'Update Application Endpoints',
|
|
260
|
-
description: 'Update Lambda/ECS to use secondary region DynamoDB endpoint',
|
|
261
|
-
action: 'Deploy configuration update',
|
|
262
|
-
automatable: true,
|
|
263
|
-
estimatedDuration: 5,
|
|
264
|
-
rollbackable: true,
|
|
265
|
-
},
|
|
266
|
-
{
|
|
267
|
-
order: 4,
|
|
268
|
-
name: 'Verify Data Consistency',
|
|
269
|
-
description: 'Verify that data is consistent in secondary region',
|
|
270
|
-
action: 'Run data validation queries',
|
|
271
|
-
automatable: true,
|
|
272
|
-
estimatedDuration: 3,
|
|
273
|
-
rollbackable: false,
|
|
274
|
-
},
|
|
275
|
-
],
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* Execute failover
|
|
281
|
-
*/
|
|
282
|
-
async executeFailover(planId: string, dryRun: boolean = false): Promise<{
|
|
283
|
-
success: boolean
|
|
284
|
-
duration: number
|
|
285
|
-
completedSteps: number
|
|
286
|
-
failedStep?: string
|
|
287
|
-
}> {
|
|
288
|
-
const plan = this.drPlans.get(planId)
|
|
289
|
-
|
|
290
|
-
if (!plan) {
|
|
291
|
-
throw new Error(`DR plan not found: ${planId}`)
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
const startTime = Date.now()
|
|
295
|
-
let completedSteps = 0
|
|
296
|
-
|
|
297
|
-
console.log(`${dryRun ? '[DRY RUN] ' : ''}Executing failover for plan: ${plan.name}`)
|
|
298
|
-
console.log(`Primary: ${plan.primaryRegion} -> Secondary: ${plan.secondaryRegion}`)
|
|
299
|
-
console.log(`RTO: ${plan.rto} minutes, RPO: ${plan.rpo} minutes`)
|
|
300
|
-
console.log('')
|
|
301
|
-
|
|
302
|
-
for (const step of plan.runbook.steps) {
|
|
303
|
-
console.log(`Step ${step.order}: ${step.name}`)
|
|
304
|
-
console.log(` ${step.description}`)
|
|
305
|
-
console.log(` Action: ${step.action}`)
|
|
306
|
-
console.log(` Estimated: ${step.estimatedDuration} minutes`)
|
|
307
|
-
|
|
308
|
-
if (dryRun) {
|
|
309
|
-
console.log(' [SKIPPED - DRY RUN]')
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
// In real implementation, would execute the actual step
|
|
313
|
-
if (step.automatable) {
|
|
314
|
-
console.log(' [AUTOMATED]')
|
|
315
|
-
}
|
|
316
|
-
else {
|
|
317
|
-
console.log(' [MANUAL - WAITING]')
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
completedSteps++
|
|
322
|
-
console.log('')
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
const duration = (Date.now() - startTime) / 1000 / 60 // minutes
|
|
326
|
-
|
|
327
|
-
return {
|
|
328
|
-
success: true,
|
|
329
|
-
duration,
|
|
330
|
-
completedSteps,
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* Schedule automated failover test
|
|
336
|
-
*/
|
|
337
|
-
scheduleFailoverTest(planId: string, testDate: Date): FailoverTest {
|
|
338
|
-
const test: FailoverTest = {
|
|
339
|
-
id: `failover-test-${Date.now()}-${this.testCounter++}`,
|
|
340
|
-
planId,
|
|
341
|
-
status: 'scheduled',
|
|
342
|
-
startTime: testDate,
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
this.failoverTests.set(test.id, test)
|
|
346
|
-
|
|
347
|
-
return test
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/**
|
|
351
|
-
* Run failover test
|
|
352
|
-
*/
|
|
353
|
-
async runFailoverTest(planId: string): Promise<FailoverTest> {
|
|
354
|
-
const plan = this.drPlans.get(planId)
|
|
355
|
-
|
|
356
|
-
if (!plan) {
|
|
357
|
-
throw new Error(`DR plan not found: ${planId}`)
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
const test: FailoverTest = {
|
|
361
|
-
id: `failover-test-${Date.now()}-${this.testCounter++}`,
|
|
362
|
-
planId,
|
|
363
|
-
status: 'running',
|
|
364
|
-
startTime: new Date(),
|
|
365
|
-
results: [],
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
this.failoverTests.set(test.id, test)
|
|
369
|
-
|
|
370
|
-
console.log(`Running failover test for plan: ${plan.name}`)
|
|
371
|
-
console.log('This is a non-destructive test using test resources')
|
|
372
|
-
console.log('')
|
|
373
|
-
|
|
374
|
-
// Simulate running each step
|
|
375
|
-
for (const step of plan.runbook.steps) {
|
|
376
|
-
const stepStart = Date.now()
|
|
377
|
-
|
|
378
|
-
console.log(`Testing step ${step.order}: ${step.name}`)
|
|
379
|
-
|
|
380
|
-
const result: FailoverTestResult = {
|
|
381
|
-
step: step.name,
|
|
382
|
-
status: 'success',
|
|
383
|
-
duration: (Date.now() - stepStart) / 1000,
|
|
384
|
-
message: `Successfully validated step ${step.order}`,
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
test.results!.push(result)
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
test.status = 'completed'
|
|
391
|
-
test.endTime = new Date()
|
|
392
|
-
|
|
393
|
-
return test
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* Get DR plan
|
|
398
|
-
*/
|
|
399
|
-
getDRPlan(id: string): DisasterRecoveryPlan | undefined {
|
|
400
|
-
return this.drPlans.get(id)
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
/**
|
|
404
|
-
* List DR plans
|
|
405
|
-
*/
|
|
406
|
-
listDRPlans(): DisasterRecoveryPlan[] {
|
|
407
|
-
return Array.from(this.drPlans.values())
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
/**
|
|
411
|
-
* Get failover test
|
|
412
|
-
*/
|
|
413
|
-
getFailoverTest(id: string): FailoverTest | undefined {
|
|
414
|
-
return this.failoverTests.get(id)
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
/**
|
|
418
|
-
* List failover tests
|
|
419
|
-
*/
|
|
420
|
-
listFailoverTests(): FailoverTest[] {
|
|
421
|
-
return Array.from(this.failoverTests.values())
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
* Validate DR plan
|
|
426
|
-
*/
|
|
427
|
-
validateDRPlan(plan: DisasterRecoveryPlan): {
|
|
428
|
-
valid: boolean
|
|
429
|
-
warnings: string[]
|
|
430
|
-
errors: string[]
|
|
431
|
-
} {
|
|
432
|
-
const warnings: string[] = []
|
|
433
|
-
const errors: string[] = []
|
|
434
|
-
|
|
435
|
-
// Check RTO/RPO
|
|
436
|
-
if (plan.rto < plan.rpo) {
|
|
437
|
-
errors.push('RTO cannot be less than RPO')
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
if (plan.rto > 240) {
|
|
441
|
-
warnings.push('RTO exceeds 4 hours - consider improving recovery time')
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
if (plan.rpo > 60) {
|
|
445
|
-
warnings.push('RPO exceeds 1 hour - consider more frequent backups')
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
// Check resources
|
|
449
|
-
if (plan.resources.length === 0) {
|
|
450
|
-
errors.push('No resources defined in DR plan')
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
for (const resource of plan.resources) {
|
|
454
|
-
if (!resource.replicationEnabled) {
|
|
455
|
-
warnings.push(`Resource ${resource.resourceId} does not have replication enabled`)
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
if (!resource.secondaryArn && resource.resourceType !== 'dynamodb') {
|
|
459
|
-
warnings.push(`Resource ${resource.resourceId} does not have secondary resource defined`)
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
// Check runbook
|
|
464
|
-
if (plan.runbook.steps.length === 0) {
|
|
465
|
-
errors.push('No recovery steps defined in runbook')
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
const totalEstimatedDuration = plan.runbook.steps.reduce((sum, step) => sum + step.estimatedDuration, 0)
|
|
469
|
-
if (totalEstimatedDuration > plan.rto) {
|
|
470
|
-
warnings.push(`Estimated recovery duration (${totalEstimatedDuration}m) exceeds RTO (${plan.rto}m)`)
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
// Check for manual steps
|
|
474
|
-
const manualSteps = plan.runbook.steps.filter(s => !s.automatable)
|
|
475
|
-
if (manualSteps.length > 0) {
|
|
476
|
-
warnings.push(`${manualSteps.length} manual steps in runbook - consider automation`)
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
return {
|
|
480
|
-
valid: errors.length === 0,
|
|
481
|
-
warnings,
|
|
482
|
-
errors,
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
/**
|
|
487
|
-
* Clear all data
|
|
488
|
-
*/
|
|
489
|
-
clear(): void {
|
|
490
|
-
this.drPlans.clear()
|
|
491
|
-
this.failoverTests.clear()
|
|
492
|
-
this.planCounter = 0
|
|
493
|
-
this.testCounter = 0
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
/**
|
|
498
|
-
* Global disaster recovery manager instance
|
|
499
|
-
*/
|
|
500
|
-
export const drManager: DisasterRecoveryManager = new DisasterRecoveryManager()
|
package/src/backup/index.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Backup & Disaster Recovery
|
|
3
|
-
* Automated backup schedules and disaster recovery planning
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
// Backup Manager
|
|
7
|
-
export {
|
|
8
|
-
BackupManager,
|
|
9
|
-
backupManager,
|
|
10
|
-
} from './manager'
|
|
11
|
-
|
|
12
|
-
export type {
|
|
13
|
-
BackupPlan,
|
|
14
|
-
BackupResource,
|
|
15
|
-
BackupLifecycle,
|
|
16
|
-
BackupVault,
|
|
17
|
-
RestoreJob,
|
|
18
|
-
ContinuousBackup,
|
|
19
|
-
} from './manager'
|
|
20
|
-
|
|
21
|
-
// Disaster Recovery
|
|
22
|
-
export {
|
|
23
|
-
DisasterRecoveryManager,
|
|
24
|
-
drManager,
|
|
25
|
-
} from './disaster-recovery'
|
|
26
|
-
|
|
27
|
-
export type {
|
|
28
|
-
DisasterRecoveryPlan,
|
|
29
|
-
DRResource,
|
|
30
|
-
RecoveryRunbook,
|
|
31
|
-
RecoveryStep,
|
|
32
|
-
FailoverTest,
|
|
33
|
-
FailoverTestResult,
|
|
34
|
-
} from './disaster-recovery'
|