@fjall/components-infrastructure 2.29.0 → 2.30.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/__tests__/setup.d.ts +48 -0
- package/dist/lib/__tests__/setup.js +1 -0
- package/dist/lib/app.d.ts +8 -4
- package/dist/lib/app.js +24 -6
- package/dist/lib/config/aws/accountId.d.ts +6 -0
- package/dist/lib/config/aws/accountId.js +33 -0
- package/dist/lib/config/aws/backupGlobalSettings.d.ts +29 -0
- package/dist/lib/config/aws/backupGlobalSettings.js +51 -0
- package/dist/lib/config/aws/costAllocationTags.d.ts +12 -0
- package/dist/lib/config/aws/costAllocationTags.js +48 -0
- package/dist/lib/config/aws/eventBus.d.ts +7 -0
- package/dist/lib/config/aws/eventBus.js +24 -0
- package/dist/lib/config/aws/identityCenterGroupMembership.d.ts +10 -0
- package/dist/lib/config/aws/identityCenterGroupMembership.js +115 -0
- package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +8 -0
- package/dist/lib/config/aws/ipamDelegateAdmin.js +58 -0
- package/dist/lib/config/aws/ipamPoolId.d.ts +10 -0
- package/dist/lib/config/aws/ipamPoolId.js +39 -0
- package/dist/lib/config/aws/organisation.d.ts +30 -0
- package/dist/lib/config/aws/organisation.js +95 -0
- package/dist/lib/config/aws/organisationId.d.ts +7 -0
- package/dist/lib/config/aws/organisationId.js +46 -0
- package/dist/lib/config/aws/organisationsAccess.d.ts +10 -0
- package/dist/lib/config/aws/organisationsAccess.js +50 -0
- package/dist/lib/config/aws/ramSharing.d.ts +4 -0
- package/dist/lib/config/aws/ramSharing.js +35 -0
- package/dist/lib/config/monitoring.d.ts +18 -0
- package/dist/lib/config/monitoring.js +22 -0
- package/dist/lib/lambda-assets/static-site-forms/asset/index.js +175 -0
- package/dist/lib/lambda-assets/static-site-forms/asset/package.json +4 -0
- package/dist/lib/patterns/aws/cdn.d.ts +19 -2
- package/dist/lib/patterns/aws/cdn.js +13 -2
- package/dist/lib/patterns/aws/cicdRole.d.ts +67 -0
- package/dist/lib/patterns/aws/cicdRole.js +68 -0
- package/dist/lib/patterns/aws/compute.js +9 -0
- package/dist/lib/patterns/aws/computeLambda.d.ts +38 -3
- package/dist/lib/patterns/aws/computeLambda.js +29 -2
- package/dist/lib/patterns/aws/hostedZone.d.ts +28 -0
- package/dist/lib/patterns/aws/hostedZone.js +150 -0
- package/dist/lib/patterns/aws/interfaces/pattern.d.ts +134 -5
- package/dist/lib/patterns/aws/interfaces/pattern.js +6 -0
- package/dist/lib/patterns/aws/managedAccount.d.ts +9 -0
- package/dist/lib/patterns/aws/managedAccount.js +55 -0
- package/dist/lib/patterns/aws/managedIdentityCenter.d.ts +4 -0
- package/dist/lib/patterns/aws/managedIdentityCenter.js +24 -0
- package/dist/lib/patterns/aws/managedOrganisation.d.ts +36 -0
- package/dist/lib/patterns/aws/managedOrganisation.js +97 -0
- package/dist/lib/patterns/aws/managedPlatform.d.ts +12 -0
- package/dist/lib/patterns/aws/managedPlatform.js +29 -0
- package/dist/lib/patterns/aws/pattern.d.ts +20 -5
- package/dist/lib/patterns/aws/pattern.js +12 -6
- package/dist/lib/patterns/aws/staticSite.d.ts +59 -0
- package/dist/lib/patterns/aws/staticSite.js +307 -0
- package/dist/lib/patterns/aws/subdomainHostedZone.d.ts +9 -0
- package/dist/lib/patterns/aws/subdomainHostedZone.js +39 -0
- package/dist/lib/resources/aws/cdn/cloudFront.d.ts +35 -2
- package/dist/lib/resources/aws/cdn/cloudFront.js +63 -25
- package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
- package/dist/lib/resources/aws/cdn/index.js +1 -0
- package/dist/lib/resources/aws/cdn/responseHeadersPolicy.d.ts +56 -0
- package/dist/lib/resources/aws/cdn/responseHeadersPolicy.js +92 -0
- package/dist/lib/resources/aws/cicd/cicdRole.d.ts +65 -0
- package/dist/lib/resources/aws/cicd/cicdRole.js +191 -0
- package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +75 -0
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +1 -0
- package/dist/lib/resources/aws/compute/ecsImages.js +3 -25
- package/dist/lib/resources/aws/compute/ecsSpot.d.ts +75 -0
- package/dist/lib/resources/aws/compute/ecsSpot.js +1 -0
- package/dist/lib/resources/aws/compute/imageTagParameter.d.ts +12 -0
- package/dist/lib/resources/aws/compute/imageTagParameter.js +32 -0
- package/dist/lib/resources/aws/compute/lambda.d.ts +7 -0
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +20 -0
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +1 -0
- package/dist/lib/resources/aws/database/database.d.ts +14 -0
- package/dist/lib/resources/aws/database/database.js +28 -0
- package/dist/lib/resources/aws/database/databaseInstance.d.ts +15 -0
- package/dist/lib/resources/aws/database/databaseInstance.js +30 -0
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +13 -0
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +52 -0
- package/dist/lib/resources/aws/iam/securityGroup.d.ts +5 -0
- package/dist/lib/resources/aws/iam/securityGroup.js +14 -0
- package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +28 -0
- package/dist/lib/resources/aws/monitoring/monitoringRole.js +125 -0
- package/dist/lib/resources/aws/networking/domainCertificate.d.ts +7 -0
- package/dist/lib/resources/aws/networking/domainCertificate.js +9 -7
- package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +5 -0
- package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -0
- package/dist/lib/utils/addSuffixToEmail.js +5 -1
- package/dist/lib/utils/capitalizeString.d.ts +1 -0
- package/dist/lib/utils/capitalizeString.js +7 -0
- package/package.json +7 -5
- package/dist/lib/config/aws/identityCenterMembership.d.ts +0 -11
- package/dist/lib/config/aws/identityCenterMembership.js +0 -61
|
@@ -21,8 +21,10 @@ import { type RelationalDatabase, type DynamoDBDatabase, type ProxyConfig, type
|
|
|
21
21
|
import { type LambdaCompute } from "../compute.js";
|
|
22
22
|
import { type Storage } from "../storage.js";
|
|
23
23
|
import { type QueueMessaging } from "../messaging.js";
|
|
24
|
-
import { type Cdn, type SmartCdnBehaviour } from "../cdn.js";
|
|
24
|
+
import { type Cdn, type SmartCdnBehaviour, type StaticSiteRouting } from "../cdn.js";
|
|
25
|
+
import { type LambdaFunction } from "../../../resources/aws/compute/index.js";
|
|
25
26
|
import type { ManagedDomainExports } from "../../../utils/domainTypes.js";
|
|
27
|
+
import type { PatternType } from "@fjall/util";
|
|
26
28
|
export type { ProxyConfig, ReadReplicaConfig, CredentialsConfig, EncryptionConfig, AuroraEncryptionConfig, AuroraWriterConfig, AuroraReadersConfig, DatabaseInsightsConfig };
|
|
27
29
|
/**
|
|
28
30
|
* Full database configuration for patterns.
|
|
@@ -339,15 +341,121 @@ export interface IPayloadProps {
|
|
|
339
341
|
/** Additional environment variables for server Lambda */
|
|
340
342
|
environment?: Record<string, string>;
|
|
341
343
|
}
|
|
344
|
+
/**
|
|
345
|
+
* Build configuration for a static site — the single source of truth read by
|
|
346
|
+
* both the CDK construct (`outputDir` is what BucketDeployment uploads) and the
|
|
347
|
+
* deploy-core builder (`command` runs in `source` before synth).
|
|
348
|
+
*/
|
|
349
|
+
export interface StaticSiteBuildConfig {
|
|
350
|
+
/** Build command run in `source` (e.g. "npm run build"). */
|
|
351
|
+
command: string;
|
|
352
|
+
/** Directory (relative to `source`) holding the built site (e.g. "out"). */
|
|
353
|
+
outputDir: string;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Security-header configuration for a static site.
|
|
357
|
+
*/
|
|
358
|
+
export interface StaticSiteSecurityConfig {
|
|
359
|
+
/** Ship the four safe headers (HSTS/nosniff/frame/referrer). */
|
|
360
|
+
headers?: boolean;
|
|
361
|
+
/** Opt-in Content-Security-Policy. Absent ⇒ no CSP header (a wrong policy
|
|
362
|
+
* silently breaks inline hydration, so it is never a shipped default). */
|
|
363
|
+
contentSecurityPolicy?: string;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Contact-form configuration for a static site. Requires a custom `domain`: SES
|
|
367
|
+
* sends only from a verified identity, and the site's domain is the identity
|
|
368
|
+
* this pattern verifies. The endpoint is `https://<domain>/api/contact`.
|
|
369
|
+
*
|
|
370
|
+
* `to` and `from` are separate axes. `to` is where submissions land and is
|
|
371
|
+
* unconstrained — a personal mailbox is the common case. `from` is the envelope
|
|
372
|
+
* sender and must sit at `domain`. The submitter's own address is put in
|
|
373
|
+
* Reply-To at send time, so replying from the inbox reaches them.
|
|
374
|
+
*/
|
|
375
|
+
export interface StaticSiteFormsConfig {
|
|
376
|
+
/** Where submissions are delivered. Any address — not an SES identity. */
|
|
377
|
+
to: string;
|
|
378
|
+
/** Envelope sender; must be an address at `domain`. Default `noreply@<domain>`. */
|
|
379
|
+
from?: string;
|
|
380
|
+
/**
|
|
381
|
+
* Origin allowed to POST the form — the browser CORS allow-origin and the
|
|
382
|
+
* server-side Origin gate. An exact origin (`https://example.com`, no path,
|
|
383
|
+
* no trailing slash). Default `https://<domain>`.
|
|
384
|
+
*/
|
|
385
|
+
corsOrigin?: string;
|
|
386
|
+
/**
|
|
387
|
+
* Concurrent executions the endpoint may hold. The Function URL is public and
|
|
388
|
+
* unauthenticated, so this caps both the SES bill and the account-wide Lambda
|
|
389
|
+
* concurrency a flood can consume. Default 5.
|
|
390
|
+
*/
|
|
391
|
+
maxConcurrency?: number;
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* CDN configuration for a static site — advanced per-path override passthrough.
|
|
395
|
+
*/
|
|
396
|
+
export interface StaticSiteCdnConfig {
|
|
397
|
+
/** Additional CDN behaviours (per-path overrides). */
|
|
398
|
+
behaviours?: SmartCdnBehaviour[];
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Static-site pattern props.
|
|
402
|
+
*
|
|
403
|
+
* Serves a pre-built folder of files from a private S3 bucket behind CloudFront
|
|
404
|
+
* with OAC, clean URLs, security headers, an optional custom domain, and an
|
|
405
|
+
* optional contact-form endpoint (Lambda Function URL → SES, CloudFront-fronted).
|
|
406
|
+
*
|
|
407
|
+
* @example
|
|
408
|
+
* app.addPattern(PatternFactory.build("LbexcSite", {
|
|
409
|
+
* type: "staticsite",
|
|
410
|
+
* name: "lbexc",
|
|
411
|
+
* source: "../../lbexc-static-export",
|
|
412
|
+
* build: { command: "npm run build", outputDir: "out" },
|
|
413
|
+
* routing: "multipage",
|
|
414
|
+
* security: { headers: true },
|
|
415
|
+
* domain: "lbexc.com",
|
|
416
|
+
* forms: { to: "hello@lbexc.com", corsOrigin: "https://lbexc.com" }
|
|
417
|
+
* }));
|
|
418
|
+
*/
|
|
419
|
+
export interface IStaticSiteProps {
|
|
420
|
+
/** Pattern type discriminator */
|
|
421
|
+
type: "staticsite";
|
|
422
|
+
/** Pattern name (used for resource naming) */
|
|
423
|
+
name: string;
|
|
424
|
+
/** Repo root the build runs in and assets are uploaded from. */
|
|
425
|
+
source: string;
|
|
426
|
+
/** Build command + output directory (single source of truth). */
|
|
427
|
+
build: StaticSiteBuildConfig;
|
|
428
|
+
/** "multipage" (clean-URL `.html` rewriting) or "spa". Default: "multipage". */
|
|
429
|
+
routing?: StaticSiteRouting;
|
|
430
|
+
/** Security-header configuration. */
|
|
431
|
+
security?: StaticSiteSecurityConfig;
|
|
432
|
+
/** Custom domain (same machinery as payload). Required when `forms` is set. */
|
|
433
|
+
domain?: string;
|
|
434
|
+
/** Import zone and cert from a managed domain stack instead of creating inline */
|
|
435
|
+
managedDomain?: ManagedDomainExports;
|
|
436
|
+
/** Optional contact-form endpoint (Lambda → SES). Requires `domain`. */
|
|
437
|
+
forms?: StaticSiteFormsConfig;
|
|
438
|
+
/** CDN configuration - for advanced per-path overrides. */
|
|
439
|
+
cdn?: StaticSiteCdnConfig;
|
|
440
|
+
}
|
|
342
441
|
/**
|
|
343
442
|
* Union of all pattern props.
|
|
344
443
|
* Extend this when adding new patterns (e.g., INextjsProps, IRemixProps).
|
|
345
444
|
*/
|
|
346
|
-
export type IPatternProps = IPayloadProps;
|
|
445
|
+
export type IPatternProps = IPayloadProps | IStaticSiteProps;
|
|
347
446
|
/**
|
|
348
|
-
* Pattern type discriminator.
|
|
447
|
+
* Pattern type discriminator. The vocabulary is owned by `@fjall/util` and
|
|
448
|
+
* shared with the generator, the deploy manifest and the CLI — see
|
|
449
|
+
* `PATTERN_REGISTRY` there, which is what forces a new pattern to declare its
|
|
450
|
+
* stack placement and construct id rather than inheriting whichever branch
|
|
451
|
+
* happened to be the `else`.
|
|
452
|
+
*
|
|
453
|
+
* Note the vocabulary is wider than `IPatternProps`: `nextjs` is declared in
|
|
454
|
+
* `PATTERN_REGISTRY` but has no construct, so it is deliberately absent from the
|
|
455
|
+
* union above and `PatternFactory.build` will not accept it — the omission here
|
|
456
|
+
* is the single enforcement of that gap.
|
|
349
457
|
*/
|
|
350
|
-
export type PatternType
|
|
458
|
+
export type { PatternType };
|
|
351
459
|
/**
|
|
352
460
|
* Base pattern interface.
|
|
353
461
|
* All patterns implement this interface.
|
|
@@ -391,15 +499,36 @@ export interface IPayload extends IPattern {
|
|
|
391
499
|
/** Get the CloudFront distribution */
|
|
392
500
|
getCdn(): Cdn;
|
|
393
501
|
}
|
|
502
|
+
/**
|
|
503
|
+
* Static-site pattern interface.
|
|
504
|
+
* Provides access to the underlying resources for escape hatches.
|
|
505
|
+
*
|
|
506
|
+
* @example
|
|
507
|
+
* site.getBucket().getBucket().addLifecycleRule({ ... });
|
|
508
|
+
* site.getCdn().getDistribution().addBehavior("/custom/*", customOrigin);
|
|
509
|
+
*/
|
|
510
|
+
export interface IStaticSite extends IPattern {
|
|
511
|
+
readonly patternType: "staticsite";
|
|
512
|
+
/** Get the private S3 origin bucket */
|
|
513
|
+
getBucket(): Storage;
|
|
514
|
+
/** Get the CloudFront distribution */
|
|
515
|
+
getCdn(): Cdn;
|
|
516
|
+
/** Get the contact-form Lambda (undefined when `forms` is not configured) */
|
|
517
|
+
getFormsFunction(): LambdaFunction | undefined;
|
|
518
|
+
}
|
|
394
519
|
/**
|
|
395
520
|
* Union type representing any pattern interface.
|
|
396
521
|
* Use with type guards for generic handling.
|
|
397
522
|
*/
|
|
398
|
-
export type AnyPattern = IPayload;
|
|
523
|
+
export type AnyPattern = IPayload | IStaticSite;
|
|
399
524
|
/**
|
|
400
525
|
* Type guard to check if a pattern is Payload.
|
|
401
526
|
*/
|
|
402
527
|
export declare function isPayloadPattern(pattern: IPattern): pattern is IPayload;
|
|
528
|
+
/**
|
|
529
|
+
* Type guard to check if a pattern is a static site.
|
|
530
|
+
*/
|
|
531
|
+
export declare function isStaticSitePattern(pattern: IPattern): pattern is IStaticSite;
|
|
403
532
|
/**
|
|
404
533
|
* Type guard to check if a resource is any pattern type.
|
|
405
534
|
*/
|
|
@@ -20,6 +20,12 @@
|
|
|
20
20
|
export function isPayloadPattern(pattern) {
|
|
21
21
|
return pattern.patternType === "payload";
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Type guard to check if a pattern is a static site.
|
|
25
|
+
*/
|
|
26
|
+
export function isStaticSitePattern(pattern) {
|
|
27
|
+
return pattern.patternType === "staticsite";
|
|
28
|
+
}
|
|
23
29
|
/**
|
|
24
30
|
* Type guard to check if a resource is any pattern type.
|
|
25
31
|
*/
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Stack, type StackProps } from "aws-cdk-lib";
|
|
2
|
+
import { type Construct } from "constructs";
|
|
3
|
+
export interface ManagedAccountProps extends StackProps {
|
|
4
|
+
accountId: string;
|
|
5
|
+
region: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class ManagedAccount extends Stack {
|
|
8
|
+
constructor(scope: Construct, id: string, props: ManagedAccountProps);
|
|
9
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ManagedAccount = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const aws_1 = require("../../config/aws");
|
|
6
|
+
const cloudTrail_1 = require("../../config/aws/cloudTrail");
|
|
7
|
+
const getConfig_1 = require("../../utils/getConfig");
|
|
8
|
+
const disasterRecovery_1 = require("../../config/aws/disasterRecovery");
|
|
9
|
+
const util_1 = require("@fjall/util");
|
|
10
|
+
class ManagedAccount extends aws_cdk_lib_1.Stack {
|
|
11
|
+
constructor(scope, id, props) {
|
|
12
|
+
super(scope, id, props);
|
|
13
|
+
const organisation = new aws_1.OrganisationId(this, "OrganisationId");
|
|
14
|
+
const account = new aws_1.AccountId(this, "AccountId");
|
|
15
|
+
const eventBus = new aws_1.DefaultEventBus(this, "EventBus");
|
|
16
|
+
if (id === "ManagedAccount") {
|
|
17
|
+
new aws_1.IpamPoolId(this, "IpamPoolId", {
|
|
18
|
+
accountId: props.accountId,
|
|
19
|
+
region: props.region,
|
|
20
|
+
ownerId: organisation.organisationAccountArn.value.split(":")[4]
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
new cloudTrail_1.ManagementEventsTrail(this, "CloudTrail", {
|
|
24
|
+
accountId: account.accountId.value,
|
|
25
|
+
region: props.region
|
|
26
|
+
});
|
|
27
|
+
new aws_1.EcrDefaultImage(this, "EcrDefaultImage", {
|
|
28
|
+
region: props.region,
|
|
29
|
+
accountId: account.accountId.value,
|
|
30
|
+
eventBusArn: eventBus.defaultEventBusArn.value
|
|
31
|
+
});
|
|
32
|
+
const config = (0, getConfig_1.getConfig)();
|
|
33
|
+
const environment = config.environment || "unknown";
|
|
34
|
+
const _fjallConfig = util_1.Config.loadConfig();
|
|
35
|
+
const isComplianceAccount = environment === "compliance";
|
|
36
|
+
const isReplicationRegion = config.disasterRecoveryRegion &&
|
|
37
|
+
props.region === config.disasterRecoveryRegion;
|
|
38
|
+
if (environment === "production" ||
|
|
39
|
+
isComplianceAccount ||
|
|
40
|
+
isReplicationRegion) {
|
|
41
|
+
new disasterRecovery_1.DisasterRecovery(this, "DisasterRecovery", {
|
|
42
|
+
region: props.region,
|
|
43
|
+
accountId: props.accountId
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
new aws_cdk_lib_1.CfnOutput(this, "Environment", {
|
|
47
|
+
key: "Environment",
|
|
48
|
+
value: environment,
|
|
49
|
+
exportName: "Environment",
|
|
50
|
+
description: "Environment type for this account (e.g., production, staging, development)"
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.ManagedAccount = ManagedAccount;
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZEFjY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL21hbmFnZWRBY2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFnRTtBQUNoRSwwQ0FNMEI7QUFFMUIsNERBQW9FO0FBQ3BFLHFEQUFrRDtBQUNsRCx3RUFBcUU7QUFDckUsc0NBQW9EO0FBT3BELE1BQWEsY0FBZSxTQUFRLG1CQUFLO0lBQ3ZDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxvQkFBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWhFLE1BQU0sT0FBTyxHQUFHLElBQUksZUFBUyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVqRCxNQUFNLFFBQVEsR0FBRyxJQUFJLHFCQUFlLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXZELElBQUksRUFBRSxLQUFLLGdCQUFnQixFQUFFLENBQUM7WUFDNUIsSUFBSSxnQkFBVSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7Z0JBQ2pDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUNwQixPQUFPLEVBQUUsWUFBWSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pFLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLGtDQUFxQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDNUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSztZQUNsQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07U0FDckIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxxQkFBZSxDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRTtZQUMzQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSztZQUNsQyxXQUFXLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEtBQUs7U0FDL0MsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBUyxHQUFFLENBQUM7UUFDM0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsYUFBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTlDLE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxLQUFLLFlBQVksQ0FBQztRQUN6RCxNQUFNLG1CQUFtQixHQUN2QixNQUFNLENBQUMsc0JBQXNCO1lBQzdCLEtBQUssQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBRWpELElBQ0UsV0FBVyxLQUFLLFlBQVk7WUFDNUIsbUJBQW1CO1lBQ25CLG1CQUFtQixFQUNuQixDQUFDO1lBQ0QsSUFBSSxtQ0FBZ0IsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQzdDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtnQkFDcEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2FBQzNCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUNqQyxHQUFHLEVBQUUsYUFBYTtZQUNsQixLQUFLLEVBQUUsV0FBVztZQUNsQixVQUFVLEVBQUUsYUFBYTtZQUN6QixXQUFXLEVBQ1QsNEVBQTRFO1NBQy9FLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXpERCx3Q0F5REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIFN0YWNrLCB0eXBlIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIE9yZ2FuaXNhdGlvbklkLFxuICBBY2NvdW50SWQsXG4gIElwYW1Qb29sSWQsXG4gIEVjckRlZmF1bHRJbWFnZSxcbiAgRGVmYXVsdEV2ZW50QnVzXG59IGZyb20gXCIuLi8uLi9jb25maWcvYXdzXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBNYW5hZ2VtZW50RXZlbnRzVHJhaWwgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2F3cy9jbG91ZFRyYWlsXCI7XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZ2V0Q29uZmlnXCI7XG5pbXBvcnQgeyBEaXNhc3RlclJlY292ZXJ5IH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvZGlzYXN0ZXJSZWNvdmVyeVwiO1xuaW1wb3J0IHsgQ29uZmlnIGFzIEZqYWxsQ29uZmlnIH0gZnJvbSBcIkBmamFsbC91dGlsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlZEFjY291bnRQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICBhY2NvdW50SWQ6IHN0cmluZztcbiAgcmVnaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkQWNjb3VudCBleHRlbmRzIFN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE1hbmFnZWRBY2NvdW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIGNvbnN0IG9yZ2FuaXNhdGlvbiA9IG5ldyBPcmdhbmlzYXRpb25JZCh0aGlzLCBcIk9yZ2FuaXNhdGlvbklkXCIpO1xuXG4gICAgY29uc3QgYWNjb3VudCA9IG5ldyBBY2NvdW50SWQodGhpcywgXCJBY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBldmVudEJ1cyA9IG5ldyBEZWZhdWx0RXZlbnRCdXModGhpcywgXCJFdmVudEJ1c1wiKTtcblxuICAgIGlmIChpZCA9PT0gXCJNYW5hZ2VkQWNjb3VudFwiKSB7XG4gICAgICBuZXcgSXBhbVBvb2xJZCh0aGlzLCBcIklwYW1Qb29sSWRcIiwge1xuICAgICAgICBhY2NvdW50SWQ6IHByb3BzLmFjY291bnRJZCxcbiAgICAgICAgcmVnaW9uOiBwcm9wcy5yZWdpb24sXG4gICAgICAgIG93bmVySWQ6IG9yZ2FuaXNhdGlvbi5vcmdhbmlzYXRpb25BY2NvdW50QXJuLnZhbHVlLnNwbGl0KFwiOlwiKVs0XVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmV3IE1hbmFnZW1lbnRFdmVudHNUcmFpbCh0aGlzLCBcIkNsb3VkVHJhaWxcIiwge1xuICAgICAgYWNjb3VudElkOiBhY2NvdW50LmFjY291bnRJZC52YWx1ZSxcbiAgICAgIHJlZ2lvbjogcHJvcHMucmVnaW9uXG4gICAgfSk7XG5cbiAgICBuZXcgRWNyRGVmYXVsdEltYWdlKHRoaXMsIFwiRWNyRGVmYXVsdEltYWdlXCIsIHtcbiAgICAgIHJlZ2lvbjogcHJvcHMucmVnaW9uLFxuICAgICAgYWNjb3VudElkOiBhY2NvdW50LmFjY291bnRJZC52YWx1ZSxcbiAgICAgIGV2ZW50QnVzQXJuOiBldmVudEJ1cy5kZWZhdWx0RXZlbnRCdXNBcm4udmFsdWVcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZygpO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID0gY29uZmlnLmVudmlyb25tZW50IHx8IFwidW5rbm93blwiO1xuICAgIGNvbnN0IF9mamFsbENvbmZpZyA9IEZqYWxsQ29uZmlnLmxvYWRDb25maWcoKTtcblxuICAgIGNvbnN0IGlzQ29tcGxpYW5jZUFjY291bnQgPSBlbnZpcm9ubWVudCA9PT0gXCJjb21wbGlhbmNlXCI7XG4gICAgY29uc3QgaXNSZXBsaWNhdGlvblJlZ2lvbiA9XG4gICAgICBjb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbiAmJlxuICAgICAgcHJvcHMucmVnaW9uID09PSBjb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbjtcblxuICAgIGlmIChcbiAgICAgIGVudmlyb25tZW50ID09PSBcInByb2R1Y3Rpb25cIiB8fFxuICAgICAgaXNDb21wbGlhbmNlQWNjb3VudCB8fFxuICAgICAgaXNSZXBsaWNhdGlvblJlZ2lvblxuICAgICkge1xuICAgICAgbmV3IERpc2FzdGVyUmVjb3ZlcnkodGhpcywgXCJEaXNhc3RlclJlY292ZXJ5XCIsIHtcbiAgICAgICAgcmVnaW9uOiBwcm9wcy5yZWdpb24sXG4gICAgICAgIGFjY291bnRJZDogcHJvcHMuYWNjb3VudElkXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiRW52aXJvbm1lbnRcIiwge1xuICAgICAga2V5OiBcIkVudmlyb25tZW50XCIsXG4gICAgICB2YWx1ZTogZW52aXJvbm1lbnQsXG4gICAgICBleHBvcnROYW1lOiBcIkVudmlyb25tZW50XCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJFbnZpcm9ubWVudCB0eXBlIGZvciB0aGlzIGFjY291bnQgKGUuZy4sIHByb2R1Y3Rpb24sIHN0YWdpbmcsIGRldmVsb3BtZW50KVwiXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ManagedIdentityCenter = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const fs = require("fs");
|
|
6
|
+
const app_1 = require("../../app");
|
|
7
|
+
const identityCenterGroupMembership_1 = require("../../config/aws/identityCenterGroupMembership");
|
|
8
|
+
class ManagedIdentityCenter extends aws_cdk_lib_1.Stack {
|
|
9
|
+
constructor(id) {
|
|
10
|
+
super(app_1.default.getInstance(), id);
|
|
11
|
+
const configFile = fs.readFileSync("../identity-center-config.json", {
|
|
12
|
+
encoding: "utf8"
|
|
13
|
+
});
|
|
14
|
+
const identityCenterConfig = JSON.parse(configFile);
|
|
15
|
+
identityCenterConfig.forEach((config) => {
|
|
16
|
+
new identityCenterGroupMembership_1.IdentityCenterGroupMembership(this, `Managed${config.group}Group`, {
|
|
17
|
+
groupName: config.group,
|
|
18
|
+
groupMembers: config.members
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.ManagedIdentityCenter = ManagedIdentityCenter;
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZElkZW50aXR5Q2VudGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9tYW5hZ2VkSWRlbnRpdHlDZW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQW9DO0FBQ3BDLHlCQUF5QjtBQUN6QixtQ0FBNEI7QUFDNUIsa0dBQStGO0FBTy9GLE1BQWEscUJBQXNCLFNBQVEsbUJBQUs7SUFDOUMsWUFBWSxFQUFVO1FBQ3BCLEtBQUssQ0FBQyxhQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFN0IsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxnQ0FBZ0MsRUFBRTtZQUNuRSxRQUFRLEVBQUUsTUFBTTtTQUNqQixDQUFDLENBQUM7UUFDSCxNQUFNLG9CQUFvQixHQUF5QixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTFFLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLElBQUksNkRBQTZCLENBQUMsSUFBSSxFQUFFLFVBQVUsTUFBTSxDQUFDLEtBQUssT0FBTyxFQUFFO2dCQUNyRSxTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ3ZCLFlBQVksRUFBRSxNQUFNLENBQUMsT0FBTzthQUM3QixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWhCRCxzREFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IElkZW50aXR5Q2VudGVyR3JvdXBNZW1iZXJzaGlwIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvaWRlbnRpdHlDZW50ZXJHcm91cE1lbWJlcnNoaXBcIjtcblxudHlwZSBJZGVudGl0eUNlbnRlckNvbmZpZyA9IEFycmF5PHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgbWVtYmVyczogc3RyaW5nW107XG59PjtcblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRJZGVudGl0eUNlbnRlciBleHRlbmRzIFN0YWNrIHtcbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKEFwcC5nZXRJbnN0YW5jZSgpLCBpZCk7XG5cbiAgICBjb25zdCBjb25maWdGaWxlID0gZnMucmVhZEZpbGVTeW5jKFwiLi4vaWRlbnRpdHktY2VudGVyLWNvbmZpZy5qc29uXCIsIHtcbiAgICAgIGVuY29kaW5nOiBcInV0ZjhcIlxuICAgIH0pO1xuICAgIGNvbnN0IGlkZW50aXR5Q2VudGVyQ29uZmlnOiBJZGVudGl0eUNlbnRlckNvbmZpZyA9IEpTT04ucGFyc2UoY29uZmlnRmlsZSk7XG5cbiAgICBpZGVudGl0eUNlbnRlckNvbmZpZy5mb3JFYWNoKChjb25maWcpID0+IHtcbiAgICAgIG5ldyBJZGVudGl0eUNlbnRlckdyb3VwTWVtYmVyc2hpcCh0aGlzLCBgTWFuYWdlZCR7Y29uZmlnLmdyb3VwfUdyb3VwYCwge1xuICAgICAgICBncm91cE5hbWU6IGNvbmZpZy5ncm91cCxcbiAgICAgICAgZ3JvdXBNZW1iZXJzOiBjb25maWcubWVtYmVyc1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Environment, Stack, type StackProps } from "aws-cdk-lib";
|
|
2
|
+
import { type ICostAllocationTags } from "../../config/aws/costAllocationTags";
|
|
3
|
+
import { type Account } from "@aws-sdk/client-organizations";
|
|
4
|
+
type ExtendedStackProps = Omit<StackProps, "env"> & {
|
|
5
|
+
env: Required<Pick<Environment, "region" | "account">> & Partial<Omit<Environment, "region" | "account">>;
|
|
6
|
+
};
|
|
7
|
+
type AccountsConfig = {
|
|
8
|
+
readonly [key: string]: readonly string[] | string;
|
|
9
|
+
};
|
|
10
|
+
interface ManagedOrganisationProps extends ExtendedStackProps {
|
|
11
|
+
organisationName: string;
|
|
12
|
+
accounts: AccountsConfig;
|
|
13
|
+
orgEmail: string;
|
|
14
|
+
existingAccounts?: Account[];
|
|
15
|
+
costAllocationTags: ICostAllocationTags[];
|
|
16
|
+
identityCenter?: boolean;
|
|
17
|
+
backupSettings?: {
|
|
18
|
+
enableCrossAccountBackup?: boolean;
|
|
19
|
+
enableDelegatedAdministrator?: boolean;
|
|
20
|
+
enableMpa?: boolean;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export declare class ManagedOrganisation extends Stack {
|
|
24
|
+
private organisation;
|
|
25
|
+
constructor(id: string, props: ManagedOrganisationProps);
|
|
26
|
+
private createOrganisation;
|
|
27
|
+
private setupOrganisationFeatures;
|
|
28
|
+
private getPlatformAccountId;
|
|
29
|
+
private setupIpamDelegation;
|
|
30
|
+
private enableRamSharing;
|
|
31
|
+
private enableTrustedAccess;
|
|
32
|
+
private enableCostAllocationTags;
|
|
33
|
+
private setupIdentityCenter;
|
|
34
|
+
private setupBackupGlobalSettings;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ManagedOrganisation = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const app_1 = require("../../app");
|
|
6
|
+
const backupGlobalSettings_1 = require("../../config/aws/backupGlobalSettings");
|
|
7
|
+
const identityCenter_1 = require("../../config/aws/identityCenter");
|
|
8
|
+
const ipamDelegateAdmin_1 = require("../../config/aws/ipamDelegateAdmin");
|
|
9
|
+
const ramSharing_1 = require("../../config/aws/ramSharing");
|
|
10
|
+
const costAllocationTags_1 = require("../../config/aws/costAllocationTags");
|
|
11
|
+
const organisation_1 = require("../../config/aws/organisation");
|
|
12
|
+
const organisationsAccess_1 = require("../../config/aws/organisationsAccess");
|
|
13
|
+
class ManagedOrganisation extends aws_cdk_lib_1.Stack {
|
|
14
|
+
constructor(id, props) {
|
|
15
|
+
super(app_1.default.getInstance(), id, props);
|
|
16
|
+
this.createOrganisation(props);
|
|
17
|
+
this.setupOrganisationFeatures({
|
|
18
|
+
...props,
|
|
19
|
+
identityCenter: props.identityCenter ?? true
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
createOrganisation(props) {
|
|
23
|
+
this.organisation = new organisation_1.default(this, "ManagedOrganisation", {
|
|
24
|
+
organisationName: props.organisationName,
|
|
25
|
+
accounts: props.accounts,
|
|
26
|
+
orgEmail: props.orgEmail,
|
|
27
|
+
env: props.env,
|
|
28
|
+
existingAccounts: props.existingAccounts
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
setupOrganisationFeatures(props) {
|
|
32
|
+
const orgAccounts = this.organisation.getAccounts();
|
|
33
|
+
const platformAccountId = this.getPlatformAccountId(orgAccounts, props);
|
|
34
|
+
this.setupIpamDelegation(platformAccountId);
|
|
35
|
+
this.enableRamSharing();
|
|
36
|
+
this.enableTrustedAccess(props);
|
|
37
|
+
this.enableCostAllocationTags(props);
|
|
38
|
+
this.setupIdentityCenter(orgAccounts, props);
|
|
39
|
+
this.setupBackupGlobalSettings(props);
|
|
40
|
+
}
|
|
41
|
+
getPlatformAccountId(orgAccounts, props) {
|
|
42
|
+
const platformEntry = Object.entries(props.accounts).find(([key]) => key.toLowerCase() === "platform");
|
|
43
|
+
if (!platformEntry) {
|
|
44
|
+
throw new Error('No platform account found. Please include a "platform" key in your accounts configuration.');
|
|
45
|
+
}
|
|
46
|
+
const account = platformEntry[1];
|
|
47
|
+
const platformAccount = Array.isArray(account) ? account[0] : account;
|
|
48
|
+
const platformAccountId = orgAccounts[platformAccount];
|
|
49
|
+
if (!platformAccountId) {
|
|
50
|
+
throw new Error(`Platform account ID not found for account name: ${platformAccount}`);
|
|
51
|
+
}
|
|
52
|
+
return platformAccountId;
|
|
53
|
+
}
|
|
54
|
+
setupIpamDelegation(platformAccountId) {
|
|
55
|
+
new ipamDelegateAdmin_1.IpamDelegateAdmin(this, "IpamDelegateAdmin", {
|
|
56
|
+
accountId: platformAccountId
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
enableRamSharing() {
|
|
60
|
+
new ramSharing_1.RamSharing(this, "RamSharing");
|
|
61
|
+
}
|
|
62
|
+
enableTrustedAccess(props) {
|
|
63
|
+
new organisationsAccess_1.ActivateOrganisationsAccess(this, "ActivateOrganisationsAccess", {
|
|
64
|
+
account: props.env.account,
|
|
65
|
+
region: props.env.region
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
enableCostAllocationTags(props) {
|
|
69
|
+
if (props.costAllocationTags.length > 0) {
|
|
70
|
+
new costAllocationTags_1.CostAllocationTags(this, "CostAllocationTags", {
|
|
71
|
+
costAllocationTags: props.costAllocationTags
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
setupIdentityCenter(orgAccounts, props) {
|
|
76
|
+
if (props.identityCenter) {
|
|
77
|
+
new identityCenter_1.IdentityCenter(this, "IdentityCenter", {
|
|
78
|
+
accounts: orgAccounts
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
setupBackupGlobalSettings(props) {
|
|
83
|
+
const defaultSettings = {
|
|
84
|
+
enableCrossAccountBackup: true,
|
|
85
|
+
enableDelegatedAdministrator: true,
|
|
86
|
+
enableMpa: false
|
|
87
|
+
};
|
|
88
|
+
const settings = { ...defaultSettings, ...props.backupSettings };
|
|
89
|
+
new backupGlobalSettings_1.BackupGlobalSettings(this, "BackupGlobalSettings", {
|
|
90
|
+
account: props.env.account,
|
|
91
|
+
region: props.env.region,
|
|
92
|
+
...settings
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.ManagedOrganisation = ManagedOrganisation;
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZE9yZ2FuaXNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvbWFuYWdlZE9yZ2FuaXNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUU7QUFFdkUsbUNBQTRCO0FBRTVCLGdGQUE2RTtBQUM3RSxvRUFBaUU7QUFDakUsMEVBQXVFO0FBQ3ZFLDREQUF5RDtBQUN6RCw0RUFHNkM7QUFDN0MsZ0VBQXlEO0FBRXpELDhFQUFtRjtBQXlCbkYsTUFBYSxtQkFBb0IsU0FBUSxtQkFBSztJQUc1QyxZQUFZLEVBQVUsRUFBRSxLQUErQjtRQUNyRCxLQUFLLENBQUMsYUFBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1lBQzdCLEdBQUcsS0FBSztZQUNSLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxJQUFJLElBQUk7U0FDN0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQStCO1FBQ3hELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxzQkFBWSxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRTtZQUNoRSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQ3hDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtTQUN6QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8seUJBQXlCLENBQUMsS0FBK0I7UUFDL0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztR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Q0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxlQUFlLEVBQUUsR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFakUsSUFBSSwyQ0FBb0IsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7WUFDckQsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTztZQUMxQixNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNO1lBQ3hCLEdBQUcsUUFBUTtTQUNaLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWpIRCxrREFpSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEVudmlyb25tZW50LCBTdGFjaywgdHlwZSBTdGFja1Byb3BzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbmltcG9ydCBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuXG5pbXBvcnQgeyBCYWNrdXBHbG9iYWxTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9jb25maWcvYXdzL2JhY2t1cEdsb2JhbFNldHRpbmdzXCI7XG5pbXBvcnQgeyBJZGVudGl0eUNlbnRlciB9IGZyb20gXCIuLi8uLi9jb25maWcvYXdzL2lkZW50aXR5Q2VudGVyXCI7XG5pbXBvcnQgeyBJcGFtRGVsZWdhdGVBZG1pbiB9IGZyb20gXCIuLi8uLi9jb25maWcvYXdzL2lwYW1EZWxlZ2F0ZUFkbWluXCI7XG5pbXBvcnQgeyBSYW1TaGFyaW5nIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvcmFtU2hhcmluZ1wiO1xuaW1wb3J0IHtcbiAgQ29zdEFsbG9jYXRpb25UYWdzLFxuICB0eXBlIElDb3N0QWxsb2NhdGlvblRhZ3Ncbn0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvY29zdEFsbG9jYXRpb25UYWdzXCI7XG5pbXBvcnQgT3JnYW5pc2F0aW9uIGZyb20gXCIuLi8uLi9jb25maWcvYXdzL29yZ2FuaXNhdGlvblwiO1xuaW1wb3J0IHsgdHlwZSBBY2NvdW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1vcmdhbml6YXRpb25zXCI7XG5pbXBvcnQgeyBBY3RpdmF0ZU9yZ2FuaXNhdGlvbnNBY2Nlc3MgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2F3cy9vcmdhbmlzYXRpb25zQWNjZXNzXCI7XG5cbnR5cGUgRXh0ZW5kZWRTdGFja1Byb3BzID0gT21pdDxTdGFja1Byb3BzLCBcImVudlwiPiAmIHtcbiAgZW52OiBSZXF1aXJlZDxQaWNrPEVudmlyb25tZW50LCBcInJlZ2lvblwiIHwgXCJhY2NvdW50XCI+PiAmXG4gICAgUGFydGlhbDxPbWl0PEVudmlyb25tZW50LCBcInJlZ2lvblwiIHwgXCJhY2NvdW50XCI+Pjtcbn07XG5cbnR5cGUgQWNjb3VudHNDb25maWcgPSB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHJlYWRvbmx5IHN0cmluZ1tdIHwgc3RyaW5nO1xufTtcblxuaW50ZXJmYWNlIE1hbmFnZWRPcmdhbmlzYXRpb25Qcm9wcyBleHRlbmRzIEV4dGVuZGVkU3RhY2tQcm9wcyB7XG4gIG9yZ2FuaXNhdGlvbk5hbWU6IHN0cmluZztcbiAgYWNjb3VudHM6IEFjY291bnRzQ29uZmlnO1xuICBvcmdFbWFpbDogc3RyaW5nO1xuICBleGlzdGluZ0FjY291bnRzPzogQWNjb3VudFtdO1xuICBjb3N0QWxsb2NhdGlvblRhZ3M6IElDb3N0QWxsb2NhdGlvblRhZ3NbXTtcbiAgaWRlbnRpdHlDZW50ZXI/OiBib29sZWFuO1xuICBiYWNrdXBTZXR0aW5ncz86IHtcbiAgICBlbmFibGVDcm9zc0FjY291bnRCYWNrdXA/OiBib29sZWFuO1xuICAgIGVuYWJsZURlbGVnYXRlZEFkbWluaXN0cmF0b3I/OiBib29sZWFuO1xuICAgIGVuYWJsZU1wYT86IGJvb2xlYW47XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkT3JnYW5pc2F0aW9uIGV4dGVuZHMgU3RhY2sge1xuICBwcml2YXRlIG9yZ2FuaXNhdGlvbjogT3JnYW5pc2F0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIHByb3BzOiBNYW5hZ2VkT3JnYW5pc2F0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihBcHAuZ2V0SW5zdGFuY2UoKSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLmNyZWF0ZU9yZ2FuaXNhdGlvbihwcm9wcyk7XG4gICAgdGhpcy5zZXR1cE9yZ2FuaXNhdGlvbkZlYXR1cmVzKHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgaWRlbnRpdHlDZW50ZXI6IHByb3BzLmlkZW50aXR5Q2VudGVyID8/IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT3JnYW5pc2F0aW9uKHByb3BzOiBNYW5hZ2VkT3JnYW5pc2F0aW9uUHJvcHMpIHtcbiAgICB0aGlzLm9yZ2FuaXNhdGlvbiA9IG5ldyBPcmdhbmlzYXRpb24odGhpcywgXCJNYW5hZ2VkT3JnYW5pc2F0aW9uXCIsIHtcbiAgICAgIG9yZ2FuaXNhdGlvbk5hbWU6IHByb3BzLm9yZ2FuaXNhdGlvbk5hbWUsXG4gICAgICBhY2NvdW50czogcHJvcHMuYWNjb3VudHMsXG4gICAgICBvcmdFbWFpbDogcHJvcHMub3JnRW1haWwsXG4gICAgICBlbnY6IHByb3BzLmVudixcbiAgICAgIGV4aXN0aW5nQWNjb3VudHM6IHByb3BzLmV4aXN0aW5nQWNjb3VudHNcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBPcmdhbmlzYXRpb25GZWF0dXJlcyhwcm9wczogTWFuYWdlZE9yZ2FuaXNhdGlvblByb3BzKSB7XG4gICAgY29uc3Qgb3JnQWNjb3VudHMgPSB0aGlzLm9yZ2FuaXNhdGlvbi5nZXRBY2NvdW50cygpO1xuICAgIGNvbnN0IHBsYXRmb3JtQWNjb3VudElkID0gdGhpcy5nZXRQbGF0Zm9ybUFjY291bnRJZChvcmdBY2NvdW50cywgcHJvcHMpO1xuXG4gICAgdGhpcy5zZXR1cElwYW1EZWxlZ2F0aW9uKHBsYXRmb3JtQWNjb3VudElkKTtcbiAgICB0aGlzLmVuYWJsZVJhbVNoYXJpbmcoKTtcbiAgICB0aGlzLmVuYWJsZVRydXN0ZWRBY2Nlc3MocHJvcHMpO1xuICAgIHRoaXMuZW5hYmxlQ29zdEFsbG9jYXRpb25UYWdzKHByb3BzKTtcbiAgICB0aGlzLnNldHVwSWRlbnRpdHlDZW50ZXIob3JnQWNjb3VudHMsIHByb3BzKTtcbiAgICB0aGlzLnNldHVwQmFja3VwR2xvYmFsU2V0dGluZ3MocHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQbGF0Zm9ybUFjY291bnRJZChcbiAgICBvcmdBY2NvdW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBwcm9wczogTWFuYWdlZE9yZ2FuaXNhdGlvblByb3BzXG4gICkge1xuICAgIGNvbnN0IHBsYXRmb3JtRW50cnkgPSBPYmplY3QuZW50cmllcyhwcm9wcy5hY2NvdW50cykuZmluZChcbiAgICAgIChba2V5XSkgPT4ga2V5LnRvTG93ZXJDYXNlKCkgPT09IFwicGxhdGZvcm1cIlxuICAgICk7XG5cbiAgICBpZiAoIXBsYXRmb3JtRW50cnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ05vIHBsYXRmb3JtIGFjY291bnQgZm91bmQuIFBsZWFzZSBpbmNsdWRlIGEgXCJwbGF0Zm9ybVwiIGtleSBpbiB5b3VyIGFjY291bnRzIGNvbmZpZ3VyYXRpb24uJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY2NvdW50ID0gcGxhdGZvcm1FbnRyeVsxXTtcbiAgICBjb25zdCBwbGF0Zm9ybUFjY291bnQgPSBBcnJheS5pc0FycmF5KGFjY291bnQpID8gYWNjb3VudFswXSA6IGFjY291bnQ7XG5cbiAgICBjb25zdCBwbGF0Zm9ybUFjY291bnRJZCA9IG9yZ0FjY291bnRzW3BsYXRmb3JtQWNjb3VudF07XG5cbiAgICBpZiAoIXBsYXRmb3JtQWNjb3VudElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQbGF0Zm9ybSBhY2NvdW50IElEIG5vdCBmb3VuZCBmb3IgYWNjb3VudCBuYW1lOiAke3BsYXRmb3JtQWNjb3VudH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBwbGF0Zm9ybUFjY291bnRJZDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBJcGFtRGVsZWdhdGlvbihwbGF0Zm9ybUFjY291bnRJZDogc3RyaW5nKSB7XG4gICAgbmV3IElwYW1EZWxlZ2F0ZUFkbWluKHRoaXMsIFwiSXBhbURlbGVnYXRlQWRtaW5cIiwge1xuICAgICAgYWNjb3VudElkOiBwbGF0Zm9ybUFjY291bnRJZFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVSYW1TaGFyaW5nKCkge1xuICAgIG5ldyBSYW1TaGFyaW5nKHRoaXMsIFwiUmFtU2hhcmluZ1wiKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlVHJ1c3RlZEFjY2Vzcyhwcm9wczogTWFuYWdlZE9yZ2FuaXNhdGlvblByb3BzKSB7XG4gICAgbmV3IEFjdGl2YXRlT3JnYW5pc2F0aW9uc0FjY2Vzcyh0aGlzLCBcIkFjdGl2YXRlT3JnYW5pc2F0aW9uc0FjY2Vzc1wiLCB7XG4gICAgICBhY2NvdW50OiBwcm9wcy5lbnYuYWNjb3VudCxcbiAgICAgIHJlZ2lvbjogcHJvcHMuZW52LnJlZ2lvblxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVDb3N0QWxsb2NhdGlvblRhZ3MocHJvcHM6IE1hbmFnZWRPcmdhbmlzYXRpb25Qcm9wcykge1xuICAgIGlmIChwcm9wcy5jb3N0QWxsb2NhdGlvblRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbmV3IENvc3RBbGxvY2F0aW9uVGFncyh0aGlzLCBcIkNvc3RBbGxvY2F0aW9uVGFnc1wiLCB7XG4gICAgICAgIGNvc3RBbGxvY2F0aW9uVGFnczogcHJvcHMuY29zdEFsbG9jYXRpb25UYWdzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwSWRlbnRpdHlDZW50ZXIoXG4gICAgb3JnQWNjb3VudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgcHJvcHM6IE1hbmFnZWRPcmdhbmlzYXRpb25Qcm9wc1xuICApIHtcbiAgICBpZiAocHJvcHMuaWRlbnRpdHlDZW50ZXIpIHtcbiAgICAgIG5ldyBJZGVudGl0eUNlbnRlcih0aGlzLCBcIklkZW50aXR5Q2VudGVyXCIsIHtcbiAgICAgICAgYWNjb3VudHM6IG9yZ0FjY291bnRzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwQmFja3VwR2xvYmFsU2V0dGluZ3MocHJvcHM6IE1hbmFnZWRPcmdhbmlzYXRpb25Qcm9wcykge1xuICAgIGNvbnN0IGRlZmF1bHRTZXR0aW5ncyA9IHtcbiAgICAgIGVuYWJsZUNyb3NzQWNjb3VudEJhY2t1cDogdHJ1ZSxcbiAgICAgIGVuYWJsZURlbGVnYXRlZEFkbWluaXN0cmF0b3I6IHRydWUsXG4gICAgICBlbmFibGVNcGE6IGZhbHNlXG4gICAgfTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geyAuLi5kZWZhdWx0U2V0dGluZ3MsIC4uLnByb3BzLmJhY2t1cFNldHRpbmdzIH07XG5cbiAgICBuZXcgQmFja3VwR2xvYmFsU2V0dGluZ3ModGhpcywgXCJCYWNrdXBHbG9iYWxTZXR0aW5nc1wiLCB7XG4gICAgICBhY2NvdW50OiBwcm9wcy5lbnYuYWNjb3VudCxcbiAgICAgIHJlZ2lvbjogcHJvcHMuZW52LnJlZ2lvbixcbiAgICAgIC4uLnNldHRpbmdzXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Construct } from "constructs";
|
|
2
|
+
import { ManagedAccount, type ManagedAccountProps } from "./managedAccount";
|
|
3
|
+
type AccountsConfig = {
|
|
4
|
+
readonly [key: string]: readonly string[] | string;
|
|
5
|
+
};
|
|
6
|
+
interface ManagedPlatformProps extends ManagedAccountProps {
|
|
7
|
+
accounts: AccountsConfig;
|
|
8
|
+
}
|
|
9
|
+
export declare class ManagedPlatform extends ManagedAccount {
|
|
10
|
+
constructor(scope: Construct, id: string, props: ManagedPlatformProps);
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ManagedPlatform = void 0;
|
|
4
|
+
const ipam_1 = require("../../config/aws/ipam");
|
|
5
|
+
const ipamPool_1 = require("../../resources/aws/networking/ipamPool");
|
|
6
|
+
const managedAccount_1 = require("./managedAccount");
|
|
7
|
+
const getConfig_1 = require("../../utils/getConfig");
|
|
8
|
+
class ManagedPlatform extends managedAccount_1.ManagedAccount {
|
|
9
|
+
constructor(scope, id, props) {
|
|
10
|
+
super(scope, id, props);
|
|
11
|
+
// Get all configured regions
|
|
12
|
+
const config = (0, getConfig_1.getConfig)();
|
|
13
|
+
const allRegions = config.allRegions.length > 0 ? config.allRegions : [props.region]; // Fallback to at least the deployment region
|
|
14
|
+
// Create IPAM with all regions configured
|
|
15
|
+
const ipam = new ipam_1.Ipam(this, "Ipam", {
|
|
16
|
+
regions: allRegions
|
|
17
|
+
});
|
|
18
|
+
// Convert accounts to flat array for IpamPool
|
|
19
|
+
const orgAccounts = Object.values(props.accounts).flatMap((account) => Array.isArray(account) ? account : [account]);
|
|
20
|
+
// Create IPAM pool hierarchy for all regions
|
|
21
|
+
new ipamPool_1.IpamPool(this, "IpamPool", {
|
|
22
|
+
orgAccounts,
|
|
23
|
+
regions: allRegions,
|
|
24
|
+
ipamScope: ipam.privateDefaultScopeId
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.ManagedPlatform = ManagedPlatform;
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZFBsYXRmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9tYW5hZ2VkUGxhdGZvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQTZDO0FBQzdDLHNFQUFtRTtBQUVuRSxxREFBNEU7QUFDNUUscURBQWtEO0FBVWxELE1BQWEsZUFBZ0IsU0FBUSwrQkFBYztJQUNqRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCO1FBQ25FLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLDZCQUE2QjtRQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFTLEdBQUUsQ0FBQztRQUMzQixNQUFNLFVBQVUsR0FDZCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsNkNBQTZDO1FBRWxILDBDQUEwQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO1lBQ2xDLE9BQU8sRUFBRSxVQUFVO1NBQ3BCLENBQUMsQ0FBQztRQUVILDhDQUE4QztRQUM5QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNwRSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQzdDLENBQUM7UUFFRiw2Q0FBNkM7UUFDN0MsSUFBSSxtQkFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDN0IsV0FBVztZQUNYLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMscUJBQXFCO1NBQ3RDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTFCRCwwQ0EwQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJcGFtIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvaXBhbVwiO1xuaW1wb3J0IHsgSXBhbVBvb2wgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9uZXR3b3JraW5nL2lwYW1Qb29sXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBNYW5hZ2VkQWNjb3VudCwgdHlwZSBNYW5hZ2VkQWNjb3VudFByb3BzIH0gZnJvbSBcIi4vbWFuYWdlZEFjY291bnRcIjtcbmltcG9ydCB7IGdldENvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy9nZXRDb25maWdcIjtcblxudHlwZSBBY2NvdW50c0NvbmZpZyA9IHtcbiAgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogcmVhZG9ubHkgc3RyaW5nW10gfCBzdHJpbmc7XG59O1xuXG5pbnRlcmZhY2UgTWFuYWdlZFBsYXRmb3JtUHJvcHMgZXh0ZW5kcyBNYW5hZ2VkQWNjb3VudFByb3BzIHtcbiAgYWNjb3VudHM6IEFjY291bnRzQ29uZmlnO1xufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZFBsYXRmb3JtIGV4dGVuZHMgTWFuYWdlZEFjY291bnQge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTWFuYWdlZFBsYXRmb3JtUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIC8vIEdldCBhbGwgY29uZmlndXJlZCByZWdpb25zXG4gICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgYWxsUmVnaW9ucyA9XG4gICAgICBjb25maWcuYWxsUmVnaW9ucy5sZW5ndGggPiAwID8gY29uZmlnLmFsbFJlZ2lvbnMgOiBbcHJvcHMucmVnaW9uXTsgLy8gRmFsbGJhY2sgdG8gYXQgbGVhc3QgdGhlIGRlcGxveW1lbnQgcmVnaW9uXG5cbiAgICAvLyBDcmVhdGUgSVBBTSB3aXRoIGFsbCByZWdpb25zIGNvbmZpZ3VyZWRcbiAgICBjb25zdCBpcGFtID0gbmV3IElwYW0odGhpcywgXCJJcGFtXCIsIHtcbiAgICAgIHJlZ2lvbnM6IGFsbFJlZ2lvbnNcbiAgICB9KTtcblxuICAgIC8vIENvbnZlcnQgYWNjb3VudHMgdG8gZmxhdCBhcnJheSBmb3IgSXBhbVBvb2xcbiAgICBjb25zdCBvcmdBY2NvdW50cyA9IE9iamVjdC52YWx1ZXMocHJvcHMuYWNjb3VudHMpLmZsYXRNYXAoKGFjY291bnQpID0+XG4gICAgICBBcnJheS5pc0FycmF5KGFjY291bnQpID8gYWNjb3VudCA6IFthY2NvdW50XVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgSVBBTSBwb29sIGhpZXJhcmNoeSBmb3IgYWxsIHJlZ2lvbnNcbiAgICBuZXcgSXBhbVBvb2wodGhpcywgXCJJcGFtUG9vbFwiLCB7XG4gICAgICBvcmdBY2NvdW50cyxcbiAgICAgIHJlZ2lvbnM6IGFsbFJlZ2lvbnMsXG4gICAgICBpcGFtU2NvcGU6IGlwYW0ucHJpdmF0ZURlZmF1bHRTY29wZUlkXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -31,9 +31,19 @@
|
|
|
31
31
|
* payload.getServer().getLambdaFunction().addEnvironment("CUSTOM", "value");
|
|
32
32
|
*/
|
|
33
33
|
import { type Construct } from "constructs";
|
|
34
|
+
import { type PatternStackPlacement } from "@fjall/util";
|
|
34
35
|
import type App from "../../app.js";
|
|
35
36
|
import { Payload } from "./payload.js";
|
|
36
|
-
import {
|
|
37
|
+
import { StaticSite } from "./staticSite.js";
|
|
38
|
+
import { type IPayloadProps, type IStaticSiteProps, type IPatternProps, type AnyPattern } from "./interfaces/pattern.js";
|
|
39
|
+
/**
|
|
40
|
+
* A pattern factory thunk. Carries a `stackPlacement` so `addPattern` can route
|
|
41
|
+
* the pattern node to the CDN stack (static site — no VPC or compute) rather
|
|
42
|
+
* than the compute stack (payload). Mirrors `StorageFactoryFn`.
|
|
43
|
+
*/
|
|
44
|
+
export type PatternFactoryFn<T extends AnyPattern = AnyPattern> = ((app: App, scope: Construct) => T) & {
|
|
45
|
+
stackPlacement?: PatternStackPlacement;
|
|
46
|
+
};
|
|
37
47
|
/**
|
|
38
48
|
* Factory for creating high-level infrastructure patterns.
|
|
39
49
|
*
|
|
@@ -56,12 +66,17 @@ export declare class PatternFactory {
|
|
|
56
66
|
* @param props - Payload pattern configuration
|
|
57
67
|
* @returns Factory function to create the pattern
|
|
58
68
|
*/
|
|
59
|
-
static build(id: string, props: IPayloadProps):
|
|
69
|
+
static build(id: string, props: IPayloadProps): PatternFactoryFn<Payload>;
|
|
70
|
+
/**
|
|
71
|
+
* Build a static-site pattern (private S3 + CloudFront/OAC, optional forms).
|
|
72
|
+
*/
|
|
73
|
+
static build(id: string, props: IStaticSiteProps): PatternFactoryFn<StaticSite>;
|
|
60
74
|
/**
|
|
61
75
|
* Generic build method (implementation signature).
|
|
62
76
|
*/
|
|
63
|
-
static build(id: string, props: IPatternProps):
|
|
77
|
+
static build(id: string, props: IPatternProps): PatternFactoryFn;
|
|
64
78
|
}
|
|
65
79
|
export { Payload };
|
|
66
|
-
export
|
|
67
|
-
export {
|
|
80
|
+
export { StaticSite };
|
|
81
|
+
export type { IPayloadProps, IStaticSiteProps, IPatternProps, PatternType, AnyPattern, IPayload, IStaticSite, PayloadDatabaseConfig, PayloadComputeConfig, PayloadCdnConfig, StaticSiteBuildConfig, StaticSiteSecurityConfig, StaticSiteFormsConfig, StaticSiteCdnConfig } from "./interfaces/pattern.js";
|
|
82
|
+
export { isPayloadPattern, isStaticSitePattern, isPattern } from "./interfaces/pattern.js";
|
|
@@ -30,7 +30,9 @@
|
|
|
30
30
|
* payload.getDatabase().grantConnect(otherLambda);
|
|
31
31
|
* payload.getServer().getLambdaFunction().addEnvironment("CUSTOM", "value");
|
|
32
32
|
*/
|
|
33
|
+
import { PATTERN_REGISTRY } from "@fjall/util";
|
|
33
34
|
import { Payload } from "./payload.js";
|
|
35
|
+
import { StaticSite } from "./staticSite.js";
|
|
34
36
|
/**
|
|
35
37
|
* Factory for creating high-level infrastructure patterns.
|
|
36
38
|
*
|
|
@@ -43,21 +45,25 @@ export class PatternFactory {
|
|
|
43
45
|
* Routes to specific pattern implementations based on type discriminator.
|
|
44
46
|
*/
|
|
45
47
|
static build(id, props) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
switch (type) {
|
|
48
|
+
const fn = (app, scope) => {
|
|
49
|
+
switch (props.type) {
|
|
49
50
|
case "payload":
|
|
50
51
|
return new Payload(scope, id, app, props);
|
|
52
|
+
case "staticsite":
|
|
53
|
+
return new StaticSite(scope, id, app, props);
|
|
51
54
|
default: {
|
|
52
55
|
// Exhaustive check ensures all pattern types are handled
|
|
53
|
-
const _exhaustive =
|
|
54
|
-
throw new Error(`Unsupported pattern type: ${String(_exhaustive)}`);
|
|
56
|
+
const _exhaustive = props;
|
|
57
|
+
throw new Error(`Unsupported pattern type: ${String(_exhaustive.type)}`);
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
60
|
};
|
|
61
|
+
fn.stackPlacement = PATTERN_REGISTRY[props.type].stackPlacement;
|
|
62
|
+
return fn;
|
|
58
63
|
}
|
|
59
64
|
}
|
|
60
65
|
// Re-export types for convenience
|
|
61
66
|
export { Payload };
|
|
67
|
+
export { StaticSite };
|
|
62
68
|
// Re-export type guards
|
|
63
|
-
export { isPayloadPattern, isPattern } from "./interfaces/pattern.js";
|
|
69
|
+
export { isPayloadPattern, isStaticSitePattern, isPattern } from "./interfaces/pattern.js";
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static-site Pattern.
|
|
3
|
+
*
|
|
4
|
+
* Serves a pre-built folder of files from a private S3 bucket behind CloudFront
|
|
5
|
+
* (OAC), with clean URLs, security headers, an optional custom domain, and an
|
|
6
|
+
* optional contact-form endpoint (Lambda Function URL → SES, CloudFront-fronted).
|
|
7
|
+
*
|
|
8
|
+
* Resources created:
|
|
9
|
+
* - Private S3 bucket + BucketDeployment (asset upload)
|
|
10
|
+
* - CloudFront distribution (OAC, clean-URL function, security-headers policy)
|
|
11
|
+
* - ACM certificate + Route53 alias record (when `domain` is set)
|
|
12
|
+
* - Contact-form Lambda + Function URL (when `forms` is set)
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* const site = app.addPattern(PatternFactory.build("LbexcSite", {
|
|
16
|
+
* type: "staticsite",
|
|
17
|
+
* name: "lbexc",
|
|
18
|
+
* source: "../../lbexc-static-export",
|
|
19
|
+
* build: { command: "npm run build", outputDir: "out" },
|
|
20
|
+
* routing: "multipage",
|
|
21
|
+
* security: { headers: true },
|
|
22
|
+
* domain: "lbexc.com",
|
|
23
|
+
* forms: { to: "hello@lbexc.com", corsOrigin: "https://lbexc.com" }
|
|
24
|
+
* }));
|
|
25
|
+
*/
|
|
26
|
+
import { Construct } from "constructs";
|
|
27
|
+
import type App from "../../app.js";
|
|
28
|
+
import { type IStaticSiteProps, type IStaticSite } from "./interfaces/pattern.js";
|
|
29
|
+
import { type Storage } from "./storage.js";
|
|
30
|
+
import { type Cdn } from "./cdn.js";
|
|
31
|
+
import { LambdaFunction } from "../../resources/aws/compute/index.js";
|
|
32
|
+
/**
|
|
33
|
+
* Static-site pattern implementation.
|
|
34
|
+
*/
|
|
35
|
+
export declare class StaticSite extends Construct implements IStaticSite {
|
|
36
|
+
readonly patternType: "staticsite";
|
|
37
|
+
private readonly app;
|
|
38
|
+
private readonly props;
|
|
39
|
+
private readonly pascalName;
|
|
40
|
+
private _bucket;
|
|
41
|
+
private _cdn;
|
|
42
|
+
private _formsFunction?;
|
|
43
|
+
private _headersPolicy?;
|
|
44
|
+
private _resolvedDomain;
|
|
45
|
+
constructor(scope: Construct, id: string, app: App, props: IStaticSiteProps);
|
|
46
|
+
private registerManifest;
|
|
47
|
+
private validateProps;
|
|
48
|
+
private createBucketAndDeployment;
|
|
49
|
+
private createFormsEndpoint;
|
|
50
|
+
private createCdn;
|
|
51
|
+
private buildBehaviours;
|
|
52
|
+
private resolveDomainConfig;
|
|
53
|
+
private resolveSimpleDomain;
|
|
54
|
+
private createDnsRecord;
|
|
55
|
+
private exportPatternOutputs;
|
|
56
|
+
getBucket(): Storage;
|
|
57
|
+
getCdn(): Cdn;
|
|
58
|
+
getFormsFunction(): LambdaFunction | undefined;
|
|
59
|
+
}
|