@stacksjs/ts-cloud-core 0.1.1

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 (251) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +321 -0
  3. package/package.json +31 -0
  4. package/src/advanced-features.test.ts +465 -0
  5. package/src/aws/cloudformation.ts +421 -0
  6. package/src/aws/cloudfront.ts +158 -0
  7. package/src/aws/credentials.test.ts +132 -0
  8. package/src/aws/credentials.ts +545 -0
  9. package/src/aws/index.ts +87 -0
  10. package/src/aws/s3.test.ts +188 -0
  11. package/src/aws/s3.ts +1088 -0
  12. package/src/aws/signature.test.ts +670 -0
  13. package/src/aws/signature.ts +1155 -0
  14. package/src/backup/disaster-recovery.test.ts +726 -0
  15. package/src/backup/disaster-recovery.ts +500 -0
  16. package/src/backup/index.ts +34 -0
  17. package/src/backup/manager.test.ts +498 -0
  18. package/src/backup/manager.ts +432 -0
  19. package/src/cicd/circleci.ts +430 -0
  20. package/src/cicd/github-actions.ts +424 -0
  21. package/src/cicd/gitlab-ci.ts +255 -0
  22. package/src/cicd/index.ts +8 -0
  23. package/src/cli/history.ts +396 -0
  24. package/src/cli/index.ts +10 -0
  25. package/src/cli/progress.ts +458 -0
  26. package/src/cli/repl.ts +454 -0
  27. package/src/cli/suggestions.ts +327 -0
  28. package/src/cli/table.test.ts +319 -0
  29. package/src/cli/table.ts +332 -0
  30. package/src/cloudformation/builder.test.ts +327 -0
  31. package/src/cloudformation/builder.ts +378 -0
  32. package/src/cloudformation/builders/api-gateway.ts +449 -0
  33. package/src/cloudformation/builders/cache.ts +334 -0
  34. package/src/cloudformation/builders/cdn.ts +278 -0
  35. package/src/cloudformation/builders/compute.ts +485 -0
  36. package/src/cloudformation/builders/database.ts +392 -0
  37. package/src/cloudformation/builders/functions.ts +343 -0
  38. package/src/cloudformation/builders/messaging.ts +140 -0
  39. package/src/cloudformation/builders/monitoring.ts +300 -0
  40. package/src/cloudformation/builders/network.ts +264 -0
  41. package/src/cloudformation/builders/queue.ts +147 -0
  42. package/src/cloudformation/builders/security.ts +399 -0
  43. package/src/cloudformation/builders/storage.ts +285 -0
  44. package/src/cloudformation/index.ts +30 -0
  45. package/src/cloudformation/types.ts +173 -0
  46. package/src/compliance/aws-config.ts +543 -0
  47. package/src/compliance/cloudtrail.ts +376 -0
  48. package/src/compliance/compliance.test.ts +423 -0
  49. package/src/compliance/guardduty.ts +446 -0
  50. package/src/compliance/index.ts +66 -0
  51. package/src/compliance/security-hub.ts +456 -0
  52. package/src/containers/build-optimization.ts +416 -0
  53. package/src/containers/containers.test.ts +508 -0
  54. package/src/containers/image-scanning.ts +360 -0
  55. package/src/containers/index.ts +9 -0
  56. package/src/containers/registry.ts +293 -0
  57. package/src/containers/service-mesh.ts +520 -0
  58. package/src/database/database.test.ts +762 -0
  59. package/src/database/index.ts +9 -0
  60. package/src/database/migrations.ts +444 -0
  61. package/src/database/performance.ts +528 -0
  62. package/src/database/replicas.ts +534 -0
  63. package/src/database/users.ts +494 -0
  64. package/src/dependency-graph.ts +143 -0
  65. package/src/deployment/ab-testing.ts +582 -0
  66. package/src/deployment/blue-green.ts +452 -0
  67. package/src/deployment/canary.ts +500 -0
  68. package/src/deployment/deployment.test.ts +526 -0
  69. package/src/deployment/index.ts +61 -0
  70. package/src/deployment/progressive.ts +62 -0
  71. package/src/dns/dns.test.ts +641 -0
  72. package/src/dns/dnssec.ts +315 -0
  73. package/src/dns/index.ts +8 -0
  74. package/src/dns/resolver.ts +496 -0
  75. package/src/dns/routing.ts +593 -0
  76. package/src/email/advanced/analytics.ts +445 -0
  77. package/src/email/advanced/index.ts +11 -0
  78. package/src/email/advanced/rules.ts +465 -0
  79. package/src/email/advanced/scheduling.ts +352 -0
  80. package/src/email/advanced/search.ts +412 -0
  81. package/src/email/advanced/shared-mailboxes.ts +404 -0
  82. package/src/email/advanced/templates.ts +455 -0
  83. package/src/email/advanced/threading.ts +281 -0
  84. package/src/email/analytics.ts +467 -0
  85. package/src/email/bounce-handling.ts +425 -0
  86. package/src/email/email.test.ts +431 -0
  87. package/src/email/handlers/__tests__/inbound.test.ts +38 -0
  88. package/src/email/handlers/__tests__/outbound.test.ts +37 -0
  89. package/src/email/handlers/converter.ts +227 -0
  90. package/src/email/handlers/feedback.ts +228 -0
  91. package/src/email/handlers/inbound.ts +169 -0
  92. package/src/email/handlers/outbound.ts +178 -0
  93. package/src/email/index.ts +15 -0
  94. package/src/email/reputation.ts +303 -0
  95. package/src/email/templates.ts +352 -0
  96. package/src/errors/index.test.ts +434 -0
  97. package/src/errors/index.ts +416 -0
  98. package/src/health-checks/index.ts +40 -0
  99. package/src/index.ts +360 -0
  100. package/src/intrinsic-functions.ts +118 -0
  101. package/src/lambda/concurrency.ts +330 -0
  102. package/src/lambda/destinations.ts +345 -0
  103. package/src/lambda/dlq.ts +425 -0
  104. package/src/lambda/index.ts +11 -0
  105. package/src/lambda/lambda.test.ts +840 -0
  106. package/src/lambda/layers.ts +263 -0
  107. package/src/lambda/versions.ts +376 -0
  108. package/src/lambda/vpc.ts +399 -0
  109. package/src/local/config.ts +114 -0
  110. package/src/local/index.ts +6 -0
  111. package/src/local/mock-aws.ts +351 -0
  112. package/src/modules/ai.ts +340 -0
  113. package/src/modules/api.ts +478 -0
  114. package/src/modules/auth.ts +805 -0
  115. package/src/modules/cache.ts +417 -0
  116. package/src/modules/cdn.ts +1062 -0
  117. package/src/modules/communication.ts +1094 -0
  118. package/src/modules/compute.ts +3348 -0
  119. package/src/modules/database.ts +554 -0
  120. package/src/modules/deployment.ts +1079 -0
  121. package/src/modules/dns.ts +337 -0
  122. package/src/modules/email.ts +1538 -0
  123. package/src/modules/filesystem.ts +515 -0
  124. package/src/modules/index.ts +32 -0
  125. package/src/modules/messaging.ts +486 -0
  126. package/src/modules/monitoring.ts +2086 -0
  127. package/src/modules/network.ts +664 -0
  128. package/src/modules/parameter-store.ts +325 -0
  129. package/src/modules/permissions.ts +1081 -0
  130. package/src/modules/phone.ts +494 -0
  131. package/src/modules/queue.ts +1260 -0
  132. package/src/modules/redirects.ts +464 -0
  133. package/src/modules/registry.ts +699 -0
  134. package/src/modules/search.ts +401 -0
  135. package/src/modules/secrets.ts +416 -0
  136. package/src/modules/security.ts +731 -0
  137. package/src/modules/sms.ts +389 -0
  138. package/src/modules/storage.ts +1120 -0
  139. package/src/modules/workflow.ts +680 -0
  140. package/src/multi-account/config.ts +521 -0
  141. package/src/multi-account/index.ts +7 -0
  142. package/src/multi-account/manager.ts +427 -0
  143. package/src/multi-region/cross-region.ts +410 -0
  144. package/src/multi-region/index.ts +8 -0
  145. package/src/multi-region/manager.ts +483 -0
  146. package/src/multi-region/regions.ts +435 -0
  147. package/src/network-security/index.ts +48 -0
  148. package/src/observability/index.ts +9 -0
  149. package/src/observability/logs.ts +522 -0
  150. package/src/observability/metrics.ts +460 -0
  151. package/src/observability/observability.test.ts +782 -0
  152. package/src/observability/synthetics.ts +568 -0
  153. package/src/observability/xray.ts +358 -0
  154. package/src/phone/advanced/analytics.ts +349 -0
  155. package/src/phone/advanced/callbacks.ts +428 -0
  156. package/src/phone/advanced/index.ts +8 -0
  157. package/src/phone/advanced/ivr-builder.ts +504 -0
  158. package/src/phone/advanced/recording.ts +310 -0
  159. package/src/phone/handlers/__tests__/incoming-call.test.ts +40 -0
  160. package/src/phone/handlers/incoming-call.ts +117 -0
  161. package/src/phone/handlers/missed-call.ts +116 -0
  162. package/src/phone/handlers/voicemail.ts +179 -0
  163. package/src/phone/index.ts +9 -0
  164. package/src/presets/api-backend.ts +134 -0
  165. package/src/presets/data-pipeline.ts +204 -0
  166. package/src/presets/extend.test.ts +295 -0
  167. package/src/presets/extend.ts +297 -0
  168. package/src/presets/fullstack-app.ts +144 -0
  169. package/src/presets/index.ts +27 -0
  170. package/src/presets/jamstack.ts +135 -0
  171. package/src/presets/microservices.ts +167 -0
  172. package/src/presets/ml-api.ts +208 -0
  173. package/src/presets/nodejs-server.ts +104 -0
  174. package/src/presets/nodejs-serverless.ts +114 -0
  175. package/src/presets/realtime-app.ts +184 -0
  176. package/src/presets/static-site.ts +64 -0
  177. package/src/presets/traditional-web-app.ts +339 -0
  178. package/src/presets/wordpress.ts +138 -0
  179. package/src/preview/github.test.ts +249 -0
  180. package/src/preview/github.ts +297 -0
  181. package/src/preview/index.ts +37 -0
  182. package/src/preview/manager.test.ts +440 -0
  183. package/src/preview/manager.ts +326 -0
  184. package/src/preview/notifications.test.ts +582 -0
  185. package/src/preview/notifications.ts +341 -0
  186. package/src/queue/batch-processing.ts +402 -0
  187. package/src/queue/dlq-monitoring.ts +402 -0
  188. package/src/queue/fifo.ts +342 -0
  189. package/src/queue/index.ts +9 -0
  190. package/src/queue/management.ts +428 -0
  191. package/src/queue/queue.test.ts +429 -0
  192. package/src/resource-mgmt/index.ts +39 -0
  193. package/src/resource-naming.ts +62 -0
  194. package/src/s3/index.ts +523 -0
  195. package/src/schema/cloud-config.schema.json +554 -0
  196. package/src/schema/index.ts +68 -0
  197. package/src/security/certificate-manager.ts +492 -0
  198. package/src/security/index.ts +9 -0
  199. package/src/security/scanning.ts +545 -0
  200. package/src/security/secrets-manager.ts +476 -0
  201. package/src/security/secrets-rotation.ts +456 -0
  202. package/src/security/security.test.ts +738 -0
  203. package/src/sms/advanced/ab-testing.ts +389 -0
  204. package/src/sms/advanced/analytics.ts +336 -0
  205. package/src/sms/advanced/campaigns.ts +523 -0
  206. package/src/sms/advanced/chatbot.ts +224 -0
  207. package/src/sms/advanced/index.ts +10 -0
  208. package/src/sms/advanced/link-tracking.ts +248 -0
  209. package/src/sms/advanced/mms.ts +308 -0
  210. package/src/sms/handlers/__tests__/send.test.ts +40 -0
  211. package/src/sms/handlers/delivery-status.ts +133 -0
  212. package/src/sms/handlers/receive.ts +162 -0
  213. package/src/sms/handlers/send.ts +174 -0
  214. package/src/sms/index.ts +9 -0
  215. package/src/stack-diff.ts +389 -0
  216. package/src/static-site/index.ts +85 -0
  217. package/src/template-builder.ts +110 -0
  218. package/src/template-validator.ts +574 -0
  219. package/src/utils/cache.ts +291 -0
  220. package/src/utils/diff.ts +269 -0
  221. package/src/utils/hash.ts +227 -0
  222. package/src/utils/index.ts +8 -0
  223. package/src/utils/parallel.ts +294 -0
  224. package/src/validators/credentials.test.ts +274 -0
  225. package/src/validators/credentials.ts +233 -0
  226. package/src/validators/quotas.test.ts +434 -0
  227. package/src/validators/quotas.ts +217 -0
  228. package/test/ai.test.ts +327 -0
  229. package/test/api.test.ts +511 -0
  230. package/test/auth.test.ts +632 -0
  231. package/test/cache.test.ts +406 -0
  232. package/test/cdn.test.ts +247 -0
  233. package/test/compute.test.ts +861 -0
  234. package/test/database.test.ts +523 -0
  235. package/test/deployment.test.ts +499 -0
  236. package/test/dns.test.ts +270 -0
  237. package/test/email.test.ts +439 -0
  238. package/test/filesystem.test.ts +382 -0
  239. package/test/integration.test.ts +350 -0
  240. package/test/messaging.test.ts +514 -0
  241. package/test/monitoring.test.ts +634 -0
  242. package/test/network.test.ts +425 -0
  243. package/test/permissions.test.ts +488 -0
  244. package/test/queue.test.ts +484 -0
  245. package/test/registry.test.ts +306 -0
  246. package/test/security.test.ts +462 -0
  247. package/test/storage.test.ts +463 -0
  248. package/test/template-validator.test.ts +559 -0
  249. package/test/workflow.test.ts +592 -0
  250. package/tsconfig.json +16 -0
  251. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,515 @@
1
+ import type {
2
+ EC2SecurityGroup,
3
+ EFSAccessPoint,
4
+ EFSFileSystem,
5
+ EFSMountTarget,
6
+ } from '@stacksjs/ts-cloud-aws-types'
7
+ import type { EnvironmentType } from '@stacksjs/ts-cloud-types'
8
+ import { Fn } from '../intrinsic-functions'
9
+ import { generateLogicalId, generateResourceName } from '../resource-naming'
10
+
11
+ export interface FileSystemOptions {
12
+ slug: string
13
+ environment: EnvironmentType
14
+ encrypted?: boolean
15
+ kmsKeyId?: string
16
+ performanceMode?: 'generalPurpose' | 'maxIO'
17
+ throughputMode?: 'bursting' | 'provisioned' | 'elastic'
18
+ provisionedThroughput?: number
19
+ enableBackup?: boolean
20
+ }
21
+
22
+ export interface MountTargetOptions {
23
+ slug: string
24
+ environment: EnvironmentType
25
+ subnetId: string
26
+ securityGroups: string[]
27
+ ipAddress?: string
28
+ }
29
+
30
+ export interface AccessPointOptions {
31
+ slug: string
32
+ environment: EnvironmentType
33
+ path?: string
34
+ uid?: string
35
+ gid?: string
36
+ permissions?: string
37
+ }
38
+
39
+ export interface LifecyclePolicyOptions {
40
+ transitionToIA?: 7 | 14 | 30 | 60 | 90
41
+ transitionToPrimary?: boolean
42
+ }
43
+
44
+ /**
45
+ * FileSystem Module - EFS (Elastic File System)
46
+ * Provides clean API for creating and configuring shared file systems
47
+ */
48
+ export class FileSystem {
49
+ /**
50
+ * Create an EFS file system
51
+ */
52
+ static createFileSystem(options: FileSystemOptions): {
53
+ fileSystem: EFSFileSystem
54
+ logicalId: string
55
+ } {
56
+ const {
57
+ slug,
58
+ environment,
59
+ encrypted = true,
60
+ kmsKeyId,
61
+ performanceMode = 'generalPurpose',
62
+ throughputMode = 'bursting',
63
+ provisionedThroughput,
64
+ enableBackup = true,
65
+ } = options
66
+
67
+ const resourceName = generateResourceName({
68
+ slug,
69
+ environment,
70
+ resourceType: 'efs',
71
+ })
72
+
73
+ const logicalId = generateLogicalId(resourceName)
74
+
75
+ const fileSystem: EFSFileSystem = {
76
+ Type: 'AWS::EFS::FileSystem',
77
+ Properties: {
78
+ Encrypted: encrypted,
79
+ PerformanceMode: performanceMode,
80
+ ThroughputMode: throughputMode,
81
+ FileSystemTags: [
82
+ { Key: 'Name', Value: resourceName },
83
+ { Key: 'Environment', Value: environment },
84
+ ],
85
+ },
86
+ }
87
+
88
+ if (kmsKeyId) {
89
+ fileSystem.Properties!.KmsKeyId = kmsKeyId
90
+ }
91
+
92
+ if (throughputMode === 'provisioned' && provisionedThroughput) {
93
+ fileSystem.Properties!.ProvisionedThroughputInMibps = provisionedThroughput
94
+ }
95
+
96
+ if (enableBackup) {
97
+ fileSystem.Properties!.BackupPolicy = {
98
+ Status: 'ENABLED',
99
+ }
100
+ }
101
+
102
+ return { fileSystem, logicalId }
103
+ }
104
+
105
+ /**
106
+ * Create a mount target for multi-AZ access
107
+ */
108
+ static createMountTarget(
109
+ fileSystemLogicalId: string,
110
+ options: MountTargetOptions,
111
+ ): {
112
+ mountTarget: EFSMountTarget
113
+ logicalId: string
114
+ } {
115
+ const {
116
+ slug,
117
+ environment,
118
+ subnetId,
119
+ securityGroups,
120
+ ipAddress,
121
+ } = options
122
+
123
+ const resourceName = generateResourceName({
124
+ slug,
125
+ environment,
126
+ resourceType: 'efs-mt',
127
+ })
128
+
129
+ const logicalId = generateLogicalId(`${resourceName}-${subnetId}`)
130
+
131
+ const mountTarget: EFSMountTarget = {
132
+ Type: 'AWS::EFS::MountTarget',
133
+ Properties: {
134
+ FileSystemId: Fn.Ref(fileSystemLogicalId),
135
+ SubnetId: subnetId,
136
+ SecurityGroups: securityGroups,
137
+ },
138
+ }
139
+
140
+ if (ipAddress) {
141
+ mountTarget.Properties.IpAddress = ipAddress
142
+ }
143
+
144
+ return { mountTarget, logicalId }
145
+ }
146
+
147
+ /**
148
+ * Create an access point with POSIX permissions
149
+ */
150
+ static createAccessPoint(
151
+ fileSystemLogicalId: string,
152
+ options: AccessPointOptions,
153
+ ): {
154
+ accessPoint: EFSAccessPoint
155
+ logicalId: string
156
+ } {
157
+ const {
158
+ slug,
159
+ environment,
160
+ path = '/',
161
+ uid = '1000',
162
+ gid = '1000',
163
+ permissions = '755',
164
+ } = options
165
+
166
+ const resourceName = generateResourceName({
167
+ slug,
168
+ environment,
169
+ resourceType: 'efs-ap',
170
+ })
171
+
172
+ const logicalId = generateLogicalId(`${resourceName}-${path.replace(/\//g, '-')}`)
173
+
174
+ const accessPoint: EFSAccessPoint = {
175
+ Type: 'AWS::EFS::AccessPoint',
176
+ Properties: {
177
+ FileSystemId: Fn.Ref(fileSystemLogicalId),
178
+ PosixUser: {
179
+ Uid: uid,
180
+ Gid: gid,
181
+ },
182
+ RootDirectory: {
183
+ Path: path,
184
+ CreationInfo: {
185
+ OwnerUid: uid,
186
+ OwnerGid: gid,
187
+ Permissions: permissions,
188
+ },
189
+ },
190
+ AccessPointTags: [
191
+ { Key: 'Name', Value: `${resourceName}-${path}` },
192
+ { Key: 'Environment', Value: environment },
193
+ ],
194
+ },
195
+ }
196
+
197
+ return { accessPoint, logicalId }
198
+ }
199
+
200
+ /**
201
+ * Set lifecycle policy for cost optimization
202
+ */
203
+ static setLifecyclePolicy(
204
+ fileSystem: EFSFileSystem,
205
+ options: LifecyclePolicyOptions,
206
+ ): EFSFileSystem {
207
+ const { transitionToIA, transitionToPrimary = false } = options
208
+
209
+ if (!fileSystem.Properties) {
210
+ fileSystem.Properties = {}
211
+ }
212
+
213
+ fileSystem.Properties.LifecyclePolicies = []
214
+
215
+ if (transitionToIA) {
216
+ const days = `AFTER_${transitionToIA}_DAYS` as const
217
+ fileSystem.Properties.LifecyclePolicies.push({
218
+ TransitionToIA: days,
219
+ })
220
+ }
221
+
222
+ if (transitionToPrimary) {
223
+ fileSystem.Properties.LifecyclePolicies.push({
224
+ TransitionToPrimaryStorageClass: 'AFTER_1_ACCESS',
225
+ })
226
+ }
227
+
228
+ return fileSystem
229
+ }
230
+
231
+ /**
232
+ * Enable automatic backups
233
+ */
234
+ static enableBackup(fileSystem: EFSFileSystem): EFSFileSystem {
235
+ if (!fileSystem.Properties) {
236
+ fileSystem.Properties = {}
237
+ }
238
+
239
+ fileSystem.Properties.BackupPolicy = {
240
+ Status: 'ENABLED',
241
+ }
242
+
243
+ return fileSystem
244
+ }
245
+
246
+ /**
247
+ * Disable automatic backups
248
+ */
249
+ static disableBackup(fileSystem: EFSFileSystem): EFSFileSystem {
250
+ if (!fileSystem.Properties) {
251
+ fileSystem.Properties = {}
252
+ }
253
+
254
+ fileSystem.Properties.BackupPolicy = {
255
+ Status: 'DISABLED',
256
+ }
257
+
258
+ return fileSystem
259
+ }
260
+
261
+ /**
262
+ * Set provisioned throughput mode
263
+ */
264
+ static setProvisionedThroughput(
265
+ fileSystem: EFSFileSystem,
266
+ throughputInMibps: number,
267
+ ): EFSFileSystem {
268
+ if (!fileSystem.Properties) {
269
+ fileSystem.Properties = {}
270
+ }
271
+
272
+ fileSystem.Properties.ThroughputMode = 'provisioned'
273
+ fileSystem.Properties.ProvisionedThroughputInMibps = throughputInMibps
274
+
275
+ return fileSystem
276
+ }
277
+
278
+ /**
279
+ * Set elastic throughput mode (recommended for most workloads)
280
+ */
281
+ static setElasticThroughput(fileSystem: EFSFileSystem): EFSFileSystem {
282
+ if (!fileSystem.Properties) {
283
+ fileSystem.Properties = {}
284
+ }
285
+
286
+ fileSystem.Properties.ThroughputMode = 'elastic'
287
+
288
+ return fileSystem
289
+ }
290
+
291
+ /**
292
+ * Enable max I/O performance mode (for highly parallelized workloads)
293
+ */
294
+ static enableMaxIO(fileSystem: EFSFileSystem): EFSFileSystem {
295
+ if (!fileSystem.Properties) {
296
+ fileSystem.Properties = {}
297
+ }
298
+
299
+ fileSystem.Properties.PerformanceMode = 'maxIO'
300
+
301
+ return fileSystem
302
+ }
303
+
304
+ /**
305
+ * Create a security group for EFS mount targets
306
+ * Allows NFS traffic (port 2049) from specified sources
307
+ */
308
+ static createEfsSecurityGroup(options: {
309
+ slug: string
310
+ environment: EnvironmentType
311
+ vpcId: string
312
+ sourceSecurityGroupIds?: string[]
313
+ sourceCidrBlocks?: string[]
314
+ description?: string
315
+ }): {
316
+ securityGroup: EC2SecurityGroup
317
+ logicalId: string
318
+ } {
319
+ const {
320
+ slug,
321
+ environment,
322
+ vpcId,
323
+ sourceSecurityGroupIds = [],
324
+ sourceCidrBlocks = [],
325
+ description,
326
+ } = options
327
+
328
+ const resourceName = generateResourceName({
329
+ slug,
330
+ environment,
331
+ resourceType: 'efs-sg',
332
+ })
333
+
334
+ const logicalId = generateLogicalId(resourceName)
335
+
336
+ // Build ingress rules
337
+ const ingressRules: any[] = []
338
+
339
+ // Add rules for source security groups
340
+ for (const sgId of sourceSecurityGroupIds) {
341
+ ingressRules.push({
342
+ IpProtocol: 'tcp',
343
+ FromPort: 2049,
344
+ ToPort: 2049,
345
+ SourceSecurityGroupId: sgId,
346
+ Description: 'NFS from security group',
347
+ })
348
+ }
349
+
350
+ // Add rules for source CIDR blocks
351
+ for (const cidr of sourceCidrBlocks) {
352
+ ingressRules.push({
353
+ IpProtocol: 'tcp',
354
+ FromPort: 2049,
355
+ ToPort: 2049,
356
+ CidrIp: cidr,
357
+ Description: 'NFS from CIDR block',
358
+ })
359
+ }
360
+
361
+ const securityGroup: EC2SecurityGroup = {
362
+ Type: 'AWS::EC2::SecurityGroup',
363
+ Properties: {
364
+ GroupName: resourceName,
365
+ GroupDescription: description || `Security group for EFS mount targets - ${slug} ${environment}`,
366
+ VpcId: vpcId,
367
+ SecurityGroupIngress: ingressRules,
368
+ Tags: [
369
+ { Key: 'Name', Value: resourceName },
370
+ { Key: 'Environment', Value: environment },
371
+ ],
372
+ },
373
+ }
374
+
375
+ return { securityGroup, logicalId }
376
+ }
377
+
378
+ /**
379
+ * Create mount targets across multiple subnets (multi-AZ)
380
+ * Returns all mount targets and their logical IDs
381
+ */
382
+ static createMultiAzMountTargets(
383
+ fileSystemLogicalId: string,
384
+ options: {
385
+ slug: string
386
+ environment: EnvironmentType
387
+ subnetIds: string[]
388
+ securityGroupId: string
389
+ },
390
+ ): {
391
+ mountTargets: EFSMountTarget[]
392
+ logicalIds: string[]
393
+ } {
394
+ const { slug, environment, subnetIds, securityGroupId } = options
395
+
396
+ const mountTargets: EFSMountTarget[] = []
397
+ const logicalIds: string[] = []
398
+
399
+ for (let i = 0; i < subnetIds.length; i++) {
400
+ const subnetId = subnetIds[i]
401
+ const resourceName = generateResourceName({
402
+ slug,
403
+ environment,
404
+ resourceType: 'efs-mt',
405
+ })
406
+
407
+ const logicalId = generateLogicalId(`${resourceName}-az${i + 1}`)
408
+
409
+ const mountTarget: EFSMountTarget = {
410
+ Type: 'AWS::EFS::MountTarget',
411
+ Properties: {
412
+ FileSystemId: Fn.Ref(fileSystemLogicalId),
413
+ SubnetId: subnetId,
414
+ SecurityGroups: [securityGroupId],
415
+ },
416
+ }
417
+
418
+ mountTargets.push(mountTarget)
419
+ logicalIds.push(logicalId)
420
+ }
421
+
422
+ return { mountTargets, logicalIds }
423
+ }
424
+
425
+ /**
426
+ * Create a complete EFS setup with security group and mount targets
427
+ */
428
+ static createCompleteFileSystem(options: {
429
+ slug: string
430
+ environment: EnvironmentType
431
+ vpcId: string
432
+ subnetIds: string[]
433
+ sourceSecurityGroupIds?: string[]
434
+ encrypted?: boolean
435
+ performanceMode?: 'generalPurpose' | 'maxIO'
436
+ throughputMode?: 'bursting' | 'provisioned' | 'elastic'
437
+ enableBackup?: boolean
438
+ transitionToIA?: 7 | 14 | 30 | 60 | 90
439
+ }): {
440
+ resources: Record<string, any>
441
+ outputs: {
442
+ fileSystemId: string
443
+ securityGroupId: string
444
+ mountTargetIds: string[]
445
+ }
446
+ } {
447
+ const {
448
+ slug,
449
+ environment,
450
+ vpcId,
451
+ subnetIds,
452
+ sourceSecurityGroupIds = [],
453
+ encrypted = true,
454
+ performanceMode = 'generalPurpose',
455
+ throughputMode = 'elastic',
456
+ enableBackup = true,
457
+ transitionToIA,
458
+ } = options
459
+
460
+ const resources: Record<string, any> = {}
461
+
462
+ // Create file system
463
+ const { fileSystem, logicalId: fsLogicalId } = FileSystem.createFileSystem({
464
+ slug,
465
+ environment,
466
+ encrypted,
467
+ performanceMode,
468
+ throughputMode,
469
+ enableBackup,
470
+ })
471
+
472
+ // Add lifecycle policy if specified
473
+ if (transitionToIA) {
474
+ FileSystem.setLifecyclePolicy(fileSystem, {
475
+ transitionToIA,
476
+ transitionToPrimary: true,
477
+ })
478
+ }
479
+
480
+ resources[fsLogicalId] = fileSystem
481
+
482
+ // Create security group
483
+ const { securityGroup, logicalId: sgLogicalId } = FileSystem.createEfsSecurityGroup({
484
+ slug,
485
+ environment,
486
+ vpcId,
487
+ sourceSecurityGroupIds,
488
+ })
489
+ resources[sgLogicalId] = securityGroup
490
+
491
+ // Create mount targets
492
+ const { mountTargets, logicalIds: mtLogicalIds } = FileSystem.createMultiAzMountTargets(
493
+ fsLogicalId,
494
+ {
495
+ slug,
496
+ environment,
497
+ subnetIds,
498
+ securityGroupId: Fn.Ref(sgLogicalId) as any,
499
+ },
500
+ )
501
+
502
+ for (let i = 0; i < mountTargets.length; i++) {
503
+ resources[mtLogicalIds[i]] = mountTargets[i]
504
+ }
505
+
506
+ return {
507
+ resources,
508
+ outputs: {
509
+ fileSystemId: fsLogicalId,
510
+ securityGroupId: sgLogicalId,
511
+ mountTargetIds: mtLogicalIds,
512
+ },
513
+ }
514
+ }
515
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * ts-cloud Resource Modules
3
+ * Clean API abstractions for AWS CloudFormation resources
4
+ */
5
+
6
+ export * from './storage'
7
+ export * from './registry'
8
+ export * from './cdn'
9
+ export * from './dns'
10
+ export * from './security'
11
+ export * from './compute'
12
+ export * from './network'
13
+ export * from './filesystem'
14
+ export * from './email'
15
+ export * from './phone'
16
+ export * from './queue'
17
+ export * from './sms'
18
+ export * from './ai'
19
+ export * from './database'
20
+ export * from './cache'
21
+ export * from './permissions'
22
+ export * from './api'
23
+ export * from './messaging'
24
+ export * from './workflow'
25
+ export * from './monitoring'
26
+ export * from './auth'
27
+ export * from './deployment'
28
+ export * from './secrets'
29
+ export * from './parameter-store'
30
+ export * from './search'
31
+ export * from './redirects'
32
+ export * from './communication'