@maestro-js/aws-cdk-recipes 1.0.0-alpha.0

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.
@@ -0,0 +1,2284 @@
1
+ import * as aws_cdk_lib_aws_s3 from 'aws-cdk-lib/aws-s3';
2
+ import { Construct } from 'constructs';
3
+ import * as logs from 'aws-cdk-lib/aws-logs';
4
+ import * as aws_cdk_lib_aws_ec2 from 'aws-cdk-lib/aws-ec2';
5
+ import * as aws_cdk_lib_aws_ecs from 'aws-cdk-lib/aws-ecs';
6
+ import * as aws_cdk_lib_aws_cloudfront from 'aws-cdk-lib/aws-cloudfront';
7
+ import * as aws_cdk_lib from 'aws-cdk-lib';
8
+ import { Duration, Size } from 'aws-cdk-lib';
9
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
10
+ import * as lambdaNode from 'aws-cdk-lib/aws-lambda-nodejs';
11
+ import * as aws_cdk_lib_aws_ecr_assets from 'aws-cdk-lib/aws-ecr-assets';
12
+ import * as aws_cdk_lib_aws_elasticloadbalancingv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
13
+ import * as aws_cdk_lib_aws_iam from 'aws-cdk-lib/aws-iam';
14
+ import * as aws_cdk_lib_aws_rds from 'aws-cdk-lib/aws-rds';
15
+ import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager';
16
+ import * as aws_cdk_lib_aws_elasticache from 'aws-cdk-lib/aws-elasticache';
17
+ import * as aws_cdk_lib_aws_ses from 'aws-cdk-lib/aws-ses';
18
+ import * as route53 from 'aws-cdk-lib/aws-route53';
19
+ import * as aws_cdk_lib_aws_sns from 'aws-cdk-lib/aws-sns';
20
+ import * as aws_cdk_lib_aws_sns_subscriptions from 'aws-cdk-lib/aws-sns-subscriptions';
21
+ import * as aws_cdk_lib_aws_sqs from 'aws-cdk-lib/aws-sqs';
22
+ import * as aws_cdk_lib_aws_events_targets from 'aws-cdk-lib/aws-events-targets';
23
+ import * as aws_cdk_lib_aws_events from 'aws-cdk-lib/aws-events';
24
+
25
+ /**
26
+ * An S3 bucket with HTTPS enforcement, configurable CORS, lifecycle rules, and custom bucket policies.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * const uploads = new Bucket(this, 'Uploads', {
31
+ * versioning: true,
32
+ * lifecycle: [{ prefix: 'tmp/', expiresIn: '7 days' }]
33
+ * })
34
+ * ```
35
+ */
36
+ declare class Bucket extends Construct {
37
+ readonly bucket: aws_cdk_lib_aws_s3.Bucket;
38
+ constructor(scope: Construct, id: string, props?: Bucket.Props);
39
+ }
40
+ /**
41
+ * Configuration types for {@link Bucket}.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * const props: Bucket.Props = {
46
+ * access: 'public',
47
+ * cors: { allowOrigins: ['https://example.com'], allowMethods: ['GET'] }
48
+ * }
49
+ * ```
50
+ */
51
+ declare namespace Bucket {
52
+ type CorsMethod = 'GET' | 'PUT' | 'POST' | 'DELETE' | 'HEAD';
53
+ /** Configure the CORS settings for the bucket. */
54
+ interface Cors {
55
+ /** The HTTP headers that browsers can send in requests to the bucket. */
56
+ allowHeaders?: string[];
57
+ /** The HTTP methods that browsers can use when making requests to the bucket. @default `['GET']` */
58
+ allowMethods?: CorsMethod[];
59
+ /** The origins that are allowed to make requests to the bucket. @default `['*']` */
60
+ allowOrigins?: string[];
61
+ /** The HTTP headers in the response that browsers can access. */
62
+ exposeHeaders?: string[];
63
+ /** How long (in seconds) browsers can cache the preflight response. */
64
+ maxAge?: number;
65
+ }
66
+ /** A rule that defines when objects in the bucket expire. */
67
+ interface LifecycleRule {
68
+ /** A unique identifier for the rule. */
69
+ id?: string;
70
+ /** Limit the rule to objects with this key prefix. */
71
+ prefix?: string;
72
+ /** Whether the rule is active. @default `true` */
73
+ enabled?: boolean;
74
+ /**
75
+ * Expire objects after a duration relative to their creation date.
76
+ * @example '30 days'
77
+ */
78
+ expiresIn?: `${number} day` | `${number} days`;
79
+ /** Expire objects on a specific date (ISO 8601). */
80
+ expiresAt?: string;
81
+ }
82
+ /**
83
+ * An IAM policy condition.
84
+ * @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html
85
+ */
86
+ interface Condition {
87
+ /** The condition operator (e.g. `StringEquals`, `ArnLike`, `Bool`). */
88
+ test: string;
89
+ /** The condition key to evaluate (e.g. `aws:SecureTransport`). */
90
+ variable: string;
91
+ /** The values to compare against. */
92
+ values: string[];
93
+ }
94
+ /** An IAM principal that a policy statement applies to. */
95
+ interface Principal {
96
+ /** The type of principal. */
97
+ type: 'aws' | 'service' | 'federated' | 'canonical';
98
+ /** ARNs or identifiers for the principals. */
99
+ identifiers: string[];
100
+ }
101
+ /** A bucket policy statement that grants or denies access. */
102
+ interface PolicyStatement {
103
+ /** The S3 actions this statement applies to (e.g. `s3:GetObject`). */
104
+ actions: string[];
105
+ /** The principals this statement applies to. Use `'*'` for any principal. */
106
+ principals: '*' | Principal[];
107
+ /** Whether to allow or deny the actions. @default `'allow'` */
108
+ effect?: 'allow' | 'deny';
109
+ /** Limit the statement to specific object key paths. Defaults to the entire bucket. */
110
+ paths?: string[];
111
+ /** Additional conditions that must be met for the statement to apply. */
112
+ conditions?: Condition[];
113
+ }
114
+ interface Props {
115
+ /**
116
+ * Enable public read access for all files in the bucket.
117
+ *
118
+ * When set to `'public'`, a bucket policy is added that allows anyone to read objects.
119
+ * Public ACLs are blocked — access is granted only through bucket policy.
120
+ * @default `'private'`
121
+ */
122
+ access?: 'public' | 'private';
123
+ /**
124
+ * The CORS configuration for the bucket. Set to `false` to disable CORS entirely.
125
+ *
126
+ * By default, the bucket is configured to allow all headers, methods, and origins.
127
+ */
128
+ cors?: Cors | false;
129
+ /**
130
+ * Enable versioning for the bucket. When enabled, S3 stores multiple versions of each
131
+ * object, protecting against accidental deletion or overwriting.
132
+ * @default `false`
133
+ */
134
+ versioning?: boolean;
135
+ /**
136
+ * Enforce HTTPS for all requests to the bucket. Adds a deny policy for any request
137
+ * made over plain HTTP.
138
+ * @default `true`
139
+ */
140
+ enforceHttps?: boolean;
141
+ /** Rules that define when objects in the bucket expire. */
142
+ lifecycle?: LifecycleRule[];
143
+ /** Additional bucket policy statements. */
144
+ policy?: PolicyStatement[];
145
+ /**
146
+ * Transform the underlying CDK resource props. Use this to customize settings
147
+ * not directly exposed by this construct.
148
+ */
149
+ transform?: {
150
+ bucket?: (props: aws_cdk_lib_aws_s3.BucketProps) => aws_cdk_lib_aws_s3.BucketProps;
151
+ };
152
+ }
153
+ }
154
+
155
+ /**
156
+ * A multi-AZ VPC with public and private subnets, configurable NAT strategy, optional WireGuard VPN,
157
+ * and VPC Flow Logs.
158
+ *
159
+ * @example
160
+ * ```ts
161
+ * const network = new Vpc(this, 'Network', {
162
+ * natGateways: 'single',
163
+ * wireguard: true
164
+ * })
165
+ * ```
166
+ */
167
+ declare class Vpc extends Construct {
168
+ readonly vpc: aws_cdk_lib_aws_ec2.Vpc;
169
+ readonly publicSubnets: aws_cdk_lib_aws_ec2.ISubnet[];
170
+ readonly privateSubnets: aws_cdk_lib_aws_ec2.ISubnet[];
171
+ readonly securityGroup: aws_cdk_lib_aws_ec2.SecurityGroup;
172
+ readonly wireguard?: aws_cdk_lib_aws_ec2.Instance;
173
+ readonly wireguardPublicKeyParam?: string;
174
+ constructor(scope: Construct, id: string, props?: Vpc.Props);
175
+ }
176
+ /**
177
+ * Configuration types for {@link Vpc}.
178
+ *
179
+ * @example
180
+ * ```ts
181
+ * const props: Vpc.Props = {
182
+ * natGateways: 'ec2',
183
+ * maxAzs: 2,
184
+ * wireguard: true
185
+ * }
186
+ * ```
187
+ */
188
+ declare namespace Vpc {
189
+ interface Props {
190
+ /**
191
+ * The CIDR block for the VPC.
192
+ *
193
+ * @default `"10.0.0.0/16"`
194
+ */
195
+ cidr?: string;
196
+ /**
197
+ * The number of availability zones to use.
198
+ *
199
+ * Services like RDS and Fargate require at least 2 AZs.
200
+ *
201
+ * @default `2`
202
+ */
203
+ maxAzs?: number;
204
+ /**
205
+ * How to provide NAT (outbound internet) for private subnets.
206
+ *
207
+ * - `"none"` — No NAT. Private subnets are fully isolated with no outbound internet access.
208
+ * - `"single"` — A single managed NAT Gateway shared across all AZs. ~$33/month.
209
+ * - `"onePerAz"` — One managed NAT Gateway per AZ for higher availability. ~$33/month per AZ.
210
+ * - `"ec2"` — A single `t4g.nano` EC2 instance running the fck-nat AMI. ~$3/month.
211
+ *
212
+ * @default `"single"`
213
+ */
214
+ natGateways?: 'none' | 'single' | 'onePerAz' | 'ec2';
215
+ /**
216
+ * Custom subnet configuration for the VPC. Overrides the default public + private subnet layout.
217
+ *
218
+ * @default A public subnet (`/24`) and a private subnet (`/24`) in each AZ.
219
+ */
220
+ subnetConfiguration?: aws_cdk_lib_aws_ec2.SubnetConfiguration[];
221
+ /**
222
+ * Enable a WireGuard VPN server in a public subnet.
223
+ *
224
+ * When enabled, a `t4g.nano` EC2 instance running WireGuard is launched with an Elastic IP.
225
+ * Server keys and peer config are persisted in SSM Parameter Store so they survive instance
226
+ * replacement. ~$3/month.
227
+ *
228
+ * @default `false`
229
+ */
230
+ wireguard?: boolean;
231
+ /**
232
+ * Enable VPC Flow Logs to CloudWatch.
233
+ *
234
+ * Pass `true` for defaults or an object to customize retention.
235
+ *
236
+ * @default `false`
237
+ * @example
238
+ * ```ts
239
+ * { retention: RetentionDays.ONE_WEEK }
240
+ * ```
241
+ */
242
+ flowLogs?: boolean | {
243
+ retention?: logs.RetentionDays;
244
+ };
245
+ }
246
+ }
247
+
248
+ /**
249
+ * An ECS cluster inside a VPC with optional Fargate capacity providers for Spot pricing.
250
+ *
251
+ * @example
252
+ * ```ts
253
+ * const cluster = new Cluster(this, 'Cluster', {
254
+ * vpc: network.vpc,
255
+ * enableFargateCapacityProviders: true
256
+ * })
257
+ * ```
258
+ */
259
+ declare class Cluster extends Construct {
260
+ readonly cluster: aws_cdk_lib_aws_ecs.Cluster;
261
+ constructor(scope: Construct, id: string, props: Cluster.Props);
262
+ }
263
+ /**
264
+ * Configuration types for {@link Cluster}.
265
+ *
266
+ * @example
267
+ * ```ts
268
+ * const props: Cluster.Props = {
269
+ * vpc: network.vpc,
270
+ * enableFargateCapacityProviders: true
271
+ * }
272
+ * ```
273
+ */
274
+ declare namespace Cluster {
275
+ interface Props {
276
+ /** The VPC to place the ECS cluster in. */
277
+ vpc: aws_cdk_lib_aws_ec2.IVpc;
278
+ /**
279
+ * Enable Fargate capacity providers (`FARGATE` and `FARGATE_SPOT`) on the cluster.
280
+ *
281
+ * When enabled, services can use Fargate Spot for non-critical workloads at up to 70% discount.
282
+ *
283
+ * @default `false`
284
+ */
285
+ enableFargateCapacityProviders?: boolean;
286
+ /**
287
+ * Transform the underlying CDK resource props. Use this to customize settings
288
+ * not directly exposed by this construct.
289
+ */
290
+ transform?: {
291
+ cluster?: (props: aws_cdk_lib_aws_ecs.ClusterProps) => aws_cdk_lib_aws_ecs.ClusterProps;
292
+ };
293
+ }
294
+ }
295
+
296
+ interface AssetBehavior {
297
+ pathPattern: string;
298
+ cachePolicy?: 'CACHING_OPTIMIZED' | 'CACHING_DISABLED' | aws_cdk_lib_aws_cloudfront.ICachePolicy;
299
+ }
300
+ interface FileOption {
301
+ files: string | string[];
302
+ ignore?: string | string[];
303
+ cacheControl?: string;
304
+ contentType?: string;
305
+ }
306
+ interface DomainProps {
307
+ name: string;
308
+ aliases?: string[];
309
+ certificateArn: string;
310
+ }
311
+ type InvalidationProps = false | {
312
+ paths?: string[] | 'all';
313
+ wait?: boolean;
314
+ };
315
+
316
+ type LogRetention = '1 day' | '3 days' | '5 days' | '1 week' | '2 weeks' | '1 month' | '3 months' | '6 months' | '1 year' | '2 years' | 'forever';
317
+
318
+ /**
319
+ * A static site (SPA or static HTML) deployed to S3 with a CloudFront distribution,
320
+ * custom domain, and configurable cache control.
321
+ *
322
+ * @example
323
+ * ```ts
324
+ * new StaticSite(this, 'Website', {
325
+ * path: 'dist',
326
+ * domain: {
327
+ * name: 'example.com',
328
+ * aliases: ['www.example.com'],
329
+ * certificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/abc-123'
330
+ * }
331
+ * })
332
+ * ```
333
+ */
334
+ declare class StaticSite extends Construct {
335
+ readonly bucket: aws_cdk_lib_aws_s3.Bucket;
336
+ readonly distribution: aws_cdk_lib_aws_cloudfront.Distribution;
337
+ constructor(scope: Construct, id: string, props: StaticSite.Props);
338
+ }
339
+ /**
340
+ * Configuration types for {@link StaticSite}.
341
+ *
342
+ * @example
343
+ * ```ts
344
+ * const props: StaticSite.Props = {
345
+ * path: 'dist',
346
+ * domain: { name: 'example.com', certificateArn: '...' }
347
+ * }
348
+ * ```
349
+ */
350
+ declare namespace StaticSite {
351
+ interface Props {
352
+ /**
353
+ * Path to the directory where the built static site assets are located.
354
+ *
355
+ * @example
356
+ * ```ts
357
+ * path: 'dist'
358
+ * ```
359
+ */
360
+ path: string;
361
+ /**
362
+ * The name of the index page served at the root of the site. This is a path relative
363
+ * to the root of the site.
364
+ *
365
+ * @default `'index.html'`
366
+ */
367
+ indexPage?: string;
368
+ /**
369
+ * The page to display on a 403 or 404 error. This is useful for single-page apps
370
+ * that handle routing client-side.
371
+ *
372
+ * @default The value of `indexPage`.
373
+ */
374
+ errorPage?: string;
375
+ /**
376
+ * Set a custom domain for the site. Requires an ACM certificate in `us-east-1`.
377
+ *
378
+ * @example
379
+ * ```ts
380
+ * domain: {
381
+ * name: 'example.com',
382
+ * aliases: ['www.example.com'],
383
+ * certificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/abc-123'
384
+ * }
385
+ * ```
386
+ */
387
+ domain?: DomainProps;
388
+ /**
389
+ * Configure how the static site's assets are uploaded to S3.
390
+ */
391
+ assets?: {
392
+ /**
393
+ * Specify the `Cache-Control` and `Content-Type` headers for specific files using
394
+ * glob patterns. Later entries override earlier ones for the same file.
395
+ *
396
+ * By default, all files are cached immutably for one year and HTML files are not cached.
397
+ *
398
+ * @example
399
+ * ```ts
400
+ * fileOptions: [
401
+ * { files: '**', cacheControl: 'max-age=31536000,public,immutable' },
402
+ * { files: '**\/*.html', cacheControl: 'max-age=0,no-cache,no-store,must-revalidate' }
403
+ * ]
404
+ * ```
405
+ */
406
+ fileOptions?: FileOption[];
407
+ };
408
+ /**
409
+ * Configure CloudFront Functions to customize HTTP request and response behavior at edge
410
+ * locations. These are lightweight CloudFront Functions (not Lambda\@Edge) that run on
411
+ * every request.
412
+ *
413
+ * @example
414
+ * ```ts
415
+ * edge: {
416
+ * viewerRequest: new cloudfront.Function(this, 'RewriteFunction', {
417
+ * code: cloudfront.FunctionCode.fromInline('function handler(event) { return event.request; }')
418
+ * })
419
+ * }
420
+ * ```
421
+ */
422
+ edge?: {
423
+ /**
424
+ * A CloudFront function to run on every incoming viewer request before it reaches
425
+ * the origin. Use this to rewrite URLs, add headers, or implement authentication.
426
+ */
427
+ viewerRequest?: aws_cdk_lib_aws_cloudfront.IFunction;
428
+ /**
429
+ * A CloudFront function to run on every outgoing viewer response before it reaches
430
+ * the client. Use this to add security headers or modify response metadata.
431
+ */
432
+ viewerResponse?: aws_cdk_lib_aws_cloudfront.IFunction;
433
+ };
434
+ /**
435
+ * Configure how CloudFront cache invalidations are handled after deployment.
436
+ * Set to `false` to disable invalidation entirely. Pass an object to configure
437
+ * which paths to invalidate and whether to wait for completion.
438
+ *
439
+ * @default Invalidates all paths (`'/*'`) and waits for completion.
440
+ *
441
+ * @example
442
+ * Invalidate only specific paths:
443
+ * ```ts
444
+ * invalidation: {
445
+ * paths: ['/index.html', '/assets/*'],
446
+ * wait: true
447
+ * }
448
+ * ```
449
+ *
450
+ * @example
451
+ * Disable invalidation:
452
+ * ```ts
453
+ * invalidation: false
454
+ * ```
455
+ */
456
+ invalidation?: InvalidationProps;
457
+ /**
458
+ * Transform the underlying CDK resource props before they are created. Use this
459
+ * to customize any setting not directly exposed by this construct.
460
+ *
461
+ * @example
462
+ * ```ts
463
+ * transform: {
464
+ * bucket: (props) => ({
465
+ * ...props,
466
+ * removalPolicy: RemovalPolicy.DESTROY
467
+ * })
468
+ * }
469
+ * ```
470
+ */
471
+ transform?: {
472
+ /** Transform the S3 bucket props before the bucket is created. */
473
+ bucket?: (props: aws_cdk_lib_aws_s3.BucketProps) => aws_cdk_lib_aws_s3.BucketProps;
474
+ /** Transform the CloudFront distribution props before the distribution is created. */
475
+ distribution?: (props: aws_cdk_lib_aws_cloudfront.DistributionProps) => aws_cdk_lib_aws_cloudfront.DistributionProps;
476
+ };
477
+ }
478
+ }
479
+
480
+ /**
481
+ * A Lambda function with esbuild bundling, VPC placement, function URLs, streaming responses,
482
+ * concurrency controls, and IAM permissions.
483
+ *
484
+ * @example
485
+ * ```ts
486
+ * const api = new LambdaFunction(this, 'Api', {
487
+ * handler: 'src/api.handler',
488
+ * memory: 512,
489
+ * timeout: Duration.seconds(10),
490
+ * url: true
491
+ * })
492
+ * ```
493
+ */
494
+ declare class LambdaFunction extends Construct {
495
+ readonly function: lambda.Function;
496
+ readonly logGroup: logs.LogGroup;
497
+ readonly url?: lambda.FunctionUrl;
498
+ readonly version?: lambda.Version;
499
+ readonly alias?: lambda.Alias;
500
+ constructor(scope: Construct, id: string, props: LambdaFunction.Props);
501
+ }
502
+ /**
503
+ * Configuration types for {@link LambdaFunction}.
504
+ *
505
+ * @example
506
+ * ```ts
507
+ * const props: LambdaFunction.Props = {
508
+ * handler: 'src/api.handler',
509
+ * memory: 1024,
510
+ * environment: { DATABASE_URL: 'mysql://...' },
511
+ * url: true
512
+ * }
513
+ * ```
514
+ */
515
+ declare namespace LambdaFunction {
516
+ type EsbuildLoader = 'js' | 'jsx' | 'ts' | 'tsx' | 'css' | 'json' | 'text' | 'base64' | 'file' | 'dataurl' | 'binary' | 'copy' | 'default' | 'local-css' | 'global-css' | 'empty';
517
+ interface Props {
518
+ /**
519
+ * Path to the handler function. When bundling is used (no `code` or `bundle`), this follows
520
+ * SST-style notation: `path/to/file.exportName`.
521
+ *
522
+ * When using pre-built code, this is the standard Lambda handler string (e.g. `index.handler`).
523
+ * @example 'src/api.handler'
524
+ */
525
+ handler: string;
526
+ /**
527
+ * A pre-built Lambda `Code` asset. Use this when you've already compiled and packaged your
528
+ * function code. Mutually exclusive with `bundle`.
529
+ *
530
+ * Omit both `code` and `bundle` to use esbuild bundling.
531
+ */
532
+ code?: lambda.Code;
533
+ /**
534
+ * Path to a pre-built directory to deploy as-is. The directory is packaged using
535
+ * `Code.fromAsset`. Mutually exclusive with `code`.
536
+ *
537
+ * Omit both `code` and `bundle` to use esbuild bundling.
538
+ */
539
+ bundle?: string;
540
+ /**
541
+ * The Lambda runtime to use.
542
+ * @default `NODEJS_22_X`
543
+ */
544
+ runtime?: lambda.Runtime;
545
+ /**
546
+ * The CPU architecture for the function.
547
+ * @default `ARM_64`
548
+ */
549
+ architecture?: lambda.Architecture;
550
+ /**
551
+ * The amount of memory available to the function at runtime, in MB.
552
+ * @default `1024`
553
+ */
554
+ memory?: number;
555
+ /**
556
+ * The maximum time the function can run before being terminated.
557
+ * @default `Duration.seconds(20)`
558
+ */
559
+ timeout?: Duration;
560
+ /** The size of the `/tmp` directory available to the function. */
561
+ storage?: Size;
562
+ /** A human-readable description of the function. */
563
+ description?: string;
564
+ /** Lambda layers to attach to the function. */
565
+ layers?: lambda.ILayerVersion[];
566
+ /** Key-value pairs that are set as environment variables in the function. */
567
+ environment?: Record<string, string>;
568
+ /**
569
+ * IAM permission statements to attach to the function's execution role.
570
+ * @example
571
+ * ```ts
572
+ * permissions: [{ actions: ['s3:GetObject'], resources: ['arn:aws:s3:::my-bucket/*'] }]
573
+ * ```
574
+ */
575
+ permissions?: Array<{
576
+ actions: string[];
577
+ resources: string[];
578
+ }>;
579
+ /** ARNs of IAM managed policies to attach to the function's execution role. */
580
+ policies?: string[];
581
+ /**
582
+ * Place the function inside a VPC. Pass a VPC directly to use default subnet/security group
583
+ * selection, or pass an object for full control over subnets and security groups.
584
+ */
585
+ vpc?: aws_cdk_lib_aws_ec2.IVpc | {
586
+ vpc: aws_cdk_lib_aws_ec2.IVpc;
587
+ subnets?: aws_cdk_lib_aws_ec2.SubnetSelection;
588
+ securityGroups?: aws_cdk_lib_aws_ec2.ISecurityGroup[];
589
+ };
590
+ /**
591
+ * Configure the concurrency settings for the function.
592
+ *
593
+ * `reserved` sets the maximum number of concurrent executions.
594
+ * `provisioned` keeps a specified number of instances warm to avoid cold starts.
595
+ */
596
+ concurrency?: {
597
+ /** The maximum number of concurrent executions reserved for this function. */
598
+ reserved?: number;
599
+ /** The number of pre-initialized execution environments. Creates a version and alias. */
600
+ provisioned?: number;
601
+ };
602
+ /**
603
+ * The number of retry attempts for asynchronous invocations (0–2).
604
+ * @default Uses the Lambda service default (2).
605
+ */
606
+ retries?: number;
607
+ /**
608
+ * Enable response streaming for the function. Requires `url` to be enabled.
609
+ * @default `false`
610
+ */
611
+ streaming?: boolean;
612
+ /**
613
+ * Publish a new version on each deployment. Automatically enabled when
614
+ * `concurrency.provisioned` is set.
615
+ * @default `false`
616
+ */
617
+ versioning?: boolean;
618
+ /**
619
+ * Create a function URL for direct HTTP(S) invocation. Set to `true` for public access
620
+ * with no auth, or pass an object to configure authorization and CORS.
621
+ * @default No function URL is created.
622
+ */
623
+ url?: boolean | {
624
+ /** The authorization type for the function URL. @default `'none'` */
625
+ authorization?: 'none' | 'iam';
626
+ /** CORS configuration. Set to `true` to allow all origins and methods. */
627
+ cors?: lambda.FunctionUrlCorsOptions | true;
628
+ };
629
+ /** Configure CloudWatch logging for the function. */
630
+ logging?: {
631
+ /**
632
+ * How long to retain log events.
633
+ * @default `'1 month'`
634
+ */
635
+ retention?: LogRetention;
636
+ /**
637
+ * The log format for the function.
638
+ * @default `'text'`
639
+ */
640
+ format?: 'text' | 'json';
641
+ };
642
+ /** Key-value pairs to tag the function and its resources. */
643
+ tags?: Record<string, string>;
644
+ /** Configure esbuild bundling options. Only applies when using bundling mode (no `code` or `bundle`). */
645
+ nodejs?: {
646
+ /** Minify the bundled output. @default `true` */
647
+ minify?: boolean;
648
+ /** Generate source maps. @default `false` */
649
+ sourceMap?: boolean;
650
+ /** The output format for the bundle. @default `ESM` */
651
+ format?: lambdaNode.OutputFormat;
652
+ /** A string to prepend to the bundled output. Defaults to ESM compatibility shims when format is ESM. */
653
+ banner?: string;
654
+ /** NPM packages to install (not bundle) into `node_modules` in the output. */
655
+ install?: string[];
656
+ /**
657
+ * NPM packages to exclude from the bundle (mark as external).
658
+ * @default `['@aws-sdk/*']`
659
+ */
660
+ exclude?: string[];
661
+ /** Custom esbuild loaders keyed by file extension (e.g. `{ '.png': 'file' }`). */
662
+ loader?: Record<string, EsbuildLoader>;
663
+ /** Additional esbuild flags passed as key-value pairs. */
664
+ esbuild?: Record<string, string | boolean>;
665
+ /** Files to copy into the output directory after bundling. */
666
+ copyFiles?: Array<{
667
+ /** Source path to copy from. */
668
+ from: string;
669
+ /** Destination path in the output directory. Defaults to `from`. */
670
+ to?: string;
671
+ }>;
672
+ };
673
+ /** Hooks into the build lifecycle. */
674
+ hook?: {
675
+ /**
676
+ * Runs after bundling completes. Return an array of shell commands to execute.
677
+ * @param outputDir The path to the bundled output directory.
678
+ */
679
+ postBuild?: (outputDir: string) => string[];
680
+ };
681
+ /**
682
+ * Transform the underlying CDK resource props. Use this to customize settings
683
+ * not directly exposed by this construct.
684
+ */
685
+ transform?: {
686
+ /** Transform the Lambda function props before the function is created. */
687
+ function?: (props: lambdaNode.NodejsFunctionProps | lambda.FunctionProps) => lambdaNode.NodejsFunctionProps | lambda.FunctionProps;
688
+ /** Transform the CloudWatch log group props before the log group is created. */
689
+ logGroup?: (props: logs.LogGroupProps) => logs.LogGroupProps;
690
+ };
691
+ }
692
+ }
693
+
694
+ declare namespace SsrSiteLambda {
695
+ interface Props {
696
+ streaming?: boolean;
697
+ environment?: Record<string, string>;
698
+ vpc?: aws_cdk_lib_aws_ec2.IVpc | {
699
+ vpc: aws_cdk_lib_aws_ec2.IVpc;
700
+ subnets?: aws_cdk_lib_aws_ec2.SubnetSelection;
701
+ securityGroups?: aws_cdk_lib_aws_ec2.ISecurityGroup[];
702
+ };
703
+ permissions?: Array<{
704
+ actions: string[];
705
+ resources: string[];
706
+ }>;
707
+ server: {
708
+ path?: string;
709
+ code?: lambda.Code;
710
+ handler?: string;
711
+ runtime?: lambda.Runtime;
712
+ memory?: number;
713
+ timeout?: aws_cdk_lib.Duration;
714
+ architecture?: lambda.Architecture;
715
+ layers?: lambda.ILayerVersion[];
716
+ nodejs?: LambdaFunction.Props['nodejs'];
717
+ };
718
+ assets?: {
719
+ path?: string;
720
+ prefix?: string;
721
+ behaviors?: AssetBehavior[];
722
+ fileOptions?: FileOption[];
723
+ };
724
+ domain?: DomainProps;
725
+ edge?: {
726
+ viewerRequest?: aws_cdk_lib_aws_cloudfront.IFunction;
727
+ viewerResponse?: aws_cdk_lib_aws_cloudfront.IFunction;
728
+ };
729
+ invalidation?: InvalidationProps;
730
+ transform?: {
731
+ lambda?: (props: lambdaNode.NodejsFunctionProps) => lambdaNode.NodejsFunctionProps;
732
+ bucket?: (props: aws_cdk_lib_aws_s3.BucketProps) => aws_cdk_lib_aws_s3.BucketProps;
733
+ distribution?: (props: aws_cdk_lib_aws_cloudfront.DistributionProps) => aws_cdk_lib_aws_cloudfront.DistributionProps;
734
+ };
735
+ }
736
+ interface Resources {
737
+ lambda: lambda.Function;
738
+ functionUrl: lambda.FunctionUrl;
739
+ bucket: aws_cdk_lib_aws_s3.Bucket;
740
+ distribution: aws_cdk_lib_aws_cloudfront.Distribution;
741
+ }
742
+ }
743
+
744
+ /**
745
+ * A full-stack React Router SSR application on Lambda with CloudFront and S3 static assets.
746
+ * Automatically generates a Lambda handler that bridges React Router's `createRequestHandler`
747
+ * to Lambda function URL events, with support for streaming and buffered responses.
748
+ *
749
+ * Run `react-router build` before deploying — the construct reads the build output at synth time.
750
+ *
751
+ * @example
752
+ * ```ts
753
+ * new ReactRouterSsrSiteLambda(this, 'App', {
754
+ * domain: {
755
+ * name: 'app.example.com',
756
+ * certificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/abc-123'
757
+ * },
758
+ * environment: { DATABASE_URL: 'mysql://...' }
759
+ * })
760
+ * ```
761
+ */
762
+ declare class ReactRouterSsrSiteLambda extends Construct {
763
+ readonly lambda: lambda.Function;
764
+ readonly functionUrl: lambda.FunctionUrl;
765
+ readonly bucket: aws_cdk_lib_aws_s3.Bucket;
766
+ readonly distribution: aws_cdk_lib_aws_cloudfront.Distribution;
767
+ constructor(scope: Construct, id: string, props: ReactRouterSsrSiteLambda.Props);
768
+ }
769
+ /**
770
+ * Configuration types for {@link ReactRouterSsrSiteLambda}.
771
+ *
772
+ * @example
773
+ * ```ts
774
+ * const props: ReactRouterSsrSiteLambda.Props = {
775
+ * path: '.',
776
+ * server: { mode: 'streaming', memory: 1024 },
777
+ * domain: { name: 'app.example.com', certificateArn: '...' }
778
+ * }
779
+ * ```
780
+ */
781
+ declare namespace ReactRouterSsrSiteLambda {
782
+ interface Props {
783
+ /**
784
+ * Path to the directory where your React Router app is located, relative to the CDK app root.
785
+ *
786
+ * @default "."
787
+ */
788
+ path?: string;
789
+ /**
790
+ * The directory where the build output is located. Should match the `buildDirectory` in your
791
+ * React Router config.
792
+ *
793
+ * @default "build"
794
+ */
795
+ buildDirectory?: string;
796
+ /**
797
+ * Environment variables to set on the server Lambda function. These are loaded into
798
+ * `process.env` at runtime.
799
+ *
800
+ * @example
801
+ * ```ts
802
+ * environment: {
803
+ * DATABASE_URL: 'mysql://...',
804
+ * STRIPE_SECRET_KEY: stripeSecret.value
805
+ * }
806
+ * ```
807
+ */
808
+ environment?: Record<string, string>;
809
+ /**
810
+ * Configure the server function to connect to a VPC. This allows your React Router app
811
+ * to access private resources like RDS databases or ElastiCache clusters.
812
+ */
813
+ vpc?: SsrSiteLambda.Props['vpc'];
814
+ /**
815
+ * IAM permissions that the server function needs to access other AWS resources.
816
+ *
817
+ * @example
818
+ * ```ts
819
+ * permissions: [
820
+ * { actions: ['s3:GetObject'], resources: ['arn:aws:s3:::my-bucket/*'] }
821
+ * ]
822
+ * ```
823
+ */
824
+ permissions?: SsrSiteLambda.Props['permissions'];
825
+ server?: {
826
+ /**
827
+ * Whether the Lambda function uses streaming or buffered responses. Streaming delivers
828
+ * chunks to the client as they're generated, improving Time to First Byte (TTFB).
829
+ *
830
+ * @default "streaming"
831
+ */
832
+ mode?: 'streaming' | 'buffered';
833
+ /**
834
+ * The Lambda runtime to use for the server function.
835
+ *
836
+ * @default lambda.Runtime.NODEJS_22_X
837
+ */
838
+ runtime?: lambda.Runtime;
839
+ /**
840
+ * The amount of memory in MB allocated to the server function.
841
+ * Takes values between 128 and 10240.
842
+ *
843
+ * @default 1024
844
+ */
845
+ memory?: number;
846
+ /**
847
+ * The maximum amount of time the server function can run before timing out.
848
+ *
849
+ * @default Duration.seconds(30)
850
+ */
851
+ timeout?: aws_cdk_lib.Duration;
852
+ /**
853
+ * The processor architecture of the server function.
854
+ *
855
+ * @default lambda.Architecture.ARM_64
856
+ */
857
+ architecture?: lambda.Architecture;
858
+ /**
859
+ * A list of Lambda layer ARNs to add to the server function.
860
+ */
861
+ layers?: lambda.ILayerVersion[];
862
+ /**
863
+ * Dependencies that need to be installed into the Lambda package instead of being bundled.
864
+ * Certain npm packages cannot be bundled using esbuild — native modules, for example.
865
+ */
866
+ install?: string[];
867
+ /**
868
+ * Additional packages to exclude from the server bundle. `@aws-sdk/*` is always excluded.
869
+ */
870
+ external?: string[];
871
+ };
872
+ assets?: {
873
+ /**
874
+ * Path to the directory containing the client assets.
875
+ *
876
+ * @default "{buildDirectory}/client"
877
+ */
878
+ path?: string;
879
+ /**
880
+ * An optional prefix (subfolder) for the assets inside the S3 bucket.
881
+ */
882
+ prefix?: string;
883
+ /**
884
+ * CloudFront cache behaviors for static assets. Each entry maps a path pattern to
885
+ * a cache policy.
886
+ *
887
+ * @default [{ pathPattern: '/assets/*', cachePolicy: 'CACHING_OPTIMIZED' }]
888
+ */
889
+ behaviors?: AssetBehavior[];
890
+ /**
891
+ * Configure the `Cache-Control` header for specific files using glob patterns.
892
+ *
893
+ * @default [{ files: '**', cacheControl: 'max-age=31536000,public,immutable' }]
894
+ */
895
+ fileOptions?: FileOption[];
896
+ };
897
+ /**
898
+ * Set a custom domain for your React Router app. Automatically sets up the CloudFront
899
+ * distribution with the provided domain name and certificate.
900
+ */
901
+ domain?: SsrSiteLambda.Props['domain'];
902
+ /**
903
+ * CloudFront Functions to run on viewer request and viewer response events. A default
904
+ * viewer request function that handles trailing-slash removal and `x-forwarded-host`
905
+ * is used when not provided.
906
+ */
907
+ edge?: SsrSiteLambda.Props['edge'];
908
+ /**
909
+ * Configure CloudFront cache invalidation after deployment.
910
+ */
911
+ invalidation?: SsrSiteLambda.Props['invalidation'];
912
+ /**
913
+ * Transform the underlying CDK resources. Use these callbacks to customize the Lambda
914
+ * function, S3 bucket, or CloudFront distribution props before they are created.
915
+ */
916
+ transform?: SsrSiteLambda.Props['transform'];
917
+ }
918
+ }
919
+
920
+ /**
921
+ * A Fargate service with task definition, containers, optional ALB, auto-scaling, Spot capacity,
922
+ * and IAM permissions. Supports multi-container sidecars and conditional ALB routing rules.
923
+ *
924
+ * @example
925
+ * ```ts
926
+ * new EcsFargateService(this, 'Api', {
927
+ * cluster: cluster.cluster,
928
+ * cpu: 512,
929
+ * memoryLimitMiB: 1024,
930
+ * containers: [{ port: 3000, environment: { NODE_ENV: 'production' } }],
931
+ * loadBalancer: {
932
+ * domain: { name: 'api.example.com', certificateArn: '...' }
933
+ * },
934
+ * scaling: { min: 2, max: 10, cpuTarget: 70 }
935
+ * })
936
+ * ```
937
+ */
938
+ declare class EcsFargateService extends Construct {
939
+ readonly service: aws_cdk_lib_aws_ecs.FargateService;
940
+ readonly taskDefinition: aws_cdk_lib_aws_ecs.FargateTaskDefinition;
941
+ readonly containers: Record<string, aws_cdk_lib_aws_ecs.ContainerDefinition>;
942
+ readonly logGroups: Record<string, logs.LogGroup>;
943
+ readonly securityGroup: aws_cdk_lib_aws_ec2.SecurityGroup;
944
+ readonly alb?: aws_cdk_lib_aws_elasticloadbalancingv2.ApplicationLoadBalancer;
945
+ readonly listener?: aws_cdk_lib_aws_elasticloadbalancingv2.ApplicationListener;
946
+ readonly targetGroups?: Record<string, aws_cdk_lib_aws_elasticloadbalancingv2.ApplicationTargetGroup>;
947
+ constructor(scope: Construct, id: string, props: EcsFargateService.Props);
948
+ }
949
+ /**
950
+ * Configuration types for {@link EcsFargateService}.
951
+ *
952
+ * @example
953
+ * ```ts
954
+ * const props: EcsFargateService.Props = {
955
+ * cluster: cluster.cluster,
956
+ * containers: [{ port: 3000 }],
957
+ * loadBalancer: { domain: { name: 'api.example.com', certificateArn: '...' } },
958
+ * scaling: { min: 1, max: 4 }
959
+ * }
960
+ * ```
961
+ */
962
+ declare namespace EcsFargateService {
963
+ type LogRetention = LogRetention;
964
+ interface ImageBuildProps {
965
+ /**
966
+ * The path to the Docker build context directory.
967
+ * @default `"."`
968
+ */
969
+ context?: string;
970
+ /**
971
+ * The path to the Dockerfile, relative to the build context.
972
+ * @default `"Dockerfile"`
973
+ */
974
+ dockerfile?: string;
975
+ /** Key-value pairs passed as Docker build arguments. */
976
+ args?: Record<string, string>;
977
+ /** The target stage to build in a multi-stage Dockerfile. */
978
+ target?: string;
979
+ /** Glob patterns for files to exclude from the Docker build context. */
980
+ exclude?: string[];
981
+ }
982
+ interface ContainerProps {
983
+ /**
984
+ * The name of the container. Required when multiple containers are defined.
985
+ * Automatically set to `"Container"` for single-container services.
986
+ */
987
+ name?: string;
988
+ /**
989
+ * The container image to use. Accepts a registry image name, Docker build options, or a
990
+ * pre-built `DockerImageAsset`.
991
+ *
992
+ * @default Builds from a Dockerfile in the current directory.
993
+ * @example
994
+ * // Use a pre-built image from a registry
995
+ * { image: "nginx:latest" }
996
+ * @example
997
+ * // Build from a custom Dockerfile
998
+ * { image: { context: "./app", dockerfile: "Dockerfile.prod" } }
999
+ */
1000
+ image?: string | ImageBuildProps | aws_cdk_lib_aws_ecr_assets.DockerImageAsset;
1001
+ /** The port the container listens on. Used for load balancer target group routing. */
1002
+ port?: number;
1003
+ /** CPU units allocated to this container. When set, reserves a fixed share of the task's total CPU. */
1004
+ cpu?: number;
1005
+ /** Hard memory limit in MiB for this container. The container is killed if it exceeds this. */
1006
+ memory?: number;
1007
+ /** Override the container's default command. */
1008
+ command?: string[];
1009
+ /** Override the container's default entrypoint. */
1010
+ entrypoint?: string[];
1011
+ /** Key-value pairs set as environment variables on the container. */
1012
+ environment?: Record<string, string>;
1013
+ /**
1014
+ * Map of environment variable names to SSM Parameter Store parameter names or Secrets Manager ARNs.
1015
+ * Values starting with `arn:aws:secretsmanager:` are resolved as Secrets Manager secrets;
1016
+ * all others are resolved as SSM SecureString parameters.
1017
+ *
1018
+ * @example
1019
+ * { ssm: { DATABASE_URL: "arn:aws:secretsmanager:us-east-1:123456789:secret:db-url" } }
1020
+ */
1021
+ ssm?: Record<string, string>;
1022
+ /** Pre-built ECS `Secret` objects to inject as environment variables. Merged with `ssm` entries. */
1023
+ secrets?: Record<string, aws_cdk_lib_aws_ecs.Secret>;
1024
+ /** ECS-managed container health check configuration. */
1025
+ health?: {
1026
+ /** The command to run to check health. Must start with `CMD` or `CMD-SHELL`. */
1027
+ command: string[];
1028
+ /**
1029
+ * Seconds between health checks.
1030
+ * @default 30
1031
+ */
1032
+ interval?: number;
1033
+ /**
1034
+ * Seconds before a health check is considered failed.
1035
+ * @default 5
1036
+ */
1037
+ timeout?: number;
1038
+ /**
1039
+ * Consecutive failures required to mark the container unhealthy.
1040
+ * @default 3
1041
+ */
1042
+ retries?: number;
1043
+ /**
1044
+ * Grace period in seconds before health check failures count.
1045
+ * @default 0
1046
+ */
1047
+ startPeriod?: number;
1048
+ };
1049
+ /** CloudWatch logging configuration. */
1050
+ logging?: {
1051
+ /**
1052
+ * How long to retain CloudWatch logs.
1053
+ * @default `"1 month"`
1054
+ */
1055
+ retention?: LogRetention;
1056
+ };
1057
+ }
1058
+ /**
1059
+ * Defines how the ALB routes traffic. Each rule maps a listener port/protocol to either a
1060
+ * target container or a redirect destination.
1061
+ */
1062
+ interface RoutingRule {
1063
+ /** When set, the rule only applies to requests matching these conditions. Rules without conditions become the default action for their listener. */
1064
+ conditions?: {
1065
+ /** URL path pattern to match (e.g. `"/api/*"`). */
1066
+ path?: string;
1067
+ /** Match requests containing a specific HTTP header with one of the given values. */
1068
+ header?: {
1069
+ name: string;
1070
+ values: string[];
1071
+ };
1072
+ /** Match requests with specific query string key-value pairs. */
1073
+ query?: Array<{
1074
+ key: string;
1075
+ value: string;
1076
+ }>;
1077
+ };
1078
+ /** The name of the container to forward traffic to. Defaults to the single container when only one is defined. */
1079
+ container?: string;
1080
+ /** The port to forward traffic to on the container. Defaults to the container's `port`. */
1081
+ forward?: number;
1082
+ /**
1083
+ * The port and protocol to listen on, formatted as `"port/protocol"`.
1084
+ * @example `"443/https"`, `"80/http"`
1085
+ */
1086
+ listen: string;
1087
+ /**
1088
+ * Redirect to this port/protocol instead of forwarding. Formatted as `"port/protocol"`.
1089
+ * @example `"443/https"` — redirects HTTP to HTTPS.
1090
+ */
1091
+ redirect?: string;
1092
+ }
1093
+ interface Props {
1094
+ /**
1095
+ * The CPU architecture for the Fargate task.
1096
+ * @default `"X86_64"`
1097
+ */
1098
+ architecture?: 'X86_64' | 'ARM64';
1099
+ /**
1100
+ * The Fargate capacity provider strategy. Set to `"spot"` for 100% Spot pricing (~50% discount),
1101
+ * or provide a mix of regular Fargate and Spot with weights and base counts.
1102
+ *
1103
+ * @default Regular Fargate (on-demand).
1104
+ * @example
1105
+ * // 100% Spot
1106
+ * { capacity: "spot" }
1107
+ * @example
1108
+ * // Mixed: 1 on-demand base + Spot for burst
1109
+ * { capacity: { fargate: { weight: 1, base: 1 }, spot: { weight: 3 } } }
1110
+ */
1111
+ capacity?: 'spot' | {
1112
+ fargate?: {
1113
+ weight: number;
1114
+ base?: number;
1115
+ };
1116
+ spot?: {
1117
+ weight: number;
1118
+ base?: number;
1119
+ };
1120
+ };
1121
+ /** The ECS cluster to deploy the service into. */
1122
+ cluster: aws_cdk_lib_aws_ecs.ICluster;
1123
+ /**
1124
+ * The total CPU units for the Fargate task. Must be a
1125
+ * [valid Fargate CPU value](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size).
1126
+ * @default 256
1127
+ */
1128
+ cpu?: number;
1129
+ /**
1130
+ * The total memory (in MiB) for the Fargate task. Must be a valid value for the chosen CPU size.
1131
+ * @default 512
1132
+ */
1133
+ memoryLimitMiB?: number;
1134
+ /**
1135
+ * One or more containers to run in the task. At least one container is required.
1136
+ * Use multiple containers for sidecar patterns (e.g. log routers, proxies).
1137
+ */
1138
+ containers: ContainerProps[];
1139
+ /**
1140
+ * Creates an Application Load Balancer in front of the service. When omitted, no ALB is created
1141
+ * and the service is only reachable within the VPC.
1142
+ */
1143
+ loadBalancer?: {
1144
+ /**
1145
+ * Whether the ALB is internet-facing.
1146
+ * @default true
1147
+ */
1148
+ public?: boolean;
1149
+ /** Custom domain and TLS configuration. When set, HTTPS listeners and HTTP-to-HTTPS redirects are auto-configured. */
1150
+ domain?: {
1151
+ /** The primary domain name (e.g. `"api.example.com"`). */
1152
+ name: string;
1153
+ /** Additional domain aliases for the same certificate. */
1154
+ aliases?: string[];
1155
+ /** The ARN of an ACM certificate covering the domain and aliases. */
1156
+ certificateArn: string;
1157
+ };
1158
+ /** ALB target group health check settings. */
1159
+ health?: {
1160
+ /**
1161
+ * The HTTP path to check.
1162
+ * @default `"/health"`
1163
+ */
1164
+ path?: string;
1165
+ /** Seconds between health checks. */
1166
+ interval?: number;
1167
+ /** Seconds before a health check is considered timed out. */
1168
+ timeout?: number;
1169
+ /** Consecutive successes required to mark a target healthy. */
1170
+ healthyThreshold?: number;
1171
+ /** Consecutive failures required to mark a target unhealthy. */
1172
+ unhealthyThreshold?: number;
1173
+ /** HTTP response codes that indicate a healthy target (e.g. `"200"`, `"200-299"`). */
1174
+ successCodes?: string;
1175
+ };
1176
+ /**
1177
+ * Explicit routing rules for the ALB. When omitted, rules are auto-generated: a single
1178
+ * port-80 listener for HTTP, or port-443 HTTPS + port-80 redirect when `domain` is set.
1179
+ */
1180
+ rules?: RoutingRule[];
1181
+ };
1182
+ /** Auto scaling configuration for the service. */
1183
+ scaling?: {
1184
+ /**
1185
+ * Minimum number of tasks.
1186
+ * @default 1
1187
+ */
1188
+ min?: number;
1189
+ /**
1190
+ * Maximum number of tasks.
1191
+ * @default 4
1192
+ */
1193
+ max?: number;
1194
+ /**
1195
+ * Target average CPU utilization percentage to trigger scaling.
1196
+ * @default 70
1197
+ */
1198
+ cpuTarget?: number;
1199
+ /** Target average memory utilization percentage. When set, enables memory-based scaling. */
1200
+ memoryTarget?: number;
1201
+ /** Target requests per task. When set, enables request-count-based scaling (requires a load balancer). */
1202
+ requestsPerTarget?: number;
1203
+ /** Seconds to wait after a scale-in before another scale-in can occur. */
1204
+ scaleInCooldown?: number;
1205
+ /** Seconds to wait after a scale-out before another scale-out can occur. */
1206
+ scaleOutCooldown?: number;
1207
+ };
1208
+ /**
1209
+ * IAM permissions granted to the task role. Each entry becomes an IAM policy statement.
1210
+ *
1211
+ * @example
1212
+ * {
1213
+ * permissions: [{
1214
+ * actions: ["s3:GetObject", "s3:PutObject"],
1215
+ * resources: ["arn:aws:s3:::my-bucket/*"]
1216
+ * }]
1217
+ * }
1218
+ */
1219
+ permissions?: Array<{
1220
+ /** IAM actions to allow or deny (e.g. `"s3:GetObject"`). */
1221
+ actions: string[];
1222
+ /** Resource ARNs the policy applies to. Use `"*"` for all resources. */
1223
+ resources: string[];
1224
+ /**
1225
+ * Whether to allow or deny the actions.
1226
+ * @default `"allow"`
1227
+ */
1228
+ effect?: 'allow' | 'deny';
1229
+ /** IAM condition operators to restrict when the policy applies. */
1230
+ conditions?: Record<string, Record<string, string>>;
1231
+ }>;
1232
+ /**
1233
+ * Callbacks to customize the underlying CDK resources before they are created.
1234
+ * Each function receives the default props and returns modified props.
1235
+ */
1236
+ transform?: {
1237
+ /** Customize the ECS task execution role. */
1238
+ executionRole?: (props: aws_cdk_lib_aws_iam.RoleProps) => aws_cdk_lib_aws_iam.RoleProps;
1239
+ /** Customize the ECS task role (the role your application code assumes). */
1240
+ taskRole?: (props: aws_cdk_lib_aws_iam.RoleProps) => aws_cdk_lib_aws_iam.RoleProps;
1241
+ /** Customize the Fargate task definition. */
1242
+ taskDefinition?: (props: aws_cdk_lib_aws_ecs.FargateTaskDefinitionProps) => aws_cdk_lib_aws_ecs.FargateTaskDefinitionProps;
1243
+ /** Customize container definition options. Called once per container. */
1244
+ container?: (props: aws_cdk_lib_aws_ecs.ContainerDefinitionOptions) => aws_cdk_lib_aws_ecs.ContainerDefinitionOptions;
1245
+ /** Customize the Fargate service. */
1246
+ service?: (props: aws_cdk_lib_aws_ecs.FargateServiceProps) => aws_cdk_lib_aws_ecs.FargateServiceProps;
1247
+ /** Customize auto scaling min/max capacity. */
1248
+ autoScalingTarget?: (props: {
1249
+ minCapacity: number;
1250
+ maxCapacity: number;
1251
+ }) => {
1252
+ minCapacity: number;
1253
+ maxCapacity: number;
1254
+ };
1255
+ /** Customize the Application Load Balancer. */
1256
+ alb?: (props: aws_cdk_lib_aws_elasticloadbalancingv2.ApplicationLoadBalancerProps) => aws_cdk_lib_aws_elasticloadbalancingv2.ApplicationLoadBalancerProps;
1257
+ /** Customize the ALB security group. */
1258
+ albSecurityGroup?: (props: aws_cdk_lib_aws_ec2.SecurityGroupProps) => aws_cdk_lib_aws_ec2.SecurityGroupProps;
1259
+ /** Customize ALB listener props. Called once per listener. */
1260
+ listener?: (props: aws_cdk_lib_aws_elasticloadbalancingv2.BaseApplicationListenerProps) => aws_cdk_lib_aws_elasticloadbalancingv2.BaseApplicationListenerProps;
1261
+ /** Customize ALB target group props. Called once per target group. */
1262
+ targetGroup?: (props: aws_cdk_lib_aws_elasticloadbalancingv2.ApplicationTargetGroupProps) => aws_cdk_lib_aws_elasticloadbalancingv2.ApplicationTargetGroupProps;
1263
+ /** Customize CloudWatch log group props. Called once per container. */
1264
+ logGroup?: (props: logs.LogGroupProps) => logs.LogGroupProps;
1265
+ };
1266
+ }
1267
+ }
1268
+
1269
+ declare namespace SsrSiteEcsService {
1270
+ interface Props {
1271
+ cluster: aws_cdk_lib_aws_ecs.ICluster;
1272
+ image?: string | EcsFargateService.ImageBuildProps | aws_cdk_lib_aws_ecr_assets.DockerImageAsset;
1273
+ port?: number;
1274
+ command?: string[];
1275
+ entrypoint?: string[];
1276
+ environment?: Record<string, string>;
1277
+ ssm?: Record<string, string>;
1278
+ secrets?: Record<string, aws_cdk_lib_aws_ecs.Secret>;
1279
+ architecture?: 'X86_64' | 'ARM64';
1280
+ cpu?: number;
1281
+ memoryLimitMiB?: number;
1282
+ capacity?: EcsFargateService.Props['capacity'];
1283
+ healthCheck?: {
1284
+ path?: string;
1285
+ interval?: number;
1286
+ timeout?: number;
1287
+ healthyThreshold?: number;
1288
+ unhealthyThreshold?: number;
1289
+ successCodes?: string;
1290
+ };
1291
+ scaling?: {
1292
+ min?: number;
1293
+ max?: number;
1294
+ cpuTarget?: number;
1295
+ memoryTarget?: number;
1296
+ requestsPerTarget?: number;
1297
+ scaleInCooldown?: number;
1298
+ scaleOutCooldown?: number;
1299
+ };
1300
+ permissions?: Array<{
1301
+ actions: string[];
1302
+ resources: string[];
1303
+ effect?: 'allow' | 'deny';
1304
+ conditions?: Record<string, Record<string, string>>;
1305
+ }>;
1306
+ assets?: {
1307
+ path?: string;
1308
+ prefix?: string;
1309
+ behaviors?: AssetBehavior[];
1310
+ fileOptions?: FileOption[];
1311
+ };
1312
+ domain?: DomainProps;
1313
+ edge?: {
1314
+ viewerRequest?: aws_cdk_lib_aws_cloudfront.IFunction;
1315
+ viewerResponse?: aws_cdk_lib_aws_cloudfront.IFunction;
1316
+ };
1317
+ invalidation?: InvalidationProps;
1318
+ transform?: {
1319
+ bucket?: (props: aws_cdk_lib_aws_s3.BucketProps) => aws_cdk_lib_aws_s3.BucketProps;
1320
+ distribution?: (props: aws_cdk_lib_aws_cloudfront.DistributionProps) => aws_cdk_lib_aws_cloudfront.DistributionProps;
1321
+ executionRole?: (props: aws_cdk_lib_aws_iam.RoleProps) => aws_cdk_lib_aws_iam.RoleProps;
1322
+ taskRole?: (props: aws_cdk_lib_aws_iam.RoleProps) => aws_cdk_lib_aws_iam.RoleProps;
1323
+ taskDefinition?: (props: aws_cdk_lib_aws_ecs.FargateTaskDefinitionProps) => aws_cdk_lib_aws_ecs.FargateTaskDefinitionProps;
1324
+ container?: (props: aws_cdk_lib_aws_ecs.ContainerDefinitionOptions) => aws_cdk_lib_aws_ecs.ContainerDefinitionOptions;
1325
+ service?: (props: aws_cdk_lib_aws_ecs.FargateServiceProps) => aws_cdk_lib_aws_ecs.FargateServiceProps;
1326
+ autoScalingTarget?: (props: {
1327
+ minCapacity: number;
1328
+ maxCapacity: number;
1329
+ }) => {
1330
+ minCapacity: number;
1331
+ maxCapacity: number;
1332
+ };
1333
+ alb?: (props: aws_cdk_lib_aws_elasticloadbalancingv2.ApplicationLoadBalancerProps) => aws_cdk_lib_aws_elasticloadbalancingv2.ApplicationLoadBalancerProps;
1334
+ albSecurityGroup?: (props: aws_cdk_lib_aws_ec2.SecurityGroupProps) => aws_cdk_lib_aws_ec2.SecurityGroupProps;
1335
+ listener?: (props: aws_cdk_lib_aws_elasticloadbalancingv2.BaseApplicationListenerProps) => aws_cdk_lib_aws_elasticloadbalancingv2.BaseApplicationListenerProps;
1336
+ targetGroup?: (props: aws_cdk_lib_aws_elasticloadbalancingv2.ApplicationTargetGroupProps) => aws_cdk_lib_aws_elasticloadbalancingv2.ApplicationTargetGroupProps;
1337
+ logGroup?: (props: logs.LogGroupProps) => logs.LogGroupProps;
1338
+ };
1339
+ }
1340
+ interface Resources {
1341
+ bucket: aws_cdk_lib_aws_s3.Bucket;
1342
+ distribution: aws_cdk_lib_aws_cloudfront.Distribution;
1343
+ ecsService: EcsFargateService;
1344
+ }
1345
+ }
1346
+
1347
+ /**
1348
+ * A full-stack React Router SSR application on ECS Fargate with an ALB, CloudFront, and S3
1349
+ * static assets. Auto-generates a Dockerfile when none is provided.
1350
+ *
1351
+ * Run `react-router build` before deploying — the construct reads the build output at synth time.
1352
+ *
1353
+ * @example
1354
+ * ```ts
1355
+ * new ReactRouterSsrSiteEcsFargateService(this, 'App', {
1356
+ * cluster: cluster.cluster,
1357
+ * cpu: 512,
1358
+ * memoryLimitMiB: 1024,
1359
+ * domain: {
1360
+ * name: 'app.example.com',
1361
+ * certificateArn: 'arn:aws:acm:us-east-1:123456789:certificate/abc-123'
1362
+ * }
1363
+ * })
1364
+ * ```
1365
+ */
1366
+ declare class ReactRouterSsrSiteEcsFargateService extends Construct {
1367
+ readonly bucket: aws_cdk_lib_aws_s3.Bucket;
1368
+ readonly distribution: aws_cdk_lib_aws_cloudfront.Distribution;
1369
+ readonly ecsService: EcsFargateService;
1370
+ constructor(scope: Construct, id: string, props: ReactRouterSsrSiteEcsFargateService.Props);
1371
+ }
1372
+ /**
1373
+ * Configuration types for {@link ReactRouterSsrSiteEcsFargateService}.
1374
+ *
1375
+ * @example
1376
+ * ```ts
1377
+ * const props: ReactRouterSsrSiteEcsFargateService.Props = {
1378
+ * cluster: cluster.cluster,
1379
+ * cpu: 1024,
1380
+ * memoryLimitMiB: 2048,
1381
+ * domain: { name: 'app.example.com', certificateArn: '...' }
1382
+ * }
1383
+ * ```
1384
+ */
1385
+ declare namespace ReactRouterSsrSiteEcsFargateService {
1386
+ interface Props {
1387
+ /**
1388
+ * Path to the directory where your React Router app is located, relative to the CDK app root.
1389
+ *
1390
+ * @default "."
1391
+ */
1392
+ path?: string;
1393
+ /**
1394
+ * The directory where the build output is located. Should match the `buildDirectory` in your
1395
+ * React Router config.
1396
+ *
1397
+ * @default "build"
1398
+ */
1399
+ buildDirectory?: string;
1400
+ /** The ECS cluster to deploy the service into. */
1401
+ cluster: aws_cdk_lib_aws_ecs.ICluster;
1402
+ /**
1403
+ * The container image to use. Accepts a registry image name, Docker build options, or a
1404
+ * pre-built `DockerImageAsset`. When omitted, a Dockerfile is auto-generated that serves
1405
+ * the React Router build output.
1406
+ *
1407
+ * @example
1408
+ * ```ts
1409
+ * // Use a pre-built image from a registry
1410
+ * { image: "my-app:latest" }
1411
+ * ```
1412
+ * @example
1413
+ * ```ts
1414
+ * // Build from a custom Dockerfile
1415
+ * { image: { context: "./app", dockerfile: "Dockerfile.prod" } }
1416
+ * ```
1417
+ */
1418
+ image?: string | EcsFargateService.ImageBuildProps | aws_cdk_lib_aws_ecr_assets.DockerImageAsset;
1419
+ /**
1420
+ * The port the container listens on.
1421
+ *
1422
+ * @default 3000
1423
+ */
1424
+ port?: number;
1425
+ /** Override the container's default command. */
1426
+ command?: string[];
1427
+ /** Override the container's default entrypoint. */
1428
+ entrypoint?: string[];
1429
+ /**
1430
+ * Environment variables to set on the container. These are loaded into
1431
+ * `process.env` at runtime.
1432
+ *
1433
+ * @example
1434
+ * ```ts
1435
+ * environment: {
1436
+ * DATABASE_URL: 'mysql://...',
1437
+ * STRIPE_SECRET_KEY: stripeSecret.value
1438
+ * }
1439
+ * ```
1440
+ */
1441
+ environment?: Record<string, string>;
1442
+ /**
1443
+ * Map of environment variable names to SSM Parameter Store parameter names or Secrets Manager ARNs.
1444
+ * Values starting with `arn:aws:secretsmanager:` are resolved as Secrets Manager secrets;
1445
+ * all others are resolved as SSM SecureString parameters.
1446
+ *
1447
+ * @example
1448
+ * ```ts
1449
+ * { ssm: { DATABASE_URL: "arn:aws:secretsmanager:us-east-1:123456789:secret:db-url" } }
1450
+ * ```
1451
+ */
1452
+ ssm?: Record<string, string>;
1453
+ /** Pre-built ECS `Secret` objects to inject as environment variables. Merged with `ssm` entries. */
1454
+ secrets?: Record<string, aws_cdk_lib_aws_ecs.Secret>;
1455
+ /**
1456
+ * The CPU architecture for the Fargate task.
1457
+ *
1458
+ * @default "X86_64"
1459
+ */
1460
+ architecture?: 'X86_64' | 'ARM64';
1461
+ /**
1462
+ * The total CPU units for the Fargate task. Must be a
1463
+ * [valid Fargate CPU value](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size).
1464
+ *
1465
+ * @default 256
1466
+ */
1467
+ cpu?: number;
1468
+ /**
1469
+ * The total memory (in MiB) for the Fargate task. Must be a valid value for the chosen CPU size.
1470
+ *
1471
+ * @default 512
1472
+ */
1473
+ memoryLimitMiB?: number;
1474
+ /**
1475
+ * The Fargate capacity provider strategy. Set to `"spot"` for 100% Spot pricing (~50% discount),
1476
+ * or provide a mix of regular Fargate and Spot with weights and base counts.
1477
+ *
1478
+ * @default Regular Fargate (on-demand).
1479
+ */
1480
+ capacity?: SsrSiteEcsService.Props['capacity'];
1481
+ /** ALB target group health check settings. */
1482
+ healthCheck?: SsrSiteEcsService.Props['healthCheck'];
1483
+ /** Auto scaling configuration for the service. */
1484
+ scaling?: SsrSiteEcsService.Props['scaling'];
1485
+ /**
1486
+ * IAM permissions granted to the task role. Each entry becomes an IAM policy statement.
1487
+ *
1488
+ * @example
1489
+ * ```ts
1490
+ * permissions: [
1491
+ * { actions: ['s3:GetObject'], resources: ['arn:aws:s3:::my-bucket/*'] }
1492
+ * ]
1493
+ * ```
1494
+ */
1495
+ permissions?: SsrSiteEcsService.Props['permissions'];
1496
+ assets?: {
1497
+ /**
1498
+ * Path to the directory containing the client assets.
1499
+ *
1500
+ * @default "{buildDirectory}/client"
1501
+ */
1502
+ path?: string;
1503
+ /** An optional prefix (subfolder) for the assets inside the S3 bucket. */
1504
+ prefix?: string;
1505
+ /**
1506
+ * CloudFront cache behaviors for static assets. Each entry maps a path pattern to
1507
+ * a cache policy.
1508
+ *
1509
+ * @default [{ pathPattern: '/assets/*', cachePolicy: 'CACHING_OPTIMIZED' }]
1510
+ */
1511
+ behaviors?: AssetBehavior[];
1512
+ /**
1513
+ * Configure the `Cache-Control` header for specific files using glob patterns.
1514
+ *
1515
+ * @default [{ files: '**', cacheControl: 'max-age=31536000,public,immutable' }]
1516
+ */
1517
+ fileOptions?: FileOption[];
1518
+ };
1519
+ /**
1520
+ * Set a custom domain for your React Router app. Automatically sets up the CloudFront
1521
+ * distribution with the provided domain name and certificate.
1522
+ */
1523
+ domain?: SsrSiteEcsService.Props['domain'];
1524
+ /**
1525
+ * CloudFront Functions to run on viewer request and viewer response events. A default
1526
+ * viewer request function that handles trailing-slash removal and `x-forwarded-host`
1527
+ * is used when not provided.
1528
+ */
1529
+ edge?: SsrSiteEcsService.Props['edge'];
1530
+ /** Configure CloudFront cache invalidation after deployment. */
1531
+ invalidation?: SsrSiteEcsService.Props['invalidation'];
1532
+ /**
1533
+ * Callbacks to customize the underlying CDK resources before they are created.
1534
+ * Each function receives the default props and returns modified props.
1535
+ */
1536
+ transform?: SsrSiteEcsService.Props['transform'];
1537
+ }
1538
+ }
1539
+
1540
+ /**
1541
+ * Builds a Docker image for a React Router app and pushes it to ECR. Auto-generates a
1542
+ * Dockerfile when none is provided. Use this to pre-build an image that can be shared
1543
+ * across multiple ECS services.
1544
+ *
1545
+ * Run `react-router build` before deploying — the construct reads the build output at synth time.
1546
+ *
1547
+ * @example
1548
+ * ```ts
1549
+ * const image = new ReactRouterEcrImage(this, 'AppImage', {
1550
+ * path: './packages/web',
1551
+ * architecture: 'ARM64'
1552
+ * })
1553
+ * ```
1554
+ */
1555
+ declare class ReactRouterEcrImage extends Construct {
1556
+ readonly asset: aws_cdk_lib_aws_ecr_assets.DockerImageAsset;
1557
+ constructor(scope: Construct, id: string, props?: ReactRouterEcrImage.Props);
1558
+ }
1559
+ /**
1560
+ * Configuration types for {@link ReactRouterEcrImage}.
1561
+ *
1562
+ * @example
1563
+ * ```ts
1564
+ * const props: ReactRouterEcrImage.Props = {
1565
+ * path: './packages/web',
1566
+ * architecture: 'ARM64'
1567
+ * }
1568
+ * ```
1569
+ */
1570
+ declare namespace ReactRouterEcrImage {
1571
+ interface Props {
1572
+ /**
1573
+ * Path to the directory where your React Router app is located, relative to the CDK app root.
1574
+ *
1575
+ * @default "."
1576
+ */
1577
+ path?: string;
1578
+ /**
1579
+ * The directory where the build output is located. Should match the `buildDirectory` in your
1580
+ * React Router config.
1581
+ *
1582
+ * @default "build"
1583
+ */
1584
+ buildDirectory?: string;
1585
+ /**
1586
+ * The port the container listens on. Used when auto-generating the Dockerfile.
1587
+ *
1588
+ * @default 3000
1589
+ */
1590
+ port?: number;
1591
+ /**
1592
+ * Custom Docker build options. When omitted, a Dockerfile is auto-generated that serves
1593
+ * the React Router build output.
1594
+ */
1595
+ image?: EcsFargateService.ImageBuildProps;
1596
+ /**
1597
+ * The CPU architecture for the container image.
1598
+ *
1599
+ * @default "X86_64"
1600
+ */
1601
+ architecture?: 'X86_64' | 'ARM64';
1602
+ /**
1603
+ * Override the Docker image platform. When omitted, the platform is derived from `architecture`.
1604
+ */
1605
+ platform?: aws_cdk_lib_aws_ecr_assets.Platform;
1606
+ }
1607
+ }
1608
+
1609
+ /**
1610
+ * An RDS MySQL instance in private subnets with encrypted storage, automated backups,
1611
+ * and an optional RDS Proxy for connection pooling.
1612
+ *
1613
+ * @example
1614
+ * ```ts
1615
+ * const db = new MySqlDatabase(this, 'Database', {
1616
+ * vpc: network.vpc,
1617
+ * database: 'ecommerce',
1618
+ * multiAz: true,
1619
+ * proxy: true
1620
+ * })
1621
+ * ```
1622
+ */
1623
+ declare class MySqlDatabase extends Construct {
1624
+ readonly instance: aws_cdk_lib_aws_rds.DatabaseInstance;
1625
+ readonly securityGroup: aws_cdk_lib_aws_ec2.SecurityGroup;
1626
+ readonly secret: secretsmanager.ISecret;
1627
+ readonly connections: aws_cdk_lib_aws_ec2.Connections;
1628
+ readonly rdsProxy?: aws_cdk_lib_aws_rds.DatabaseProxy;
1629
+ get host(): string;
1630
+ get port(): string;
1631
+ get proxyEndpoint(): string | undefined;
1632
+ constructor(scope: Construct, id: string, props: MySqlDatabase.Props);
1633
+ }
1634
+ /**
1635
+ * Configuration types for {@link MySqlDatabase}.
1636
+ *
1637
+ * @example
1638
+ * ```ts
1639
+ * const props: MySqlDatabase.Props = {
1640
+ * vpc: network.vpc,
1641
+ * database: 'app',
1642
+ * storage: 100,
1643
+ * multiAz: true
1644
+ * }
1645
+ * ```
1646
+ */
1647
+ declare namespace MySqlDatabase {
1648
+ interface Props {
1649
+ /** The VPC to deploy the database instance in. */
1650
+ vpc: aws_cdk_lib_aws_ec2.IVpc;
1651
+ /**
1652
+ * The name of a database that is automatically created inside the instance.
1653
+ *
1654
+ * The name must begin with a letter and contain only lowercase letters,
1655
+ * numbers, or underscores.
1656
+ */
1657
+ database: string;
1658
+ /**
1659
+ * The username of the master database user. A secret with the generated
1660
+ * password is stored in Secrets Manager.
1661
+ *
1662
+ * @default `"root"`
1663
+ */
1664
+ username?: string;
1665
+ /**
1666
+ * The MySQL engine version.
1667
+ *
1668
+ * @default `MysqlEngineVersion.VER_8_0`
1669
+ */
1670
+ version?: aws_cdk_lib_aws_rds.MysqlEngineVersion;
1671
+ /**
1672
+ * The type of instance to use for the database.
1673
+ *
1674
+ * @default `t3.micro`
1675
+ */
1676
+ instance?: aws_cdk_lib_aws_ec2.InstanceType;
1677
+ /**
1678
+ * The initial allocated storage for the database in GB.
1679
+ *
1680
+ * The maximum allocated storage will be set to the larger of this value
1681
+ * or 5000 GB to allow for autoscaling.
1682
+ *
1683
+ * @default 20
1684
+ */
1685
+ storage?: number;
1686
+ /**
1687
+ * Enable Multi-AZ deployment for the database.
1688
+ *
1689
+ * When enabled, a standby replica is maintained in a different availability
1690
+ * zone for automatic failover during outages.
1691
+ *
1692
+ * @default false
1693
+ */
1694
+ multiAz?: boolean;
1695
+ /**
1696
+ * Enable an RDS Proxy in front of the instance.
1697
+ *
1698
+ * RDS Proxy sits between your application and the database, managing
1699
+ * connection pooling and failover. Useful for Lambda-backed applications
1700
+ * that can exhaust direct connections.
1701
+ *
1702
+ * @default false
1703
+ */
1704
+ proxy?: boolean;
1705
+ /**
1706
+ * Enable Performance Insights for the instance.
1707
+ *
1708
+ * @default false
1709
+ */
1710
+ performanceInsights?: boolean;
1711
+ /**
1712
+ * The number of days to retain automated backups.
1713
+ *
1714
+ * @default 7
1715
+ */
1716
+ backupRetentionDays?: number;
1717
+ /**
1718
+ * Enable deletion protection on the instance.
1719
+ *
1720
+ * When enabled, the instance cannot be deleted without first disabling this setting.
1721
+ *
1722
+ * @default true
1723
+ */
1724
+ deletionProtection?: boolean;
1725
+ /**
1726
+ * Transform the underlying CDK props before resource creation.
1727
+ *
1728
+ * Use this to customize any property that isn't directly exposed.
1729
+ *
1730
+ * @example
1731
+ * ```ts
1732
+ * transform: {
1733
+ * instance: (props) => ({ ...props, publiclyAccessible: false })
1734
+ * }
1735
+ * ```
1736
+ */
1737
+ transform?: {
1738
+ instance?: (props: aws_cdk_lib_aws_rds.DatabaseInstanceProps) => aws_cdk_lib_aws_rds.DatabaseInstanceProps;
1739
+ proxy?: (props: aws_cdk_lib_aws_rds.DatabaseProxyProps) => aws_cdk_lib_aws_rds.DatabaseProxyProps;
1740
+ };
1741
+ }
1742
+ }
1743
+
1744
+ type DurationString = `${number} ${'second' | 'seconds' | 'minute' | 'minutes' | 'hour' | 'hours'}`;
1745
+ /**
1746
+ * An Aurora Serverless v2 cluster (MySQL or PostgreSQL) with auto-scaling, optional auto-pause,
1747
+ * read replicas, and RDS Proxy.
1748
+ *
1749
+ * @example
1750
+ * ```ts
1751
+ * const db = new AuroraDatabase(this, 'Database', {
1752
+ * vpc: network.vpc,
1753
+ * engine: 'postgres',
1754
+ * version: rds.AuroraPostgresEngineVersion.VER_17_4,
1755
+ * database: 'myapp',
1756
+ * scaling: { min: 0, max: 4, pauseAfter: '10 minutes' }
1757
+ * })
1758
+ * ```
1759
+ */
1760
+ declare class AuroraDatabase extends Construct {
1761
+ readonly cluster: aws_cdk_lib_aws_rds.DatabaseCluster;
1762
+ readonly securityGroup: aws_cdk_lib_aws_ec2.SecurityGroup;
1763
+ readonly secret: secretsmanager.ISecret;
1764
+ readonly connections: aws_cdk_lib_aws_ec2.Connections;
1765
+ readonly rdsProxy?: aws_cdk_lib_aws_rds.DatabaseProxy;
1766
+ get host(): string;
1767
+ get port(): string;
1768
+ get readerHost(): string;
1769
+ get proxyEndpoint(): string | undefined;
1770
+ constructor(scope: Construct, id: string, props: AuroraDatabase.Props);
1771
+ }
1772
+ /**
1773
+ * Configuration types for {@link AuroraDatabase}.
1774
+ *
1775
+ * @example
1776
+ * ```ts
1777
+ * const props: AuroraDatabase.Props = {
1778
+ * vpc: network.vpc,
1779
+ * engine: 'postgres',
1780
+ * version: rds.AuroraPostgresEngineVersion.VER_17_4,
1781
+ * database: 'myapp',
1782
+ * scaling: { min: 0.5, max: 16 }
1783
+ * }
1784
+ * ```
1785
+ */
1786
+ declare namespace AuroraDatabase {
1787
+ interface BaseProps {
1788
+ /**
1789
+ * Enable the RDS Data API for the cluster.
1790
+ *
1791
+ * The Data API provides a secure HTTP endpoint that lets you run SQL without
1792
+ * managing persistent database connections.
1793
+ *
1794
+ * @default false
1795
+ */
1796
+ dataApi?: boolean;
1797
+ /**
1798
+ * The name of a database that is automatically created inside the cluster.
1799
+ *
1800
+ * The name must begin with a letter and contain only lowercase letters,
1801
+ * numbers, or underscores.
1802
+ */
1803
+ database: string;
1804
+ /**
1805
+ * The port the cluster listens on.
1806
+ *
1807
+ * @default Engine default (5432 for Postgres, 3306 for MySQL)
1808
+ */
1809
+ port?: number;
1810
+ /**
1811
+ * Enable an RDS Proxy in front of the cluster.
1812
+ *
1813
+ * RDS Proxy sits between your application and the database, managing
1814
+ * connection pooling and failover. Useful for Lambda-backed applications
1815
+ * that can exhaust direct connections.
1816
+ *
1817
+ * @default false
1818
+ */
1819
+ proxy?: boolean;
1820
+ /**
1821
+ * The number of Serverless v2 read-only replicas.
1822
+ *
1823
+ * Each reader scales with the writer and can be used to distribute read traffic.
1824
+ *
1825
+ * @default 0
1826
+ */
1827
+ readers?: number;
1828
+ /**
1829
+ * Aurora Serverless v2 scaling configuration.
1830
+ *
1831
+ * @default `{ min: 0, max: 4 }`
1832
+ *
1833
+ * @example
1834
+ * ```ts
1835
+ * scaling: { min: 0.5, max: 16, pauseAfter: '10 minutes' }
1836
+ * ```
1837
+ */
1838
+ scaling?: {
1839
+ /** Minimum ACU capacity. @default 0 */
1840
+ min?: number;
1841
+ /** Maximum ACU capacity. @default 4 */
1842
+ max?: number;
1843
+ /**
1844
+ * Automatically pause the cluster after this duration of inactivity.
1845
+ * Set to pause the database to zero ACUs when idle.
1846
+ */
1847
+ pauseAfter?: DurationString;
1848
+ };
1849
+ /**
1850
+ * The username of the master database user. A secret with the generated
1851
+ * password is stored in Secrets Manager.
1852
+ *
1853
+ * @default `"postgres"` for Postgres, `"root"` for MySQL
1854
+ */
1855
+ username?: string;
1856
+ /** The VPC to deploy the database cluster in. */
1857
+ vpc: aws_cdk_lib_aws_ec2.IVpc;
1858
+ /**
1859
+ * Enable Performance Insights for the cluster.
1860
+ *
1861
+ * @default false
1862
+ */
1863
+ performanceInsights?: boolean;
1864
+ /**
1865
+ * The number of days to retain automated backups.
1866
+ *
1867
+ * @default 7
1868
+ */
1869
+ backupRetentionDays?: number;
1870
+ /**
1871
+ * Enable deletion protection on the cluster.
1872
+ *
1873
+ * When enabled, the cluster cannot be deleted without first disabling this setting.
1874
+ *
1875
+ * @default true
1876
+ */
1877
+ deletionProtection?: boolean;
1878
+ /**
1879
+ * Transform the underlying CDK props before resource creation.
1880
+ *
1881
+ * Use this to customize any property that isn't directly exposed.
1882
+ *
1883
+ * @example
1884
+ * ```ts
1885
+ * transform: {
1886
+ * cluster: (props) => ({ ...props, storageType: rds.DBClusterStorageType.AURORA_IOPT1 })
1887
+ * }
1888
+ * ```
1889
+ */
1890
+ transform?: {
1891
+ cluster?: (props: aws_cdk_lib_aws_rds.DatabaseClusterProps) => aws_cdk_lib_aws_rds.DatabaseClusterProps;
1892
+ proxy?: (props: aws_cdk_lib_aws_rds.DatabaseProxyProps) => aws_cdk_lib_aws_rds.DatabaseProxyProps;
1893
+ };
1894
+ }
1895
+ type Props = BaseProps & ({
1896
+ /** The Aurora engine. */
1897
+ engine: 'postgres';
1898
+ /** The Postgres engine version (e.g. `AuroraPostgresEngineVersion.VER_17_4`). */
1899
+ version: aws_cdk_lib_aws_rds.AuroraPostgresEngineVersion;
1900
+ } | {
1901
+ /** The Aurora engine. */
1902
+ engine: 'mysql';
1903
+ /** The MySQL engine version (e.g. `AuroraMysqlEngineVersion.VER_3_08_0`). */
1904
+ version: aws_cdk_lib_aws_rds.AuroraMysqlEngineVersion;
1905
+ });
1906
+ }
1907
+
1908
+ /**
1909
+ * An ElastiCache Redis or Valkey replication group in private subnets with encryption,
1910
+ * auth token, and automatic failover.
1911
+ *
1912
+ * @example
1913
+ * ```ts
1914
+ * const cache = new Redis(this, 'Cache', {
1915
+ * vpc: network.vpc,
1916
+ * engine: 'valkey',
1917
+ * replicas: 1
1918
+ * })
1919
+ * ```
1920
+ */
1921
+ declare class Redis extends Construct {
1922
+ readonly replicationGroup: aws_cdk_lib_aws_elasticache.CfnReplicationGroup;
1923
+ readonly securityGroup: aws_cdk_lib_aws_ec2.SecurityGroup;
1924
+ readonly subnetGroup: aws_cdk_lib_aws_elasticache.CfnSubnetGroup;
1925
+ readonly parameterGroup?: aws_cdk_lib_aws_elasticache.CfnParameterGroup;
1926
+ readonly secret: secretsmanager.Secret;
1927
+ get host(): string;
1928
+ get port(): string;
1929
+ constructor(scope: Construct, id: string, props: Redis.Props);
1930
+ }
1931
+ /**
1932
+ * Configuration types for {@link Redis}.
1933
+ *
1934
+ * @example
1935
+ * ```ts
1936
+ * const props: Redis.Props = {
1937
+ * vpc: network.vpc,
1938
+ * engine: 'valkey',
1939
+ * replicas: 1
1940
+ * }
1941
+ * ```
1942
+ */
1943
+ declare namespace Redis {
1944
+ interface Props {
1945
+ /** The VPC to deploy the replication group in. */
1946
+ vpc: aws_cdk_lib_aws_ec2.IVpc;
1947
+ /**
1948
+ * The cache engine.
1949
+ *
1950
+ * @default `"redis"`
1951
+ */
1952
+ engine?: 'redis' | 'valkey';
1953
+ /**
1954
+ * The engine version string (e.g. `"7.1"` for Redis, `"7.2"` for Valkey).
1955
+ *
1956
+ * @default `"7.1"` for Redis, `"7.2"` for Valkey
1957
+ */
1958
+ version?: string;
1959
+ /**
1960
+ * The node instance type.
1961
+ *
1962
+ * @default `"cache.t4g.micro"`
1963
+ */
1964
+ instance?: string;
1965
+ /**
1966
+ * The number of read replicas. The total cluster size is `replicas + 1`.
1967
+ *
1968
+ * Automatic failover is enabled when `replicas >= 1`.
1969
+ *
1970
+ * @default 0
1971
+ */
1972
+ replicas?: number;
1973
+ /**
1974
+ * Custom parameter group overrides.
1975
+ *
1976
+ * When provided, a dedicated `CfnParameterGroup` is created with these values.
1977
+ *
1978
+ * @example
1979
+ * ```ts
1980
+ * parameters: { 'maxmemory-policy': 'allkeys-lru' }
1981
+ * ```
1982
+ */
1983
+ parameters?: Record<string, string>;
1984
+ /**
1985
+ * Transform the underlying CDK props before resource creation.
1986
+ *
1987
+ * Use this to customize any property that isn't directly exposed.
1988
+ *
1989
+ * @example
1990
+ * ```ts
1991
+ * transform: {
1992
+ * replicationGroup: (props) => ({ ...props, snapshotRetentionLimit: 7 })
1993
+ * }
1994
+ * ```
1995
+ */
1996
+ transform?: {
1997
+ replicationGroup?: (props: aws_cdk_lib_aws_elasticache.CfnReplicationGroupProps) => aws_cdk_lib_aws_elasticache.CfnReplicationGroupProps;
1998
+ subnetGroup?: (props: aws_cdk_lib_aws_elasticache.CfnSubnetGroupProps) => aws_cdk_lib_aws_elasticache.CfnSubnetGroupProps;
1999
+ parameterGroup?: (props: aws_cdk_lib_aws_elasticache.CfnParameterGroupProps) => aws_cdk_lib_aws_elasticache.CfnParameterGroupProps;
2000
+ };
2001
+ }
2002
+ }
2003
+
2004
+ /**
2005
+ * An Amazon SES email identity with a configuration set, optional DMARC record, and event destinations.
2006
+ *
2007
+ * @example
2008
+ * ```ts
2009
+ * const email = new Email(this, 'Transactional', {
2010
+ * sender: 'notifications.example.com',
2011
+ * hostedZone: zone,
2012
+ * events: [{ types: ['bounce', 'complaint'], snsTopic: alertsTopic }]
2013
+ * })
2014
+ * ```
2015
+ */
2016
+ declare class Email extends Construct {
2017
+ readonly identity: aws_cdk_lib_aws_ses.EmailIdentity;
2018
+ readonly configurationSet: aws_cdk_lib_aws_ses.ConfigurationSet;
2019
+ readonly dmarcRecord?: route53.TxtRecord;
2020
+ private _sender;
2021
+ get sender(): string;
2022
+ get configSetName(): string;
2023
+ constructor(scope: Construct, id: string, props: Email.Props);
2024
+ }
2025
+ /**
2026
+ * Configuration types for {@link Email}.
2027
+ *
2028
+ * @example
2029
+ * ```ts
2030
+ * const props: Email.Props = {
2031
+ * sender: 'notifications.example.com',
2032
+ * hostedZone: zone,
2033
+ * dmarc: 'v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com;'
2034
+ * }
2035
+ * ```
2036
+ */
2037
+ declare namespace Email {
2038
+ /** Kebab-case SES sending event types. */
2039
+ type EmailSendingEventType = 'send' | 'reject' | 'bounce' | 'complaint' | 'delivery' | 'open' | 'click' | 'rendering-failure' | 'delivery-delay' | 'subscription';
2040
+ /** A CloudWatch dimension for SES event metrics. */
2041
+ interface CloudWatchDimension {
2042
+ /** The dimension name. */
2043
+ name: string;
2044
+ /** The dimension value source. */
2045
+ source: 'messageTag' | 'emailHeader' | 'linkTag';
2046
+ /** The default value when the source is unavailable. */
2047
+ defaultValue: string;
2048
+ }
2049
+ /** An event destination that receives SES sending events. */
2050
+ interface EventDestination {
2051
+ /**
2052
+ * The sending event types to forward. When omitted, all event types are forwarded.
2053
+ */
2054
+ types?: EmailSendingEventType[];
2055
+ /**
2056
+ * Whether this event destination is enabled.
2057
+ * @default true
2058
+ */
2059
+ enabled?: boolean;
2060
+ /** Send events to an SNS topic. */
2061
+ snsTopic?: aws_cdk_lib_aws_sns.ITopic;
2062
+ /** Send events to CloudWatch as custom dimensions. */
2063
+ cloudWatchDimensions?: CloudWatchDimension[];
2064
+ }
2065
+ interface Props {
2066
+ /**
2067
+ * The email address or domain to verify as an SES identity.
2068
+ *
2069
+ * Use a bare domain (e.g. `'notifications.example.com'`) to verify an entire domain,
2070
+ * or an email address (e.g. `'hello@example.com'`) to verify a single address.
2071
+ */
2072
+ sender: string;
2073
+ /**
2074
+ * A Route 53 hosted zone for automatic DNS verification and DMARC record creation.
2075
+ *
2076
+ * When provided with a domain sender, SES will automatically add the required
2077
+ * DKIM and verification DNS records. A DMARC TXT record is also created.
2078
+ */
2079
+ hostedZone?: route53.IHostedZone;
2080
+ /**
2081
+ * The DMARC policy value for the TXT record. Only valid for domain senders
2082
+ * with a hosted zone.
2083
+ *
2084
+ * @default `'v=DMARC1; p=none;'`
2085
+ */
2086
+ dmarc?: string;
2087
+ /** Event destinations for SES sending events. */
2088
+ events?: EventDestination[];
2089
+ /**
2090
+ * Transform the underlying CDK resource props before creation.
2091
+ *
2092
+ * Use this to customize any property that isn't directly exposed.
2093
+ */
2094
+ transform?: {
2095
+ configurationSet?: (props: aws_cdk_lib_aws_ses.ConfigurationSetProps) => aws_cdk_lib_aws_ses.ConfigurationSetProps;
2096
+ identity?: (props: aws_cdk_lib_aws_ses.EmailIdentityProps) => aws_cdk_lib_aws_ses.EmailIdentityProps;
2097
+ };
2098
+ }
2099
+ }
2100
+
2101
+ /**
2102
+ * An SNS Topic with convenience methods for subscribing Lambda functions and SQS queues.
2103
+ *
2104
+ * @example
2105
+ * ```ts
2106
+ * const topic = new SnsTopic(this, 'Alerts', {
2107
+ * displayName: 'Alert Notifications'
2108
+ * })
2109
+ *
2110
+ * topic.subscribe('Handler', handler)
2111
+ * topic.subscribeQueue('Dlq', deadLetterQueue)
2112
+ * ```
2113
+ */
2114
+ declare class SnsTopic extends Construct {
2115
+ readonly topic: aws_cdk_lib_aws_sns.Topic;
2116
+ get arn(): string;
2117
+ get topicName(): string;
2118
+ constructor(scope: Construct, id: string, props?: SnsTopic.Props);
2119
+ /**
2120
+ * Subscribe a Lambda function to this topic.
2121
+ */
2122
+ subscribe(name: string, fn: lambda.IFunction, args?: SnsTopic.LambdaSubscribeArgs): void;
2123
+ /**
2124
+ * Subscribe an SQS queue to this topic.
2125
+ */
2126
+ subscribeQueue(name: string, queue: aws_cdk_lib_aws_sqs.IQueue, args?: SnsTopic.SqsSubscribeArgs): void;
2127
+ }
2128
+ /**
2129
+ * Configuration types for {@link SnsTopic}.
2130
+ *
2131
+ * @example
2132
+ * ```ts
2133
+ * const props: SnsTopic.Props = {
2134
+ * displayName: 'Order Events',
2135
+ * fifo: true,
2136
+ * contentBasedDeduplication: true
2137
+ * }
2138
+ * ```
2139
+ */
2140
+ declare namespace SnsTopic {
2141
+ /** Shared subscription arguments for filter policies and dead-letter queues. */
2142
+ interface SubscribeArgs {
2143
+ /**
2144
+ * SNS filter policy applied to message attributes.
2145
+ * Only messages matching the policy are delivered to the subscriber.
2146
+ */
2147
+ filterPolicy?: Record<string, aws_cdk_lib_aws_sns.SubscriptionFilter>;
2148
+ /**
2149
+ * SNS filter policy applied to the message body.
2150
+ * Only messages matching the policy are delivered to the subscriber.
2151
+ */
2152
+ filterPolicyWithMessageBody?: Record<string, aws_cdk_lib_aws_sns.FilterOrPolicy>;
2153
+ /** A dead-letter queue for messages that fail delivery. */
2154
+ deadLetterQueue?: aws_cdk_lib_aws_sqs.IQueue;
2155
+ }
2156
+ /** Arguments for subscribing a Lambda function. */
2157
+ interface LambdaSubscribeArgs extends SubscribeArgs {
2158
+ /** Transform the underlying CDK subscription props before creation. */
2159
+ transform?: {
2160
+ subscription?: (props: aws_cdk_lib_aws_sns_subscriptions.LambdaSubscriptionProps) => aws_cdk_lib_aws_sns_subscriptions.LambdaSubscriptionProps;
2161
+ };
2162
+ }
2163
+ /** Arguments for subscribing an SQS queue. */
2164
+ interface SqsSubscribeArgs extends SubscribeArgs {
2165
+ /**
2166
+ * When enabled, the raw message is delivered to the queue instead of a JSON-wrapped envelope.
2167
+ * @default false
2168
+ */
2169
+ rawMessageDelivery?: boolean;
2170
+ /** Transform the underlying CDK subscription props before creation. */
2171
+ transform?: {
2172
+ subscription?: (props: aws_cdk_lib_aws_sns_subscriptions.SqsSubscriptionProps) => aws_cdk_lib_aws_sns_subscriptions.SqsSubscriptionProps;
2173
+ };
2174
+ }
2175
+ interface Props {
2176
+ /** A human-readable name for the topic, displayed in the AWS Console. */
2177
+ displayName?: string;
2178
+ /**
2179
+ * Create a FIFO (first-in-first-out) topic. FIFO topics guarantee strict message ordering
2180
+ * and exactly-once delivery.
2181
+ * @default false
2182
+ */
2183
+ fifo?: boolean;
2184
+ /**
2185
+ * Transform the underlying CDK resource props before creation.
2186
+ * Use this to customize any property that isn't directly exposed.
2187
+ */
2188
+ transform?: {
2189
+ topic?: (props: aws_cdk_lib_aws_sns.TopicProps) => aws_cdk_lib_aws_sns.TopicProps;
2190
+ };
2191
+ }
2192
+ }
2193
+
2194
+ /**
2195
+ * An EventBridge Event Bus with convenience methods for subscribing Lambda functions and SQS queues
2196
+ * with event pattern filtering.
2197
+ *
2198
+ * @example
2199
+ * ```ts
2200
+ * const bus = new EventBus(this, 'Orders', {
2201
+ * description: 'Order domain events'
2202
+ * })
2203
+ *
2204
+ * bus.subscribe('Handler', handler, {
2205
+ * pattern: { source: ['orders'], detailType: ['OrderPlaced'] }
2206
+ * })
2207
+ * bus.subscribeQueue('Dlq', deadLetterQueue, {
2208
+ * pattern: { source: ['orders'] }
2209
+ * })
2210
+ * ```
2211
+ */
2212
+ declare class EventBus extends Construct {
2213
+ readonly bus: aws_cdk_lib_aws_events.EventBus;
2214
+ get arn(): string;
2215
+ get busName(): string;
2216
+ constructor(scope: Construct, id: string, props?: EventBus.Props);
2217
+ /**
2218
+ * Subscribe a Lambda function to events on this bus.
2219
+ */
2220
+ subscribe(name: string, fn: lambda.IFunction, args?: EventBus.LambdaSubscribeArgs): void;
2221
+ /**
2222
+ * Subscribe an SQS queue to events on this bus.
2223
+ */
2224
+ subscribeQueue(name: string, queue: aws_cdk_lib_aws_sqs.IQueue, args?: EventBus.SqsSubscribeArgs): void;
2225
+ }
2226
+ /**
2227
+ * Configuration types for {@link EventBus}.
2228
+ *
2229
+ * @example
2230
+ * ```ts
2231
+ * const props: EventBus.Props = {
2232
+ * eventBusName: 'orders',
2233
+ * description: 'Order domain events'
2234
+ * }
2235
+ * ```
2236
+ */
2237
+ declare namespace EventBus {
2238
+ /** Shared subscription arguments for event pattern filtering. */
2239
+ interface SubscribeArgs {
2240
+ /**
2241
+ * EventBridge event pattern to filter which events trigger the subscription.
2242
+ * All specified fields must match for the event to be delivered.
2243
+ */
2244
+ pattern?: {
2245
+ /** Match events from these sources (e.g. `['orders', 'payments']`). */
2246
+ source?: string[];
2247
+ /** Match events with these detail types (e.g. `['OrderPlaced', 'OrderCancelled']`). */
2248
+ detailType?: string[];
2249
+ /** Match events whose `detail` field matches this pattern. */
2250
+ detail?: Record<string, any>;
2251
+ };
2252
+ }
2253
+ /** Arguments for subscribing a Lambda function. */
2254
+ interface LambdaSubscribeArgs extends SubscribeArgs {
2255
+ /** Transform the underlying CDK resource props before creation. */
2256
+ transform?: {
2257
+ rule?: (props: aws_cdk_lib_aws_events.RuleProps) => aws_cdk_lib_aws_events.RuleProps;
2258
+ target?: (props: aws_cdk_lib_aws_events_targets.LambdaFunctionProps) => aws_cdk_lib_aws_events_targets.LambdaFunctionProps;
2259
+ };
2260
+ }
2261
+ /** Arguments for subscribing an SQS queue. */
2262
+ interface SqsSubscribeArgs extends SubscribeArgs {
2263
+ /** Transform the underlying CDK resource props before creation. */
2264
+ transform?: {
2265
+ rule?: (props: aws_cdk_lib_aws_events.RuleProps) => aws_cdk_lib_aws_events.RuleProps;
2266
+ target?: (props: aws_cdk_lib_aws_events_targets.SqsQueueProps) => aws_cdk_lib_aws_events_targets.SqsQueueProps;
2267
+ };
2268
+ }
2269
+ interface Props {
2270
+ /** The physical name of the event bus. */
2271
+ eventBusName?: string;
2272
+ /** A description for the event bus. */
2273
+ description?: string;
2274
+ /**
2275
+ * Transform the underlying CDK resource props before creation.
2276
+ * Use this to customize any property that isn't directly exposed.
2277
+ */
2278
+ transform?: {
2279
+ bus?: (props: aws_cdk_lib_aws_events.EventBusProps) => aws_cdk_lib_aws_events.EventBusProps;
2280
+ };
2281
+ }
2282
+ }
2283
+
2284
+ export { AuroraDatabase, Bucket, Cluster, EcsFargateService, Email, EventBus, LambdaFunction, MySqlDatabase, ReactRouterEcrImage, ReactRouterSsrSiteEcsFargateService, ReactRouterSsrSiteLambda, Redis, SnsTopic, StaticSite, Vpc };