@fjall/components-infrastructure 0.11.0 → 0.12.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.
Files changed (37) hide show
  1. package/dist/lib/config/aws/bootstrap.d.ts +12 -0
  2. package/dist/lib/config/aws/bootstrap.js +72 -0
  3. package/dist/lib/config/aws/bootstrap.original.d.ts +13 -0
  4. package/dist/lib/config/aws/bootstrap.original.js +94 -0
  5. package/dist/lib/config/aws/bootstrapAccounts.d.ts +12 -0
  6. package/dist/lib/config/aws/bootstrapAccounts.js +89 -0
  7. package/dist/lib/config/aws/bootstrapMultiRegion.example.d.ts +15 -0
  8. package/dist/lib/config/aws/bootstrapMultiRegion.example.js +105 -0
  9. package/dist/lib/config/aws/bootstrapSelfManaged.example.d.ts +13 -0
  10. package/dist/lib/config/aws/bootstrapSelfManaged.example.js +56 -0
  11. package/dist/lib/config/aws/managedAccountStackSet.d.ts +16 -0
  12. package/dist/lib/config/aws/managedAccountStackSet.js +75 -0
  13. package/dist/lib/config/aws/managedPlatformStackSet.d.ts +24 -0
  14. package/dist/lib/config/aws/managedPlatformStackSet.js +101 -0
  15. package/dist/lib/config/aws/organisation.d.ts +4 -2
  16. package/dist/lib/config/aws/organisation.js +21 -37
  17. package/dist/lib/patterns/aws/managedAccount.d.ts +0 -3
  18. package/dist/lib/patterns/aws/managedAccount.js +1 -10
  19. package/dist/lib/patterns/aws/managedAccountStackSet.d.ts +11 -0
  20. package/dist/lib/patterns/aws/managedAccountStackSet.js +36 -0
  21. package/dist/lib/patterns/aws/managedIdentityCenter.js +2 -2
  22. package/dist/lib/patterns/aws/managedOrganisation.d.ts +6 -3
  23. package/dist/lib/patterns/aws/managedOrganisation.js +39 -15
  24. package/dist/lib/patterns/aws/managedPlatform.d.ts +4 -4
  25. package/dist/lib/patterns/aws/managedPlatform.js +4 -5
  26. package/dist/lib/patterns/aws/managedPlatformStackSet.d.ts +17 -0
  27. package/dist/lib/patterns/aws/managedPlatformStackSet.js +45 -0
  28. package/dist/lib/resources/aws/iam/identityCenter/assignmentNew.d.ts +11 -0
  29. package/dist/lib/resources/aws/iam/identityCenter/assignmentNew.js +102 -0
  30. package/dist/lib/resources/aws/iam/identityCenter/lambda/assignmentHandler.d.ts +24 -0
  31. package/dist/lib/resources/aws/iam/identityCenter/lambda/assignmentHandler.js +246 -0
  32. package/dist/lib/utils/getAsync.js +2 -4
  33. package/dist/lib/utils/getCidr.js +2 -4
  34. package/dist/lib/utils/getConfig.js +2 -2
  35. package/package.json +3 -3
  36. package/dist/lib/patterns/aws/ec2.d.ts +0 -43
  37. package/dist/lib/patterns/aws/ec2.js +0 -123
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeployManagedAccounts = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const constructs_1 = require("constructs");
6
+ const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
7
+ const path = require("path");
8
+ const managedAccountStackSet_1 = require("../../patterns/aws/managedAccountStackSet");
9
+ /**
10
+ * Deploys the ManagedAccount stack to all accounts in the specified organizational units
11
+ * using AWS CloudFormation StackSets.
12
+ */
13
+ class DeployManagedAccounts extends constructs_1.Construct {
14
+ constructor(scope, id, props) {
15
+ super(scope, id);
16
+ const stack = aws_cdk_lib_1.Stack.of(this);
17
+ // Create a temporary app to synthesize the ManagedAccount template
18
+ const tempApp = new aws_cdk_lib_1.App();
19
+ const managedAccountStack = new managedAccountStackSet_1.ManagedAccountStackSet(tempApp, "ManagedAccountTemplate");
20
+ const assembly = tempApp.synth();
21
+ // Get the synthesized template
22
+ const templateArtifact = assembly.getStackArtifact(managedAccountStack.artifactId);
23
+ const templatePath = templateArtifact.templateFullPath;
24
+ // Deploy the template to the S3 bucket
25
+ new aws_s3_deployment_1.BucketDeployment(this, "DeployManagedAccountTemplate", {
26
+ sources: [aws_s3_deployment_1.Source.asset(path.dirname(templatePath))],
27
+ destinationBucket: props.templateBucket,
28
+ destinationKeyPrefix: "managed-account",
29
+ retainOnDelete: false
30
+ });
31
+ // Use region-agnostic S3 URL format
32
+ const templateURL = `https://${props.templateBucket.bucketName}.s3.amazonaws.com/managed-account/${path.basename(templatePath)}`;
33
+ new aws_cdk_lib_1.CfnStackSet(this, "ManagedAccountStackSet", {
34
+ permissionModel: "SERVICE_MANAGED",
35
+ stackSetName: `ManagedAccount-${stack.stackName}`,
36
+ description: "ManagedAccount StackSet for organization accounts",
37
+ capabilities: [
38
+ "CAPABILITY_IAM",
39
+ "CAPABILITY_NAMED_IAM",
40
+ "CAPABILITY_AUTO_EXPAND"
41
+ ],
42
+ templateUrl: templateURL,
43
+ autoDeployment: {
44
+ enabled: true,
45
+ retainStacksOnAccountRemoval: false
46
+ },
47
+ callAs: "DELEGATED_ADMIN",
48
+ operationPreferences: {
49
+ regionConcurrencyType: "PARALLEL",
50
+ maxConcurrentPercentage: 100,
51
+ failureTolerancePercentage: 10
52
+ },
53
+ stackInstancesGroup: [
54
+ {
55
+ deploymentTargets: {
56
+ organizationalUnitIds: props.organizationalUnitIds
57
+ },
58
+ regions: props.regions,
59
+ parameterOverrides: [
60
+ {
61
+ parameterKey: "AccountId",
62
+ parameterValue: "{{account}}"
63
+ },
64
+ {
65
+ parameterKey: "Region",
66
+ parameterValue: "{{region}}"
67
+ }
68
+ ]
69
+ }
70
+ ]
71
+ });
72
+ }
73
+ }
74
+ exports.DeployManagedAccounts = DeployManagedAccounts;
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZEFjY291bnRTdGFja1NldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9jb25maWcvYXdzL21hbmFnZWRBY2NvdW50U3RhY2tTZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXNEO0FBQ3RELDJDQUF1QztBQUV2QyxxRUFBeUU7QUFDekUsNkJBQTZCO0FBQzdCLHNGQUE2RztBQVM3Rzs7O0dBR0c7QUFDSCxNQUFhLHFCQUFzQixTQUFRLHNCQUFTO0lBQ2xELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUM7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLEtBQUssR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3QixtRUFBbUU7UUFDbkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxpQkFBRyxFQUFFLENBQUM7UUFDMUIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLCtDQUFzQixDQUNwRCxPQUFPLEVBQ1Asd0JBQXdCLENBQ3pCLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFakMsK0JBQStCO1FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUNoRCxtQkFBbUIsQ0FBQyxVQUFVLENBQy9CLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQztRQUV2RCx1Q0FBdUM7UUFDdkMsSUFBSSxvQ0FBZ0IsQ0FBQyxJQUFJLEVBQUUsOEJBQThCLEVBQUU7WUFDekQsT0FBTyxFQUFFLENBQUMsMEJBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ25ELGlCQUFpQixFQUFFLEtBQUssQ0FBQyxjQUFjO1lBQ3ZDLG9CQUFvQixFQUFFLGlCQUFpQjtZQUN2QyxjQUFjLEVBQUUsS0FBSztTQUN0QixDQUFDLENBQUM7UUFFSCxvQ0FBb0M7UUFDcEMsTUFBTSxXQUFXLEdBQUcsV0FDbEIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUN2QixxQ0FBcUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBRW5FLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7WUFDOUMsZUFBZSxFQUFFLGlCQUFpQjtZQUNsQyxZQUFZLEVBQUUsa0JBQWtCLEtBQUssQ0FBQyxTQUFTLEVBQUU7WUFDakQsV0FBVyxFQUFFLG1EQUFtRDtZQUNoRSxZQUFZLEVBQUU7Z0JBQ1osZ0JBQWdCO2dCQUNoQixzQkFBc0I7Z0JBQ3RCLHdCQUF3QjthQUN6QjtZQUNELFdBQVcsRUFBRSxXQUFXO1lBQ3hCLGNBQWMsRUFBRTtnQkFDZCxPQUFPLEVBQUUsSUFBSTtnQkFDYiw0QkFBNEIsRUFBRSxLQUFLO2FBQ3BDO1lBQ0QsTUFBTSxFQUFFLGlCQUFpQjtZQUN6QixvQkFBb0IsRUFBRTtnQkFDcEIscUJBQXFCLEVBQUUsVUFBVTtnQkFDakMsdUJBQXVCLEVBQUUsR0FBRztnQkFDNUIsMEJBQTBCLEVBQUUsRUFBRTthQUMvQjtZQUNELG1CQUFtQixFQUFFO2dCQUNuQjtvQkFDRSxpQkFBaUIsRUFBRTt3QkFDakIscUJBQXFCLEVBQUUsS0FBSyxDQUFDLHFCQUFxQjtxQkFDbkQ7b0JBQ0QsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO29CQUN0QixrQkFBa0IsRUFBRTt3QkFDbEI7NEJBQ0UsWUFBWSxFQUFFLFdBQVc7NEJBQ3pCLGNBQWMsRUFBRSxhQUFhO3lCQUM5Qjt3QkFDRDs0QkFDRSxZQUFZLEVBQUUsUUFBUTs0QkFDdEIsY0FBYyxFQUFFLFlBQVk7eUJBQzdCO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF6RUQsc0RBeUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIENmblN0YWNrU2V0LCBBcHAgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBTM0J1Y2tldCB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXNcIjtcbmltcG9ydCB7IEJ1Y2tldERlcGxveW1lbnQsIFNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgTWFuYWdlZEFjY291bnRTdGFja1NldCBhcyBNYW5hZ2VkQWNjb3VudFRlbXBsYXRlIH0gZnJvbSBcIi4uLy4uL3BhdHRlcm5zL2F3cy9tYW5hZ2VkQWNjb3VudFN0YWNrU2V0XCI7XG5cbmludGVyZmFjZSBEZXBsb3lNYW5hZ2VkQWNjb3VudHNQcm9wcyB7XG4gIHJlZ2lvbnM6IHN0cmluZ1tdO1xuICB0ZW1wbGF0ZUJ1Y2tldDogUzNCdWNrZXQ7XG4gIG9yZ2FuaXNhdGlvbklkOiBzdHJpbmc7XG4gIG9yZ2FuaXphdGlvbmFsVW5pdElkczogc3RyaW5nW107XG59XG5cbi8qKlxuICogRGVwbG95cyB0aGUgTWFuYWdlZEFjY291bnQgc3RhY2sgdG8gYWxsIGFjY291bnRzIGluIHRoZSBzcGVjaWZpZWQgb3JnYW5pemF0aW9uYWwgdW5pdHNcbiAqIHVzaW5nIEFXUyBDbG91ZEZvcm1hdGlvbiBTdGFja1NldHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBsb3lNYW5hZ2VkQWNjb3VudHMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRGVwbG95TWFuYWdlZEFjY291bnRzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZih0aGlzKTtcblxuICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBhcHAgdG8gc3ludGhlc2l6ZSB0aGUgTWFuYWdlZEFjY291bnQgdGVtcGxhdGVcbiAgICBjb25zdCB0ZW1wQXBwID0gbmV3IEFwcCgpO1xuICAgIGNvbnN0IG1hbmFnZWRBY2NvdW50U3RhY2sgPSBuZXcgTWFuYWdlZEFjY291bnRUZW1wbGF0ZShcbiAgICAgIHRlbXBBcHAsXG4gICAgICBcIk1hbmFnZWRBY2NvdW50VGVtcGxhdGVcIlxuICAgICk7XG4gICAgY29uc3QgYXNzZW1ibHkgPSB0ZW1wQXBwLnN5bnRoKCk7XG5cbiAgICAvLyBHZXQgdGhlIHN5bnRoZXNpemVkIHRlbXBsYXRlXG4gICAgY29uc3QgdGVtcGxhdGVBcnRpZmFjdCA9IGFzc2VtYmx5LmdldFN0YWNrQXJ0aWZhY3QoXG4gICAgICBtYW5hZ2VkQWNjb3VudFN0YWNrLmFydGlmYWN0SWRcbiAgICApO1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHRlbXBsYXRlQXJ0aWZhY3QudGVtcGxhdGVGdWxsUGF0aDtcblxuICAgIC8vIERlcGxveSB0aGUgdGVtcGxhdGUgdG8gdGhlIFMzIGJ1Y2tldFxuICAgIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMsIFwiRGVwbG95TWFuYWdlZEFjY291bnRUZW1wbGF0ZVwiLCB7XG4gICAgICBzb3VyY2VzOiBbU291cmNlLmFzc2V0KHBhdGguZGlybmFtZSh0ZW1wbGF0ZVBhdGgpKV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogcHJvcHMudGVtcGxhdGVCdWNrZXQsXG4gICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogXCJtYW5hZ2VkLWFjY291bnRcIixcbiAgICAgIHJldGFpbk9uRGVsZXRlOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgLy8gVXNlIHJlZ2lvbi1hZ25vc3RpYyBTMyBVUkwgZm9ybWF0XG4gICAgY29uc3QgdGVtcGxhdGVVUkwgPSBgaHR0cHM6Ly8ke1xuICAgICAgcHJvcHMudGVtcGxhdGVCdWNrZXQuYnVja2V0TmFtZVxuICAgIH0uczMuYW1hem9uYXdzLmNvbS9tYW5hZ2VkLWFjY291bnQvJHtwYXRoLmJhc2VuYW1lKHRlbXBsYXRlUGF0aCl9YDtcblxuICAgIG5ldyBDZm5TdGFja1NldCh0aGlzLCBcIk1hbmFnZWRBY2NvdW50U3RhY2tTZXRcIiwge1xuICAgICAgcGVybWlzc2lvbk1vZGVsOiBcIlNFUlZJQ0VfTUFOQUdFRFwiLFxuICAgICAgc3RhY2tTZXROYW1lOiBgTWFuYWdlZEFjY291bnQtJHtzdGFjay5zdGFja05hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk1hbmFnZWRBY2NvdW50IFN0YWNrU2V0IGZvciBvcmdhbml6YXRpb24gYWNjb3VudHNcIixcbiAgICAgIGNhcGFiaWxpdGllczogW1xuICAgICAgICBcIkNBUEFCSUxJVFlfSUFNXCIsXG4gICAgICAgIFwiQ0FQQUJJTElUWV9OQU1FRF9JQU1cIixcbiAgICAgICAgXCJDQVBBQklMSVRZX0FVVE9fRVhQQU5EXCJcbiAgICAgIF0sXG4gICAgICB0ZW1wbGF0ZVVybDogdGVtcGxhdGVVUkwsXG4gICAgICBhdXRvRGVwbG95bWVudDoge1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICByZXRhaW5TdGFja3NPbkFjY291bnRSZW1vdmFsOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIGNhbGxBczogXCJERUxFR0FURURfQURNSU5cIixcbiAgICAgIG9wZXJhdGlvblByZWZlcmVuY2VzOiB7XG4gICAgICAgIHJlZ2lvbkNvbmN1cnJlbmN5VHlwZTogXCJQQVJBTExFTFwiLFxuICAgICAgICBtYXhDb25jdXJyZW50UGVyY2VudGFnZTogMTAwLFxuICAgICAgICBmYWlsdXJlVG9sZXJhbmNlUGVyY2VudGFnZTogMTBcbiAgICAgIH0sXG4gICAgICBzdGFja0luc3RhbmNlc0dyb3VwOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBkZXBsb3ltZW50VGFyZ2V0czoge1xuICAgICAgICAgICAgb3JnYW5pemF0aW9uYWxVbml0SWRzOiBwcm9wcy5vcmdhbml6YXRpb25hbFVuaXRJZHNcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlZ2lvbnM6IHByb3BzLnJlZ2lvbnMsXG4gICAgICAgICAgcGFyYW1ldGVyT3ZlcnJpZGVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhcmFtZXRlcktleTogXCJBY2NvdW50SWRcIixcbiAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWU6IFwie3thY2NvdW50fX1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGFyYW1ldGVyS2V5OiBcIlJlZ2lvblwiLFxuICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZTogXCJ7e3JlZ2lvbn19XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,24 @@
1
+ import { Construct } from "constructs";
2
+ import { S3Bucket } from "../../resources";
3
+ interface DeployManagedPlatformProps {
4
+ regions: string[];
5
+ templateBucket: S3Bucket;
6
+ organisationId: string;
7
+ platformAccountId: string;
8
+ orgAccounts: string[];
9
+ }
10
+ /**
11
+ * Deploys the ManagedPlatform stack to the platform account only
12
+ * using AWS CloudFormation StackSets.
13
+ *
14
+ * Unlike ManagedAccount which deploys to all accounts, ManagedPlatform
15
+ * is only deployed to the designated platform account as it manages
16
+ * organization-wide resources like IPAM.
17
+ *
18
+ * Note: IPAM pools for individual accounts need to be created separately
19
+ * as they require concrete account names at synthesis time.
20
+ */
21
+ export declare class DeployManagedPlatform extends Construct {
22
+ constructor(scope: Construct, id: string, props: DeployManagedPlatformProps);
23
+ }
24
+ export {};
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeployManagedPlatform = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const constructs_1 = require("constructs");
6
+ const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
7
+ const path = require("path");
8
+ const fs = require("fs");
9
+ const os = require("os");
10
+ const managedPlatformStackSet_1 = require("../../patterns/aws/managedPlatformStackSet");
11
+ /**
12
+ * Deploys the ManagedPlatform stack to the platform account only
13
+ * using AWS CloudFormation StackSets.
14
+ *
15
+ * Unlike ManagedAccount which deploys to all accounts, ManagedPlatform
16
+ * is only deployed to the designated platform account as it manages
17
+ * organization-wide resources like IPAM.
18
+ *
19
+ * Note: IPAM pools for individual accounts need to be created separately
20
+ * as they require concrete account names at synthesis time.
21
+ */
22
+ class DeployManagedPlatform extends constructs_1.Construct {
23
+ constructor(scope, id, props) {
24
+ super(scope, id);
25
+ const stack = aws_cdk_lib_1.Stack.of(this);
26
+ let tmpDir;
27
+ try {
28
+ // Create a temporary app to synthesize the ManagedPlatform template
29
+ const tempApp = new aws_cdk_lib_1.App({
30
+ outdir: path.join(os.tmpdir(), `cdk-out-${Date.now()}`)
31
+ });
32
+ const managedPlatformStack = new managedPlatformStackSet_1.ManagedPlatformStackSet(tempApp, "ManagedPlatformTemplate");
33
+ const assembly = tempApp.synth();
34
+ // Get the synthesized template
35
+ const templateArtifact = assembly.getStackArtifact(managedPlatformStack.artifactId);
36
+ const templatePath = templateArtifact.templateFullPath;
37
+ // Create a temporary directory with just the template file
38
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "managed-platform-"));
39
+ const templateFileName = "ManagedPlatformTemplate.template.json";
40
+ const destPath = path.join(tmpDir, templateFileName);
41
+ // Copy only the template file
42
+ fs.copyFileSync(templatePath, destPath);
43
+ // Deploy the template to the S3 bucket
44
+ new aws_s3_deployment_1.BucketDeployment(this, "DeployManagedPlatformTemplate", {
45
+ sources: [aws_s3_deployment_1.Source.asset(tmpDir)],
46
+ destinationBucket: props.templateBucket,
47
+ destinationKeyPrefix: "managed-platform",
48
+ retainOnDelete: false
49
+ });
50
+ // Use region-agnostic S3 URL format
51
+ const templateURL = `https://${props.templateBucket.bucketName}.s3.amazonaws.com/managed-platform/${templateFileName}`;
52
+ new aws_cdk_lib_1.CfnStackSet(this, "ManagedPlatformStackSet", {
53
+ permissionModel: "SERVICE_MANAGED",
54
+ stackSetName: `ManagedPlatform-${stack.stackName}`,
55
+ description: "ManagedPlatform StackSet for the platform account (IPAM infrastructure only)",
56
+ capabilities: [
57
+ "CAPABILITY_IAM",
58
+ "CAPABILITY_NAMED_IAM",
59
+ "CAPABILITY_AUTO_EXPAND"
60
+ ],
61
+ templateUrl: templateURL,
62
+ autoDeployment: {
63
+ enabled: false, // Platform account is specific, not auto-deployed
64
+ retainStacksOnAccountRemoval: true
65
+ },
66
+ callAs: "DELEGATED_ADMIN",
67
+ operationPreferences: {
68
+ regionConcurrencyType: "PARALLEL",
69
+ maxConcurrentPercentage: 100,
70
+ failureTolerancePercentage: 0 // No tolerance as it's a single account
71
+ },
72
+ stackInstancesGroup: [
73
+ {
74
+ deploymentTargets: {
75
+ accounts: [props.platformAccountId] // Deploy only to platform account
76
+ },
77
+ regions: props.regions,
78
+ parameterOverrides: [
79
+ {
80
+ parameterKey: "AccountId",
81
+ parameterValue: props.platformAccountId
82
+ },
83
+ {
84
+ parameterKey: "Region",
85
+ parameterValue: props.regions[0] // Primary region for IPAM
86
+ }
87
+ ]
88
+ }
89
+ ]
90
+ });
91
+ }
92
+ finally {
93
+ // Clean up temporary directory
94
+ if (tmpDir && fs.existsSync(tmpDir)) {
95
+ fs.rmSync(tmpDir, { recursive: true, force: true });
96
+ }
97
+ }
98
+ }
99
+ }
100
+ exports.DeployManagedPlatform = DeployManagedPlatform;
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZFBsYXRmb3JtU3RhY2tTZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9tYW5hZ2VkUGxhdGZvcm1TdGFja1NldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBc0Q7QUFDdEQsMkNBQXVDO0FBRXZDLHFFQUF5RTtBQUN6RSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6Qix3RkFBZ0g7QUFVaEg7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEscUJBQXNCLFNBQVEsc0JBQVM7SUFDbEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFpQztRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sS0FBSyxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLElBQUksTUFBMEIsQ0FBQztRQUUvQixJQUFJLENBQUM7WUFDSCxvRUFBb0U7WUFDcEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxpQkFBRyxDQUFDO2dCQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsV0FBVyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQzthQUN4RCxDQUFDLENBQUM7WUFFSCxNQUFNLG9CQUFvQixHQUFHLElBQUksaURBQXVCLENBQ3RELE9BQU8sRUFDUCx5QkFBeUIsQ0FDMUIsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVqQywrQkFBK0I7WUFDL0IsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQ2hELG9CQUFvQixDQUFDLFVBQVUsQ0FDaEMsQ0FBQztZQUNGLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO1lBRXZELDJEQUEyRDtZQUMzRCxNQUFNLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFDckUsTUFBTSxnQkFBZ0IsR0FBRyx1Q0FBdUMsQ0FBQztZQUNqRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBRXJELDhCQUE4QjtZQUM5QixFQUFFLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUV4Qyx1Q0FBdUM7WUFDdkMsSUFBSSxvQ0FBZ0IsQ0FBQyxJQUFJLEVBQUUsK0JBQStCLEVBQUU7Z0JBQzFELE9BQU8sRUFBRSxDQUFDLDBCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMvQixpQkFBaUIsRUFBRSxLQUFLLENBQUMsY0FBYztnQkFDdkMsb0JBQW9CLEVBQUUsa0JBQWtCO2dCQUN4QyxjQUFjLEVBQUUsS0FBSzthQUN0QixDQUFDLENBQUM7WUFFSCxvQ0FBb0M7WUFDcEMsTUFBTSxXQUFXLEdBQUcsV0FBVyxLQUFLLENBQUMsY0FBYyxDQUFDLFVBQVUsc0NBQXNDLGdCQUFnQixFQUFFLENBQUM7WUFFdkgsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRSx5QkFBeUIsRUFBRTtnQkFDL0MsZUFBZSxFQUFFLGlCQUFpQjtnQkFDbEMsWUFBWSxFQUFFLG1CQUFtQixLQUFLLENBQUMsU0FBUyxFQUFFO2dCQUNsRCxXQUFXLEVBQ1QsOEVBQThFO2dCQUNoRixZQUFZLEVBQUU7b0JBQ1osZ0JBQWdCO29CQUNoQixzQkFBc0I7b0JBQ3RCLHdCQUF3QjtpQkFDekI7Z0JBQ0QsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLGNBQWMsRUFBRTtvQkFDZCxPQUFPLEVBQUUsS0FBSyxFQUFFLGtEQUFrRDtvQkFDbEUsNEJBQTRCLEVBQUUsSUFBSTtpQkFDbkM7Z0JBQ0QsTUFBTSxFQUFFLGlCQUFpQjtnQkFDekIsb0JBQW9CLEVBQUU7b0JBQ3BCLHFCQUFxQixFQUFFLFVBQVU7b0JBQ2pDLHVCQUF1QixFQUFFLEdBQUc7b0JBQzVCLDBCQUEwQixFQUFFLENBQUMsQ0FBQyx3Q0FBd0M7aUJBQ3ZFO2dCQUNELG1CQUFtQixFQUFFO29CQUNuQjt3QkFDRSxpQkFBaUIsRUFBRTs0QkFDakIsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsa0NBQWtDO3lCQUN2RTt3QkFDRCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87d0JBQ3RCLGtCQUFrQixFQUFFOzRCQUNsQjtnQ0FDRSxZQUFZLEVBQUUsV0FBVztnQ0FDekIsY0FBYyxFQUFFLEtBQUssQ0FBQyxpQkFBaUI7NkJBQ3hDOzRCQUNEO2dDQUNFLFlBQVksRUFBRSxRQUFRO2dDQUN0QixjQUFjLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQywwQkFBMEI7NkJBQzVEO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsK0JBQStCO1lBQy9CLElBQUksTUFBTSxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBNUZELHNEQTRGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrLCBDZm5TdGFja1NldCwgQXBwIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgUzNCdWNrZXQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBCdWNrZXREZXBsb3ltZW50LCBTb3VyY2UgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnRcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBNYW5hZ2VkUGxhdGZvcm1TdGFja1NldCBhcyBNYW5hZ2VkUGxhdGZvcm1UZW1wbGF0ZSB9IGZyb20gXCIuLi8uLi9wYXR0ZXJucy9hd3MvbWFuYWdlZFBsYXRmb3JtU3RhY2tTZXRcIjtcblxuaW50ZXJmYWNlIERlcGxveU1hbmFnZWRQbGF0Zm9ybVByb3BzIHtcbiAgcmVnaW9uczogc3RyaW5nW107XG4gIHRlbXBsYXRlQnVja2V0OiBTM0J1Y2tldDtcbiAgb3JnYW5pc2F0aW9uSWQ6IHN0cmluZztcbiAgcGxhdGZvcm1BY2NvdW50SWQ6IHN0cmluZztcbiAgb3JnQWNjb3VudHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIERlcGxveXMgdGhlIE1hbmFnZWRQbGF0Zm9ybSBzdGFjayB0byB0aGUgcGxhdGZvcm0gYWNjb3VudCBvbmx5XG4gKiB1c2luZyBBV1MgQ2xvdWRGb3JtYXRpb24gU3RhY2tTZXRzLlxuICpcbiAqIFVubGlrZSBNYW5hZ2VkQWNjb3VudCB3aGljaCBkZXBsb3lzIHRvIGFsbCBhY2NvdW50cywgTWFuYWdlZFBsYXRmb3JtXG4gKiBpcyBvbmx5IGRlcGxveWVkIHRvIHRoZSBkZXNpZ25hdGVkIHBsYXRmb3JtIGFjY291bnQgYXMgaXQgbWFuYWdlc1xuICogb3JnYW5pemF0aW9uLXdpZGUgcmVzb3VyY2VzIGxpa2UgSVBBTS5cbiAqXG4gKiBOb3RlOiBJUEFNIHBvb2xzIGZvciBpbmRpdmlkdWFsIGFjY291bnRzIG5lZWQgdG8gYmUgY3JlYXRlZCBzZXBhcmF0ZWx5XG4gKiBhcyB0aGV5IHJlcXVpcmUgY29uY3JldGUgYWNjb3VudCBuYW1lcyBhdCBzeW50aGVzaXMgdGltZS5cbiAqL1xuZXhwb3J0IGNsYXNzIERlcGxveU1hbmFnZWRQbGF0Zm9ybSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEZXBsb3lNYW5hZ2VkUGxhdGZvcm1Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIGxldCB0bXBEaXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgYXBwIHRvIHN5bnRoZXNpemUgdGhlIE1hbmFnZWRQbGF0Zm9ybSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcEFwcCA9IG5ldyBBcHAoe1xuICAgICAgICBvdXRkaXI6IHBhdGguam9pbihvcy50bXBkaXIoKSwgYGNkay1vdXQtJHtEYXRlLm5vdygpfWApXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWFuYWdlZFBsYXRmb3JtU3RhY2sgPSBuZXcgTWFuYWdlZFBsYXRmb3JtVGVtcGxhdGUoXG4gICAgICAgIHRlbXBBcHAsXG4gICAgICAgIFwiTWFuYWdlZFBsYXRmb3JtVGVtcGxhdGVcIlxuICAgICAgKTtcblxuICAgICAgY29uc3QgYXNzZW1ibHkgPSB0ZW1wQXBwLnN5bnRoKCk7XG5cbiAgICAgIC8vIEdldCB0aGUgc3ludGhlc2l6ZWQgdGVtcGxhdGVcbiAgICAgIGNvbnN0IHRlbXBsYXRlQXJ0aWZhY3QgPSBhc3NlbWJseS5nZXRTdGFja0FydGlmYWN0KFxuICAgICAgICBtYW5hZ2VkUGxhdGZvcm1TdGFjay5hcnRpZmFjdElkXG4gICAgICApO1xuICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gdGVtcGxhdGVBcnRpZmFjdC50ZW1wbGF0ZUZ1bGxQYXRoO1xuXG4gICAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGgganVzdCB0aGUgdGVtcGxhdGUgZmlsZVxuICAgICAgdG1wRGlyID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCBcIm1hbmFnZWQtcGxhdGZvcm0tXCIpKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlRmlsZU5hbWUgPSBcIk1hbmFnZWRQbGF0Zm9ybVRlbXBsYXRlLnRlbXBsYXRlLmpzb25cIjtcbiAgICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKHRtcERpciwgdGVtcGxhdGVGaWxlTmFtZSk7XG5cbiAgICAgIC8vIENvcHkgb25seSB0aGUgdGVtcGxhdGUgZmlsZVxuICAgICAgZnMuY29weUZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgZGVzdFBhdGgpO1xuXG4gICAgICAvLyBEZXBsb3kgdGhlIHRlbXBsYXRlIHRvIHRoZSBTMyBidWNrZXRcbiAgICAgIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMsIFwiRGVwbG95TWFuYWdlZFBsYXRmb3JtVGVtcGxhdGVcIiwge1xuICAgICAgICBzb3VyY2VzOiBbU291cmNlLmFzc2V0KHRtcERpcildLFxuICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogcHJvcHMudGVtcGxhdGVCdWNrZXQsXG4gICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBcIm1hbmFnZWQtcGxhdGZvcm1cIixcbiAgICAgICAgcmV0YWluT25EZWxldGU6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgLy8gVXNlIHJlZ2lvbi1hZ25vc3RpYyBTMyBVUkwgZm9ybWF0XG4gICAgICBjb25zdCB0ZW1wbGF0ZVVSTCA9IGBodHRwczovLyR7cHJvcHMudGVtcGxhdGVCdWNrZXQuYnVja2V0TmFtZX0uczMuYW1hem9uYXdzLmNvbS9tYW5hZ2VkLXBsYXRmb3JtLyR7dGVtcGxhdGVGaWxlTmFtZX1gO1xuXG4gICAgICBuZXcgQ2ZuU3RhY2tTZXQodGhpcywgXCJNYW5hZ2VkUGxhdGZvcm1TdGFja1NldFwiLCB7XG4gICAgICAgIHBlcm1pc3Npb25Nb2RlbDogXCJTRVJWSUNFX01BTkFHRURcIixcbiAgICAgICAgc3RhY2tTZXROYW1lOiBgTWFuYWdlZFBsYXRmb3JtLSR7c3RhY2suc3RhY2tOYW1lfWAsXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiTWFuYWdlZFBsYXRmb3JtIFN0YWNrU2V0IGZvciB0aGUgcGxhdGZvcm0gYWNjb3VudCAoSVBBTSBpbmZyYXN0cnVjdHVyZSBvbmx5KVwiLFxuICAgICAgICBjYXBhYmlsaXRpZXM6IFtcbiAgICAgICAgICBcIkNBUEFCSUxJVFlfSUFNXCIsXG4gICAgICAgICAgXCJDQVBBQklMSVRZX05BTUVEX0lBTVwiLFxuICAgICAgICAgIFwiQ0FQQUJJTElUWV9BVVRPX0VYUEFORFwiXG4gICAgICAgIF0sXG4gICAgICAgIHRlbXBsYXRlVXJsOiB0ZW1wbGF0ZVVSTCxcbiAgICAgICAgYXV0b0RlcGxveW1lbnQ6IHtcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZSwgLy8gUGxhdGZvcm0gYWNjb3VudCBpcyBzcGVjaWZpYywgbm90IGF1dG8tZGVwbG95ZWRcbiAgICAgICAgICByZXRhaW5TdGFja3NPbkFjY291bnRSZW1vdmFsOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGxBczogXCJERUxFR0FURURfQURNSU5cIixcbiAgICAgICAgb3BlcmF0aW9uUHJlZmVyZW5jZXM6IHtcbiAgICAgICAgICByZWdpb25Db25jdXJyZW5jeVR5cGU6IFwiUEFSQUxMRUxcIixcbiAgICAgICAgICBtYXhDb25jdXJyZW50UGVyY2VudGFnZTogMTAwLFxuICAgICAgICAgIGZhaWx1cmVUb2xlcmFuY2VQZXJjZW50YWdlOiAwIC8vIE5vIHRvbGVyYW5jZSBhcyBpdCdzIGEgc2luZ2xlIGFjY291bnRcbiAgICAgICAgfSxcbiAgICAgICAgc3RhY2tJbnN0YW5jZXNHcm91cDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlcGxveW1lbnRUYXJnZXRzOiB7XG4gICAgICAgICAgICAgIGFjY291bnRzOiBbcHJvcHMucGxhdGZvcm1BY2NvdW50SWRdIC8vIERlcGxveSBvbmx5IHRvIHBsYXRmb3JtIGFjY291bnRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWdpb25zOiBwcm9wcy5yZWdpb25zLFxuICAgICAgICAgICAgcGFyYW1ldGVyT3ZlcnJpZGVzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJLZXk6IFwiQWNjb3VudElkXCIsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWU6IHByb3BzLnBsYXRmb3JtQWNjb3VudElkXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJLZXk6IFwiUmVnaW9uXCIsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWU6IHByb3BzLnJlZ2lvbnNbMF0gLy8gUHJpbWFyeSByZWdpb24gZm9yIElQQU1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIENsZWFuIHVwIHRlbXBvcmFyeSBkaXJlY3RvcnlcbiAgICAgIGlmICh0bXBEaXIgJiYgZnMuZXhpc3RzU3luYyh0bXBEaXIpKSB7XG4gICAgICAgIGZzLnJtU3luYyh0bXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -4,11 +4,13 @@ import { Account as ExistingAccounts } from "@aws-sdk/client-organizations";
4
4
  import { KeyValue } from "../../types";
5
5
  interface OrganisationProps extends StackProps {
6
6
  organisationName: string;
7
- orgAccounts: string[];
8
- platformAccount: string;
7
+ accounts: AccountsConfig;
9
8
  orgEmail: string;
10
9
  existingAccounts?: ExistingAccounts[];
11
10
  }
11
+ type AccountsConfig = {
12
+ readonly [key: string]: readonly string[] | string;
13
+ };
12
14
  /**
13
15
  * A construct for creating multi environment organisations with a production, staging and development account.
14
16
  */
@@ -14,15 +14,9 @@ class Organisation extends constructs_1.Construct {
14
14
  super(scope, id);
15
15
  this.accounts = {};
16
16
  this.organisationalUnits = [];
17
- if (!props.orgAccounts.includes(props.platformAccount)) {
18
- throw new Error("ERROR: The Platform account specified must be included in the account names");
19
- }
20
- else if (!props.env?.region) {
21
- ("ERROR: The Platform account specified must be included in the account names");
22
- }
23
17
  this.existingAccounts = props.existingAccounts;
24
18
  this.addOrganisation(props.organisationName);
25
- this.addOrganisationUnitsAndAccounts(props.orgAccounts, props.orgEmail);
19
+ this.addOrganisationUnitsAndAccounts(props.accounts, props.orgEmail);
26
20
  }
27
21
  addOrganisation(organisationName) {
28
22
  this.organisation = new cdk_organizations_1.Organization(this, organisationName, {
@@ -40,35 +34,25 @@ class Organisation extends constructs_1.Construct {
40
34
  this.organisation.enablePolicyType(policyType);
41
35
  }
42
36
  }
43
- addOrganisationUnitsAndAccounts(orgAccounts, orgEmail) {
44
- const orgStructure = [];
45
- for (const accountName of orgAccounts) {
46
- // Set account name, strip any characters
47
- const accountNameId = (0, stripAndCamelCase_1.stripAndCamelCase)(accountName);
48
- // Check if the account name already exists, if true import using the pre-existing email
49
- const importedAccount = this.existingAccounts?.find((account) => account.Name === accountName);
50
- const accountEmail = importedAccount
51
- ? importedAccount.Email
52
- : (0, addSuffixToEmail_1.default)(orgEmail, accountNameId.toLowerCase());
53
- if (accountEmail) {
54
- const orgUnitStructure = {
55
- id: `${accountName}OrganizationalUnit`,
56
- name: accountName,
57
- accounts: [
58
- {
59
- id: `${accountNameId}Account`,
60
- name: accountName,
61
- email: accountEmail
62
- }
63
- ]
64
- };
65
- orgStructure.push(orgUnitStructure);
66
- }
67
- }
68
- for (const orgUnitStructure of orgStructure) {
69
- const orgUnit = this.addOrganisationalUnit(orgUnitStructure.id, orgUnitStructure.name);
70
- for (const accountStructure of orgUnitStructure.accounts) {
71
- this.addAccount(accountStructure.id, accountStructure.name, accountStructure.email, { env: orgUnitStructure.name.toLocaleLowerCase() }, orgUnit);
37
+ addOrganisationUnitsAndAccounts(accounts, orgEmail) {
38
+ for (const [environmentType, accountList] of Object.entries(accounts)) {
39
+ // Create OU for each environment type
40
+ const ouName = environmentType.charAt(0).toUpperCase() + environmentType.slice(1);
41
+ const orgUnit = this.addOrganisationalUnit(`${ouName}OrganizationalUnit`, ouName);
42
+ // Convert single account to array for uniform processing
43
+ const accountsArray = Array.isArray(accountList)
44
+ ? accountList
45
+ : [accountList];
46
+ // Add accounts to this OU
47
+ for (const accountName of accountsArray) {
48
+ const accountNameId = (0, stripAndCamelCase_1.stripAndCamelCase)(accountName);
49
+ const importedAccount = this.existingAccounts?.find((account) => account.Name === accountName);
50
+ const accountEmail = importedAccount
51
+ ? importedAccount.Email
52
+ : (0, addSuffixToEmail_1.default)(orgEmail, accountNameId.toLowerCase());
53
+ if (accountEmail) {
54
+ this.addAccount(`${accountNameId}Account`, accountName, accountEmail, { env: environmentType }, orgUnit);
55
+ }
72
56
  }
73
57
  }
74
58
  }
@@ -109,4 +93,4 @@ class Organisation extends constructs_1.Construct {
109
93
  }
110
94
  }
111
95
  exports.default = Organisation;
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pc2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2NvbmZpZy9hd3Mvb3JnYW5pc2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQW9EO0FBQ3BELDJDQUF1QztBQUN2Qyw2Q0FBbUM7QUFDbkMscUVBQWtFO0FBRWxFLG9FQU1zQztBQUN0QyxtRUFBNEQ7QUF1QjVEOztHQUVHO0FBRUgsTUFBcUIsWUFBYSxTQUFRLHNCQUFTO0lBUWpELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBd0I7UUFDaEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUxYLGFBQVEsR0FBYSxFQUFFLENBQUM7UUFFeEIsd0JBQW1CLEdBQXlCLEVBQUUsQ0FBQztRQUtyRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FDYiw2RUFBNkUsQ0FDOUUsQ0FBQztRQUNKLENBQUM7YUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM5QixDQUFDLDZFQUE2RSxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVPLGVBQWUsQ0FBQyxnQkFBd0I7UUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGdDQUFZLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzNELFVBQVUsRUFBRSw4QkFBVSxD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LE1BQU0sR0FBRyxHQUFHLElBQUksMkJBQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO1lBQ2hDLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLEtBQUssRUFBRSxLQUFLO1lBQ1osTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCLENBQUMsQ0FBQztRQUVILEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsa0JBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDO1FBRXBDLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtZQUM3QixHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsR0FBRyxDQUFDLFNBQVM7WUFDcEIsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJO1NBQ3RCLENBQUMsQ0FBQztRQUNILElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUM5QixHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUs7WUFDZixLQUFLLEVBQUUsR0FBRyxDQUFDLFVBQVU7WUFDckIsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLO1NBQ3ZCLENBQUMsQ0FBQztRQUVILE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLFdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQTlJRCwrQkE4SUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBUYWdzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBzdHJpcEFuZENhbWVsQ2FzZSB9IGZyb20gXCIuLi8uLi91dGlscy9zdHJpcEFuZENhbWVsQ2FzZVwiO1xuaW1wb3J0IHsgQWNjb3VudCBhcyBFeGlzdGluZ0FjY291bnRzIH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1vcmdhbml6YXRpb25zXCI7XG5pbXBvcnQge1xuICBBY2NvdW50LFxuICBGZWF0dXJlU2V0LFxuICBPcmdhbml6YXRpb24sXG4gIE9yZ2FuaXphdGlvbmFsVW5pdCxcbiAgUG9saWN5VHlwZVxufSBmcm9tIFwiQHBlcHBlcml6ZS9jZGstb3JnYW5pemF0aW9uc1wiO1xuaW1wb3J0IGFkZFN1ZmZpeFRvRW1haWwgZnJvbSBcIi4uLy4uL3V0aWxzL2FkZFN1ZmZpeFRvRW1haWxcIjtcbmltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbmludGVyZmFjZSBPcmdhbmlzYXRpb25Qcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICBvcmdhbmlzYXRpb25OYW1lOiBzdHJpbmc7XG4gIG9yZ0FjY291bnRzOiBzdHJpbmdbXTtcbiAgcGxhdGZvcm1BY2NvdW50OiBzdHJpbmc7XG4gIG9yZ0VtYWlsOiBzdHJpbmc7XG4gIGV4aXN0aW5nQWNjb3VudHM/OiBFeGlzdGluZ0FjY291bnRzW107XG59XG5cbnR5cGUgQWNjb3VudFN0cnVjdHVyZSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBlbWFpbDogc3RyaW5nO1xufTtcblxudHlwZSBPcmdhbmlzYXRpb25TdHJ1Y3R1cmUgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgYWNjb3VudHM6IEFjY291bnRTdHJ1Y3R1cmVbXTtcbn07XG5cbi8qKlxuICogQSBjb25zdHJ1Y3QgZm9yIGNyZWF0aW5nIG11bHRpIGVudmlyb25tZW50IG9yZ2FuaXNhdGlvbnMgd2l0aCBhIHByb2R1Y3Rpb24sIHN0YWdpbmcgYW5kIGRldmVsb3BtZW50IGFjY291bnQuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3JnYW5pc2F0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIGFjY291bnRJZDogQ2ZuT3V0cHV0O1xuXG4gIHByaXZhdGUgZXhpc3RpbmdBY2NvdW50cz86IEV4aXN0aW5nQWNjb3VudHNbXTtcbiAgcHJpdmF0ZSBhY2NvdW50czogS2V5VmFsdWUgPSB7fTtcbiAgcHJpdmF0ZSBvcmdhbmlzYXRpb246IE9yZ2FuaXphdGlvbjtcbiAgcHJpdmF0ZSBvcmdhbmlzYXRpb25hbFVuaXRzOiBPcmdhbml6YXRpb25hbFVuaXRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBPcmdhbmlzYXRpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAoIXByb3BzLm9yZ0FjY291bnRzLmluY2x1ZGVzKHByb3BzLnBsYXRmb3JtQWNjb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFUlJPUjogVGhlIFBsYXRmb3JtIGFjY291bnQgc3BlY2lmaWVkIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFjY291bnQgbmFtZXNcIlxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKCFwcm9wcy5lbnY/LnJlZ2lvbikge1xuICAgICAgKFwiRVJST1I6IFRoZSBQbGF0Zm9ybSBhY2NvdW50IHNwZWNpZmllZCBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBhY2NvdW50IG5hbWVzXCIpO1xuICAgIH1cblxuICAgIHRoaXMuZXhpc3RpbmdBY2NvdW50cyA9IHByb3BzLmV4aXN0aW5nQWNjb3VudHM7XG4gICAgdGhpcy5hZGRPcmdhbmlzYXRpb24ocHJvcHMub3JnYW5pc2F0aW9uTmFtZSk7XG4gICAgdGhpcy5hZGRPcmdhbmlzYXRpb25Vbml0c0FuZEFjY291bnRzKHByb3BzLm9yZ0FjY291bnRzLCBwcm9wcy5vcmdFbWFpbCk7XG4gIH1cblxuICBwcml2YXRlIGFkZE9yZ2FuaXNhdGlvbihvcmdhbmlzYXRpb25OYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLm9yZ2FuaXNhdGlvbiA9IG5ldyBPcmdhbml6YXRpb24odGhpcywgb3JnYW5pc2F0aW9uTmFtZSwge1xuICAgICAgZmVhdHVyZVNldDogRmVhdHVyZVNldC5BTExcbiAgICB9KTtcblxuICAgIC8vIFRPRE86IFZhbGlkYXRlIHRoaXMgZW5hYmxlcyB0cnVzdGVkIGFjY2Vzc1xuICAgIHRoaXMub3JnYW5pc2F0aW9uLmVuYWJsZUF3c1NlcnZpY2VBY2Nlc3MoXCJhY2NvdW50LmFtYXpvbmF3cy5jb21cIik7XG5cbiAgICBjb25zdCBlbmZvcmNlZFBvbGljeVR5cGVzOiBQb2xpY3lUeXBlW10gPSBbXG4gICAgICBQb2xpY3lUeXBlLlNFUlZJQ0VfQ09OVFJPTF9QT0xJQ1ksXG4gICAgICBQb2xpY3lUeXBlLlRBR19QT0xJQ1ksXG4gICAgICBQb2xpY3lUeXBlLkJBQ0tVUF9QT0xJQ1ksXG4gICAgICBQb2xpY3lUeXBlLkFJU0VSVklDRVNfT1BUX09VVF9QT0xJQ1lcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBwb2xpY3lUeXBlIG9mIGVuZm9yY2VkUG9saWN5VHlwZXMpIHtcbiAgICAgIHRoaXMub3JnYW5pc2F0aW9uLmVuYWJsZVBvbGljeVR5cGUocG9saWN5VHlwZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRPcmdhbmlzYXRpb25Vbml0c0FuZEFjY291bnRzKFxuICAgIG9yZ0FjY291bnRzOiBzdHJpbmdbXSxcbiAgICBvcmdFbWFpbDogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IG9yZ1N0cnVjdHVyZTogT3JnYW5pc2F0aW9uU3RydWN0dXJlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgYWNjb3VudE5hbWUgb2Ygb3JnQWNjb3VudHMpIHtcbiAgICAgIC8vIFNldCBhY2NvdW50IG5hbWUsIHN0cmlwIGFueSBjaGFyYWN0ZXJzXG4gICAgICBjb25zdCBhY2NvdW50TmFtZUlkID0gc3RyaXBBbmRDYW1lbENhc2UoYWNjb3VudE5hbWUpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgYWNjb3VudCBuYW1lIGFscmVhZHkgZXhpc3RzLCBpZiB0cnVlIGltcG9ydCB1c2luZyB0aGUgcHJlLWV4aXN0aW5nIGVtYWlsXG4gICAgICBjb25zdCBpbXBvcnRlZEFjY291bnQgPSB0aGlzLmV4aXN0aW5nQWNjb3VudHM/LmZpbmQoXG4gICAgICAgIChhY2NvdW50KSA9PiBhY2NvdW50Lk5hbWUgPT09IGFjY291bnROYW1lXG4gICAgICApO1xuICAgICAgY29uc3QgYWNjb3VudEVtYWlsID0gaW1wb3J0ZWRBY2NvdW50XG4gICAgICAgID8gaW1wb3J0ZWRBY2NvdW50LkVtYWlsXG4gICAgICAgIDogYWRkU3VmZml4VG9FbWFpbChvcmdFbWFpbCwgYWNjb3VudE5hbWVJZC50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgaWYgKGFjY291bnRFbWFpbCkge1xuICAgICAgICBjb25zdCBvcmdVbml0U3RydWN0dXJlOiBPcmdhbmlzYXRpb25TdHJ1Y3R1cmUgPSB7XG4gICAgICAgICAgaWQ6IGAke2FjY291bnROYW1lfU9yZ2FuaXphdGlvbmFsVW5pdGAsXG4gICAgICAgICAgbmFtZTogYWNjb3VudE5hbWUsXG4gICAgICAgICAgYWNjb3VudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6IGAke2FjY291bnROYW1lSWR9QWNjb3VudGAsXG4gICAgICAgICAgICAgIG5hbWU6IGFjY291bnROYW1lLFxuICAgICAgICAgICAgICBlbWFpbDogYWNjb3VudEVtYWlsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgICBvcmdTdHJ1Y3R1cmUucHVzaChvcmdVbml0U3RydWN0dXJlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBvcmdVbml0U3RydWN0dXJlIG9mIG9yZ1N0cnVjdHVyZSkge1xuICAgICAgY29uc3Qgb3JnVW5pdCA9IHRoaXMuYWRkT3JnYW5pc2F0aW9uYWxVbml0KFxuICAgICAgICBvcmdVbml0U3RydWN0dXJlLmlkLFxuICAgICAgICBvcmdVbml0U3RydWN0dXJlLm5hbWVcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGFjY291bnRTdHJ1Y3R1cmUgb2Ygb3JnVW5pdFN0cnVjdHVyZS5hY2NvdW50cykge1xuICAgICAgICB0aGlzLmFkZEFjY291bnQoXG4gICAgICAgICAgYWNjb3VudFN0cnVjdHVyZS5pZCxcbiAgICAgICAgICBhY2NvdW50U3RydWN0dXJlLm5hbWUsXG4gICAgICAgICAgYWNjb3VudFN0cnVjdHVyZS5lbWFpbCxcbiAgICAgICAgICB7IGVudjogb3JnVW5pdFN0cnVjdHVyZS5uYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkgfSxcbiAgICAgICAgICBvcmdVbml0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRPcmdhbmlzYXRpb25hbFVuaXQoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogT3JnYW5pemF0aW9uYWxVbml0IHtcbiAgICBjb25zdCBvdSA9IG5ldyBPcmdhbml6YXRpb25hbFVuaXQodGhpcywgaWQsIHtcbiAgICAgIG9yZ2FuaXphdGlvbmFsVW5pdE5hbWU6IG5hbWUsXG4gICAgICBwYXJlbnQ6IHRoaXMub3JnYW5pc2F0aW9uLnJvb3QsXG4gICAgICBpbXBvcnRPbkR1cGxpY2F0ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5vcmdhbmlzYXRpb25hbFVuaXRzLnB1c2gob3UpO1xuICAgIHJldHVybiBvdTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQWNjb3VudChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgb3JnYW5pc2F0aW9uYWxVbml0OiBPcmdhbml6YXRpb25hbFVuaXRcbiAgKTogQWNjb3VudCB7XG4gICAgY29uc3QgYWNjID0gbmV3IEFjY291bnQodGhpcywgaWQsIHtcbiAgICAgIGFjY291bnROYW1lOiBuYW1lLFxuICAgICAgZW1haWw6IGVtYWlsLFxuICAgICAgcGFyZW50OiBvcmdhbmlzYXRpb25hbFVuaXQsXG4gICAgICBpbXBvcnRPbkR1cGxpY2F0ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCB0YWcgaW4gdGFncykge1xuICAgICAgVGFncy5vZihhY2MpLmFkZCh0YWcsIHRhZ3NbdGFnXSk7XG4gICAgfVxuXG4gICAgdGhpcy5hY2NvdW50c1tuYW1lXSA9IGFjYy5hY2NvdW50SWQ7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfUlkYCwge1xuICAgICAga2V5OiBgJHtpZH1JZGAsXG4gICAgICB2YWx1ZTogYWNjLmFjY291bnRJZCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke2lkfUlkYFxuICAgIH0pO1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9QXJuYCwge1xuICAgICAga2V5OiBgJHtpZH1Bcm5gLFxuICAgICAgdmFsdWU6IGFjYy5hY2NvdW50QXJuLFxuICAgICAgZXhwb3J0TmFtZTogYCR7aWR9QXJuYFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFjYztcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY2NvdW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5hY2NvdW50cztcbiAgfVxufVxuIl19
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pc2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2NvbmZpZy9hd3Mvb3JnYW5pc2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQW9EO0FBQ3BELDJDQUF1QztBQUN2Qyw2Q0FBbUM7QUFDbkMscUVBQWtFO0FBRWxFLG9FQU1zQztBQUN0QyxtRUFBNEQ7QUFjNUQ7O0dBRUc7QUFFSCxNQUFxQixZQUFhLFNBQVEsc0JBQVM7SUFRakQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF3QjtRQUNoRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBTFgsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUV4Qix3QkFBbUIsR0FBeUIsRUFBRSxDQUFDO1FBS3JELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVPLGVBQWUsQ0FBQyxnQkFBd0I7UUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGdDQUFZLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzNELFVBQVUsRUFBRSw4QkFBVSxDQUFDLEdBQUc7U0FDM0IsQ0FBQyxDQUFDO1FBRUgsNkNBQTZDO1FBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUVsRSxNQUFNLG1CQUFtQixHQUFpQjtZQUN4Qyw4QkFBVSxDQUFDLHNCQUFzQjtZQUNqQyw4QkFBVSxDQUFDLFVBQVU7WUFDckIsOEJBQVUsQ0FBQyxhQUFhO1lBQ3hCLDhCQUFVLENBQUMseUJBQXlCO1NBQ3JDLENBQUM7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QztRQUVwQyxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7WUFDN0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1lBQ3BCLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUM7UUFDSCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUU7WUFDOUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLO1lBQ2YsS0FBSyxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQ3JCLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSztTQUN2QixDQUFDLENBQUM7UUFFSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUE5SEQsK0JBOEhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBTdGFja1Byb3BzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVGFncyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgc3RyaXBBbmRDYW1lbENhc2UgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc3RyaXBBbmRDYW1lbENhc2VcIjtcbmltcG9ydCB7IEFjY291bnQgYXMgRXhpc3RpbmdBY2NvdW50cyB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtb3JnYW5pemF0aW9uc1wiO1xuaW1wb3J0IHtcbiAgQWNjb3VudCxcbiAgRmVhdHVyZVNldCxcbiAgT3JnYW5pemF0aW9uLFxuICBPcmdhbml6YXRpb25hbFVuaXQsXG4gIFBvbGljeVR5cGVcbn0gZnJvbSBcIkBwZXBwZXJpemUvY2RrLW9yZ2FuaXphdGlvbnNcIjtcbmltcG9ydCBhZGRTdWZmaXhUb0VtYWlsIGZyb20gXCIuLi8uLi91dGlscy9hZGRTdWZmaXhUb0VtYWlsXCI7XG5pbXBvcnQgeyBLZXlWYWx1ZSB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG5pbnRlcmZhY2UgT3JnYW5pc2F0aW9uUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgb3JnYW5pc2F0aW9uTmFtZTogc3RyaW5nO1xuICBhY2NvdW50czogQWNjb3VudHNDb25maWc7XG4gIG9yZ0VtYWlsOiBzdHJpbmc7XG4gIGV4aXN0aW5nQWNjb3VudHM/OiBFeGlzdGluZ0FjY291bnRzW107XG59XG5cbnR5cGUgQWNjb3VudHNDb25maWcgPSB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHJlYWRvbmx5IHN0cmluZ1tdIHwgc3RyaW5nO1xufTtcblxuLyoqXG4gKiBBIGNvbnN0cnVjdCBmb3IgY3JlYXRpbmcgbXVsdGkgZW52aXJvbm1lbnQgb3JnYW5pc2F0aW9ucyB3aXRoIGEgcHJvZHVjdGlvbiwgc3RhZ2luZyBhbmQgZGV2ZWxvcG1lbnQgYWNjb3VudC5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPcmdhbmlzYXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgYWNjb3VudElkOiBDZm5PdXRwdXQ7XG5cbiAgcHJpdmF0ZSBleGlzdGluZ0FjY291bnRzPzogRXhpc3RpbmdBY2NvdW50c1tdO1xuICBwcml2YXRlIGFjY291bnRzOiBLZXlWYWx1ZSA9IHt9O1xuICBwcml2YXRlIG9yZ2FuaXNhdGlvbjogT3JnYW5pemF0aW9uO1xuICBwcml2YXRlIG9yZ2FuaXNhdGlvbmFsVW5pdHM6IE9yZ2FuaXphdGlvbmFsVW5pdFtdID0gW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9yZ2FuaXNhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuZXhpc3RpbmdBY2NvdW50cyA9IHByb3BzLmV4aXN0aW5nQWNjb3VudHM7XG4gICAgdGhpcy5hZGRPcmdhbmlzYXRpb24ocHJvcHMub3JnYW5pc2F0aW9uTmFtZSk7XG4gICAgdGhpcy5hZGRPcmdhbmlzYXRpb25Vbml0c0FuZEFjY291bnRzKHByb3BzLmFjY291bnRzLCBwcm9wcy5vcmdFbWFpbCk7XG4gIH1cblxuICBwcml2YXRlIGFkZE9yZ2FuaXNhdGlvbihvcmdhbmlzYXRpb25OYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLm9yZ2FuaXNhdGlvbiA9IG5ldyBPcmdhbml6YXRpb24odGhpcywgb3JnYW5pc2F0aW9uTmFtZSwge1xuICAgICAgZmVhdHVyZVNldDogRmVhdHVyZVNldC5BTExcbiAgICB9KTtcblxuICAgIC8vIFRPRE86IFZhbGlkYXRlIHRoaXMgZW5hYmxlcyB0cnVzdGVkIGFjY2Vzc1xuICAgIHRoaXMub3JnYW5pc2F0aW9uLmVuYWJsZUF3c1NlcnZpY2VBY2Nlc3MoXCJhY2NvdW50LmFtYXpvbmF3cy5jb21cIik7XG5cbiAgICBjb25zdCBlbmZvcmNlZFBvbGljeVR5cGVzOiBQb2xpY3lUeXBlW10gPSBbXG4gICAgICBQb2xpY3lUeXBlLlNFUlZJQ0VfQ09OVFJPTF9QT0xJQ1ksXG4gICAgICBQb2xpY3lUeXBlLlRBR19QT0xJQ1ksXG4gICAgICBQb2xpY3lUeXBlLkJBQ0tVUF9QT0xJQ1ksXG4gICAgICBQb2xpY3lUeXBlLkFJU0VSVklDRVNfT1BUX09VVF9QT0xJQ1lcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBwb2xpY3lUeXBlIG9mIGVuZm9yY2VkUG9saWN5VHlwZXMpIHtcbiAgICAgIHRoaXMub3JnYW5pc2F0aW9uLmVuYWJsZVBvbGljeVR5cGUocG9saWN5VHlwZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRPcmdhbmlzYXRpb25Vbml0c0FuZEFjY291bnRzKFxuICAgIGFjY291bnRzOiBBY2NvdW50c0NvbmZpZyxcbiAgICBvcmdFbWFpbDogc3RyaW5nXG4gICkge1xuICAgIGZvciAoY29uc3QgW2Vudmlyb25tZW50VHlwZSwgYWNjb3VudExpc3RdIG9mIE9iamVjdC5lbnRyaWVzKGFjY291bnRzKSkge1xuICAgICAgLy8gQ3JlYXRlIE9VIGZvciBlYWNoIGVudmlyb25tZW50IHR5cGVcbiAgICAgIGNvbnN0IG91TmFtZSA9XG4gICAgICAgIGVudmlyb25tZW50VHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGVudmlyb25tZW50VHlwZS5zbGljZSgxKTtcbiAgICAgIGNvbnN0IG9yZ1VuaXQgPSB0aGlzLmFkZE9yZ2FuaXNhdGlvbmFsVW5pdChcbiAgICAgICAgYCR7b3VOYW1lfU9yZ2FuaXphdGlvbmFsVW5pdGAsXG4gICAgICAgIG91TmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ29udmVydCBzaW5nbGUgYWNjb3VudCB0byBhcnJheSBmb3IgdW5pZm9ybSBwcm9jZXNzaW5nXG4gICAgICBjb25zdCBhY2NvdW50c0FycmF5ID0gQXJyYXkuaXNBcnJheShhY2NvdW50TGlzdClcbiAgICAgICAgPyBhY2NvdW50TGlzdFxuICAgICAgICA6IFthY2NvdW50TGlzdF07XG5cbiAgICAgIC8vIEFkZCBhY2NvdW50cyB0byB0aGlzIE9VXG4gICAgICBmb3IgKGNvbnN0IGFjY291bnROYW1lIG9mIGFjY291bnRzQXJyYXkpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudE5hbWVJZCA9IHN0cmlwQW5kQ2FtZWxDYXNlKGFjY291bnROYW1lKTtcblxuICAgICAgICBjb25zdCBpbXBvcnRlZEFjY291bnQgPSB0aGlzLmV4aXN0aW5nQWNjb3VudHM/LmZpbmQoXG4gICAgICAgICAgKGFjY291bnQpID0+IGFjY291bnQuTmFtZSA9PT0gYWNjb3VudE5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYWNjb3VudEVtYWlsID0gaW1wb3J0ZWRBY2NvdW50XG4gICAgICAgICAgPyBpbXBvcnRlZEFjY291bnQuRW1haWxcbiAgICAgICAgICA6IGFkZFN1ZmZpeFRvRW1haWwob3JnRW1haWwsIGFjY291bnROYW1lSWQudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgaWYgKGFjY291bnRFbWFpbCkge1xuICAgICAgICAgIHRoaXMuYWRkQWNjb3VudChcbiAgICAgICAgICAgIGAke2FjY291bnROYW1lSWR9QWNjb3VudGAsXG4gICAgICAgICAgICBhY2NvdW50TmFtZSxcbiAgICAgICAgICAgIGFjY291bnRFbWFpbCxcbiAgICAgICAgICAgIHsgZW52OiBlbnZpcm9ubWVudFR5cGUgfSxcbiAgICAgICAgICAgIG9yZ1VuaXRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRPcmdhbmlzYXRpb25hbFVuaXQoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogT3JnYW5pemF0aW9uYWxVbml0IHtcbiAgICBjb25zdCBvdSA9IG5ldyBPcmdhbml6YXRpb25hbFVuaXQodGhpcywgaWQsIHtcbiAgICAgIG9yZ2FuaXphdGlvbmFsVW5pdE5hbWU6IG5hbWUsXG4gICAgICBwYXJlbnQ6IHRoaXMub3JnYW5pc2F0aW9uLnJvb3QsXG4gICAgICBpbXBvcnRPbkR1cGxpY2F0ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5vcmdhbmlzYXRpb25hbFVuaXRzLnB1c2gob3UpO1xuICAgIHJldHVybiBvdTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQWNjb3VudChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgb3JnYW5pc2F0aW9uYWxVbml0OiBPcmdhbml6YXRpb25hbFVuaXRcbiAgKTogQWNjb3VudCB7XG4gICAgY29uc3QgYWNjID0gbmV3IEFjY291bnQodGhpcywgaWQsIHtcbiAgICAgIGFjY291bnROYW1lOiBuYW1lLFxuICAgICAgZW1haWw6IGVtYWlsLFxuICAgICAgcGFyZW50OiBvcmdhbmlzYXRpb25hbFVuaXQsXG4gICAgICBpbXBvcnRPbkR1cGxpY2F0ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCB0YWcgaW4gdGFncykge1xuICAgICAgVGFncy5vZihhY2MpLmFkZCh0YWcsIHRhZ3NbdGFnXSk7XG4gICAgfVxuXG4gICAgdGhpcy5hY2NvdW50c1tuYW1lXSA9IGFjYy5hY2NvdW50SWQ7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfUlkYCwge1xuICAgICAga2V5OiBgJHtpZH1JZGAsXG4gICAgICB2YWx1ZTogYWNjLmFjY291bnRJZCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke2lkfUlkYFxuICAgIH0pO1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9QXJuYCwge1xuICAgICAga2V5OiBgJHtpZH1Bcm5gLFxuICAgICAgdmFsdWU6IGFjYy5hY2NvdW50QXJuLFxuICAgICAgZXhwb3J0TmFtZTogYCR7aWR9QXJuYFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFjYztcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY2NvdW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5hY2NvdW50cztcbiAgfVxufVxuIl19
@@ -4,9 +4,6 @@ export interface ManagedAccountProps extends StackProps {
4
4
  accountId: string;
5
5
  region: string;
6
6
  }
7
- /**
8
- * A stack for deploying defaults into a new account.
9
- */
10
7
  export declare class ManagedAccount extends Stack {
11
8
  constructor(scope: Construct, id: string, props: ManagedAccountProps);
12
9
  }
@@ -4,9 +4,6 @@ exports.ManagedAccount = void 0;
4
4
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const aws_1 = require("../../config/aws");
6
6
  const cloudTrail_1 = require("../../config/aws/cloudTrail");
7
- /**
8
- * A stack for deploying defaults into a new account.
9
- */
10
7
  class ManagedAccount extends aws_cdk_lib_1.Stack {
11
8
  constructor(scope, id, props) {
12
9
  super(scope, id, props);
@@ -28,13 +25,7 @@ class ManagedAccount extends aws_cdk_lib_1.Stack {
28
25
  accountId: account.accountId.value,
29
26
  eventBusArn: eventBus.defaultEventBusArn.value
30
27
  });
31
- // TODO: Not sure if we need this anymore
32
- // new CfnOutput(this, `AccountName`, {
33
- // key: `AccountName`,
34
- // value: props.accountName,
35
- // exportName: `AccountName`
36
- // });
37
28
  }
38
29
  }
39
30
  exports.ManagedAccount = ManagedAccount;
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZEFjY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL21hbmFnZWRBY2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFnRDtBQUNoRCwwQ0FNMEI7QUFHMUIsNERBQW9FO0FBUXBFOztHQUVHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsbUJBQUs7SUFDdkMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixNQUFNLFlBQVksR0FBRyxJQUFJLG9CQUFjLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFaEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFTLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRWpELE1BQU0sUUFBUSxHQUFHLElBQUkscUJBQWUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFdkQsSUFBSSxFQUFFLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztZQUM1QixJQUFJLGdCQUFVLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtnQkFDakMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMxQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLE9BQU8sRUFBRSxZQUFZLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksa0NBQXFCLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUM1QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLO1NBQ25DLENBQUMsQ0FBQztRQUVILElBQUkscUJBQWUsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDM0MsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUs7WUFDbEMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLO1NBQy9DLENBQUMsQ0FBQztRQUVILHlDQUF5QztRQUN6Qyx1Q0FBdUM7UUFDdkMsd0JBQXdCO1FBQ3hCLDhCQUE4QjtRQUM5Qiw4QkFBOEI7UUFDOUIsTUFBTTtJQUNSLENBQUM7Q0FDRjtBQW5DRCx3Q0FtQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgT3JnYW5pc2F0aW9uSWQsXG4gIEFjY291bnRJZCxcbiAgSXBhbVBvb2xJZCxcbiAgRWNyRGVmYXVsdEltYWdlLFxuICBEZWZhdWx0RXZlbnRCdXNcbn0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3NcIjtcbmltcG9ydCB7fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IE1hbmFnZW1lbnRFdmVudHNUcmFpbCB9IGZyb20gXCIuLi8uLi9jb25maWcvYXdzL2Nsb3VkVHJhaWxcIjtcbi8vIGltcG9ydCB7IENmbk91dHB1dCB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL3V0aWxpdGllcy9jZm5PdXRwdXRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBNYW5hZ2VkQWNjb3VudFByb3BzIGV4dGVuZHMgU3RhY2tQcm9wcyB7XG4gIGFjY291bnRJZDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHN0YWNrIGZvciBkZXBsb3lpbmcgZGVmYXVsdHMgaW50byBhIG5ldyBhY2NvdW50LlxuICovXG5leHBvcnQgY2xhc3MgTWFuYWdlZEFjY291bnQgZXh0ZW5kcyBTdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBNYW5hZ2VkQWNjb3VudFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBjb25zdCBvcmdhbmlzYXRpb24gPSBuZXcgT3JnYW5pc2F0aW9uSWQodGhpcywgXCJPcmdhbmlzYXRpb25JZFwiKTtcblxuICAgIGNvbnN0IGFjY291bnQgPSBuZXcgQWNjb3VudElkKHRoaXMsIFwiQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3QgZXZlbnRCdXMgPSBuZXcgRGVmYXVsdEV2ZW50QnVzKHRoaXMsIFwiRXZlbnRCdXNcIik7XG5cbiAgICBpZiAoaWQgPT09IFwiTWFuYWdlZEFjY291bnRcIikge1xuICAgICAgbmV3IElwYW1Qb29sSWQodGhpcywgXCJJcGFtUG9vbElkXCIsIHtcbiAgICAgICAgYWNjb3VudElkOiBwcm9wcy5hY2NvdW50SWQsXG4gICAgICAgIHJlZ2lvbjogcHJvcHMucmVnaW9uLFxuICAgICAgICBvd25lcklkOiBvcmdhbmlzYXRpb24ub3JnYW5pc2F0aW9uQWNjb3VudEFybi52YWx1ZS5zcGxpdChcIjpcIilbNF1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG5ldyBNYW5hZ2VtZW50RXZlbnRzVHJhaWwodGhpcywgXCJDbG91ZFRyYWlsXCIsIHtcbiAgICAgIGFjY291bnRJZDogYWNjb3VudC5hY2NvdW50SWQudmFsdWVcbiAgICB9KTtcblxuICAgIG5ldyBFY3JEZWZhdWx0SW1hZ2UodGhpcywgXCJFY3JEZWZhdWx0SW1hZ2VcIiwge1xuICAgICAgcmVnaW9uOiBwcm9wcy5yZWdpb24sXG4gICAgICBhY2NvdW50SWQ6IGFjY291bnQuYWNjb3VudElkLnZhbHVlLFxuICAgICAgZXZlbnRCdXNBcm46IGV2ZW50QnVzLmRlZmF1bHRFdmVudEJ1c0Fybi52YWx1ZVxuICAgIH0pO1xuXG4gICAgLy8gVE9ETzogTm90IHN1cmUgaWYgd2UgbmVlZCB0aGlzIGFueW1vcmVcbiAgICAvLyBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGBBY2NvdW50TmFtZWAsIHtcbiAgICAvLyAgIGtleTogYEFjY291bnROYW1lYCxcbiAgICAvLyAgIHZhbHVlOiBwcm9wcy5hY2NvdW50TmFtZSxcbiAgICAvLyAgIGV4cG9ydE5hbWU6IGBBY2NvdW50TmFtZWBcbiAgICAvLyB9KTtcbiAgfVxufVxuIl19
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZEFjY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL21hbmFnZWRBY2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFnRDtBQUNoRCwwQ0FNMEI7QUFHMUIsNERBQW9FO0FBT3BFLE1BQWEsY0FBZSxTQUFRLG1CQUFLO0lBQ3ZDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxvQkFBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWhFLE1BQU0sT0FBTyxHQUFHLElBQUksZUFBUyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVqRCxNQUFNLFFBQVEsR0FBRyxJQUFJLHFCQUFlLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXZELElBQUksRUFBRSxLQUFLLGdCQUFnQixFQUFFLENBQUM7WUFDNUIsSUFBSSxnQkFBVSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7Z0JBQ2pDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUNwQixPQUFPLEVBQUUsWUFBWSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pFLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLGtDQUFxQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDNUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSztTQUNuQyxDQUFDLENBQUM7UUFFSCxJQUFJLHFCQUFlLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1lBQzNDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLO1lBQ2xDLFdBQVcsRUFBRSxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSztTQUMvQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUE1QkQsd0NBNEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIE9yZ2FuaXNhdGlvbklkLFxuICBBY2NvdW50SWQsXG4gIElwYW1Qb29sSWQsXG4gIEVjckRlZmF1bHRJbWFnZSxcbiAgRGVmYXVsdEV2ZW50QnVzXG59IGZyb20gXCIuLi8uLi9jb25maWcvYXdzXCI7XG5pbXBvcnQge30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBNYW5hZ2VtZW50RXZlbnRzVHJhaWwgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2F3cy9jbG91ZFRyYWlsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlZEFjY291bnRQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICBhY2NvdW50SWQ6IHN0cmluZztcbiAgcmVnaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkQWNjb3VudCBleHRlbmRzIFN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE1hbmFnZWRBY2NvdW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIGNvbnN0IG9yZ2FuaXNhdGlvbiA9IG5ldyBPcmdhbmlzYXRpb25JZCh0aGlzLCBcIk9yZ2FuaXNhdGlvbklkXCIpO1xuXG4gICAgY29uc3QgYWNjb3VudCA9IG5ldyBBY2NvdW50SWQodGhpcywgXCJBY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBldmVudEJ1cyA9IG5ldyBEZWZhdWx0RXZlbnRCdXModGhpcywgXCJFdmVudEJ1c1wiKTtcblxuICAgIGlmIChpZCA9PT0gXCJNYW5hZ2VkQWNjb3VudFwiKSB7XG4gICAgICBuZXcgSXBhbVBvb2xJZCh0aGlzLCBcIklwYW1Qb29sSWRcIiwge1xuICAgICAgICBhY2NvdW50SWQ6IHByb3BzLmFjY291bnRJZCxcbiAgICAgICAgcmVnaW9uOiBwcm9wcy5yZWdpb24sXG4gICAgICAgIG93bmVySWQ6IG9yZ2FuaXNhdGlvbi5vcmdhbmlzYXRpb25BY2NvdW50QXJuLnZhbHVlLnNwbGl0KFwiOlwiKVs0XVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmV3IE1hbmFnZW1lbnRFdmVudHNUcmFpbCh0aGlzLCBcIkNsb3VkVHJhaWxcIiwge1xuICAgICAgYWNjb3VudElkOiBhY2NvdW50LmFjY291bnRJZC52YWx1ZVxuICAgIH0pO1xuXG4gICAgbmV3IEVjckRlZmF1bHRJbWFnZSh0aGlzLCBcIkVjckRlZmF1bHRJbWFnZVwiLCB7XG4gICAgICByZWdpb246IHByb3BzLnJlZ2lvbixcbiAgICAgIGFjY291bnRJZDogYWNjb3VudC5hY2NvdW50SWQudmFsdWUsXG4gICAgICBldmVudEJ1c0FybjogZXZlbnRCdXMuZGVmYXVsdEV2ZW50QnVzQXJuLnZhbHVlXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ import { Stack, StackProps } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ export interface ManagedAccountStackSetProps extends StackProps {
4
+ }
5
+ /**
6
+ * A StackSet-compatible version of ManagedAccount that uses CloudFormation parameters
7
+ * for accountId and region instead of hardcoded values.
8
+ */
9
+ export declare class ManagedAccountStackSet extends Stack {
10
+ constructor(scope: Construct, id: string, props?: ManagedAccountStackSetProps);
11
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ManagedAccountStackSet = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const managedAccount_1 = require("./managedAccount");
6
+ /**
7
+ * A StackSet-compatible version of ManagedAccount that uses CloudFormation parameters
8
+ * for accountId and region instead of hardcoded values.
9
+ */
10
+ class ManagedAccountStackSet extends aws_cdk_lib_1.Stack {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, props);
13
+ // Create parameters that will be populated by StackSet
14
+ const accountIdParam = new aws_cdk_lib_1.CfnParameter(this, "AccountId", {
15
+ type: "String",
16
+ description: "The AWS Account ID where this stack is being deployed",
17
+ default: this.account
18
+ });
19
+ const regionParam = new aws_cdk_lib_1.CfnParameter(this, "Region", {
20
+ type: "String",
21
+ description: "The AWS Region where this stack is being deployed",
22
+ default: this.region
23
+ });
24
+ // Create the ManagedAccount resources using parameter values
25
+ const managedAccount = new managedAccount_1.ManagedAccount(this, "ManagedAccountResources", {
26
+ accountId: accountIdParam.valueAsString,
27
+ region: regionParam.valueAsString,
28
+ env: {
29
+ account: accountIdParam.valueAsString,
30
+ region: regionParam.valueAsString
31
+ }
32
+ });
33
+ }
34
+ }
35
+ exports.ManagedAccountStackSet = ManagedAccountStackSet;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZEFjY291bnRTdGFja1NldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvbWFuYWdlZEFjY291bnRTdGFja1NldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBOEQ7QUFFOUQscURBQWtEO0FBTWxEOzs7R0FHRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsbUJBQUs7SUFDL0MsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBbUM7UUFFbkMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsdURBQXVEO1FBQ3ZELE1BQU0sY0FBYyxHQUFHLElBQUksMEJBQVksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFO1lBQ3pELElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLHVEQUF1RDtZQUNwRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxXQUFXLEdBQUcsSUFBSSwwQkFBWSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDbkQsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQUUsbURBQW1EO1lBQ2hFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTTtTQUNyQixDQUFDLENBQUM7UUFFSCw2REFBNkQ7UUFDN0QsTUFBTSxjQUFjLEdBQUcsSUFBSSwrQkFBYyxDQUFDLElBQUksRUFBRSx5QkFBeUIsRUFBRTtZQUN6RSxTQUFTLEVBQUUsY0FBYyxDQUFDLGFBQWE7WUFDdkMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxhQUFhO1lBQ2pDLEdBQUcsRUFBRTtnQkFDSCxPQUFPLEVBQUUsY0FBYyxDQUFDLGFBQWE7Z0JBQ3JDLE1BQU0sRUFBRSxXQUFXLENBQUMsYUFBYTthQUNsQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQS9CRCx3REErQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5QYXJhbWV0ZXIsIFN0YWNrLCBTdGFja1Byb3BzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgTWFuYWdlZEFjY291bnQgfSBmcm9tIFwiLi9tYW5hZ2VkQWNjb3VudFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hbmFnZWRBY2NvdW50U3RhY2tTZXRQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICAvLyBBZGRpdGlvbmFsIHByb3BzIGlmIG5lZWRlZFxufVxuXG4vKipcbiAqIEEgU3RhY2tTZXQtY29tcGF0aWJsZSB2ZXJzaW9uIG9mIE1hbmFnZWRBY2NvdW50IHRoYXQgdXNlcyBDbG91ZEZvcm1hdGlvbiBwYXJhbWV0ZXJzXG4gKiBmb3IgYWNjb3VudElkIGFuZCByZWdpb24gaW5zdGVhZCBvZiBoYXJkY29kZWQgdmFsdWVzLlxuICovXG5leHBvcnQgY2xhc3MgTWFuYWdlZEFjY291bnRTdGFja1NldCBleHRlbmRzIFN0YWNrIHtcbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzPzogTWFuYWdlZEFjY291bnRTdGFja1NldFByb3BzXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgLy8gQ3JlYXRlIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIHBvcHVsYXRlZCBieSBTdGFja1NldFxuICAgIGNvbnN0IGFjY291bnRJZFBhcmFtID0gbmV3IENmblBhcmFtZXRlcih0aGlzLCBcIkFjY291bnRJZFwiLCB7XG4gICAgICB0eXBlOiBcIlN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIEFXUyBBY2NvdW50IElEIHdoZXJlIHRoaXMgc3RhY2sgaXMgYmVpbmcgZGVwbG95ZWRcIixcbiAgICAgIGRlZmF1bHQ6IHRoaXMuYWNjb3VudFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVnaW9uUGFyYW0gPSBuZXcgQ2ZuUGFyYW1ldGVyKHRoaXMsIFwiUmVnaW9uXCIsIHtcbiAgICAgIHR5cGU6IFwiU3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgQVdTIFJlZ2lvbiB3aGVyZSB0aGlzIHN0YWNrIGlzIGJlaW5nIGRlcGxveWVkXCIsXG4gICAgICBkZWZhdWx0OiB0aGlzLnJlZ2lvblxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBNYW5hZ2VkQWNjb3VudCByZXNvdXJjZXMgdXNpbmcgcGFyYW1ldGVyIHZhbHVlc1xuICAgIGNvbnN0IG1hbmFnZWRBY2NvdW50ID0gbmV3IE1hbmFnZWRBY2NvdW50KHRoaXMsIFwiTWFuYWdlZEFjY291bnRSZXNvdXJjZXNcIiwge1xuICAgICAgYWNjb3VudElkOiBhY2NvdW50SWRQYXJhbS52YWx1ZUFzU3RyaW5nLFxuICAgICAgcmVnaW9uOiByZWdpb25QYXJhbS52YWx1ZUFzU3RyaW5nLFxuICAgICAgZW52OiB7XG4gICAgICAgIGFjY291bnQ6IGFjY291bnRJZFBhcmFtLnZhbHVlQXNTdHJpbmcsXG4gICAgICAgIHJlZ2lvbjogcmVnaW9uUGFyYW0udmFsdWVBc1N0cmluZ1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -8,7 +8,7 @@ const identityCenterGroupMembership_1 = require("../../config/aws/identityCenter
8
8
  class ManagedIdentityCenter extends aws_cdk_lib_1.Stack {
9
9
  constructor(id) {
10
10
  super(app_1.default.getInstance(), id);
11
- const configFile = fs.readFileSync("fjall/identity-center-config.json", {
11
+ const configFile = fs.readFileSync("../identity-center-config.json", {
12
12
  encoding: "utf8"
13
13
  });
14
14
  const identityCenterConfig = JSON.parse(configFile);
@@ -21,4 +21,4 @@ class ManagedIdentityCenter extends aws_cdk_lib_1.Stack {
21
21
  }
22
22
  }
23
23
  exports.ManagedIdentityCenter = ManagedIdentityCenter;
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZElkZW50aXR5Q2VudGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9tYW5hZ2VkSWRlbnRpdHlDZW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQW9DO0FBQ3BDLHlCQUF5QjtBQUN6QixtQ0FBNEI7QUFDNUIsa0dBQStGO0FBTy9GLE1BQWEscUJBQXNCLFNBQVEsbUJBQUs7SUFDOUMsWUFBWSxFQUFVO1FBQ3BCLEtBQUssQ0FBQyxhQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFN0IsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxtQ0FBbUMsRUFBRTtZQUN0RSxRQUFRLEVBQUUsTUFBTTtTQUNqQixDQUFDLENBQUM7UUFDSCxNQUFNLG9CQUFvQixHQUF5QixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTFFLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLElBQUksNkRBQTZCLENBQUMsSUFBSSxFQUFFLFVBQVUsTUFBTSxDQUFDLEtBQUssT0FBTyxFQUFFO2dCQUNyRSxTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ3ZCLFlBQVksRUFBRSxNQUFNLENBQUMsT0FBTzthQUM3QixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWhCRCxzREFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IElkZW50aXR5Q2VudGVyR3JvdXBNZW1iZXJzaGlwIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvaWRlbnRpdHlDZW50ZXJHcm91cE1lbWJlcnNoaXBcIjtcblxudHlwZSBJZGVudGl0eUNlbnRlckNvbmZpZyA9IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgbWVtYmVyczogc3RyaW5nW107XG59W107XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkSWRlbnRpdHlDZW50ZXIgZXh0ZW5kcyBTdGFjayB7XG4gIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihBcHAuZ2V0SW5zdGFuY2UoKSwgaWQpO1xuXG4gICAgY29uc3QgY29uZmlnRmlsZSA9IGZzLnJlYWRGaWxlU3luYyhcImZqYWxsL2lkZW50aXR5LWNlbnRlci1jb25maWcuanNvblwiLCB7XG4gICAgICBlbmNvZGluZzogXCJ1dGY4XCJcbiAgICB9KTtcbiAgICBjb25zdCBpZGVudGl0eUNlbnRlckNvbmZpZzogSWRlbnRpdHlDZW50ZXJDb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0ZpbGUpO1xuXG4gICAgaWRlbnRpdHlDZW50ZXJDb25maWcuZm9yRWFjaCgoY29uZmlnKSA9PiB7XG4gICAgICBuZXcgSWRlbnRpdHlDZW50ZXJHcm91cE1lbWJlcnNoaXAodGhpcywgYE1hbmFnZWQke2NvbmZpZy5ncm91cH1Hcm91cGAsIHtcbiAgICAgICAgZ3JvdXBOYW1lOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGdyb3VwTWVtYmVyczogY29uZmlnLm1lbWJlcnNcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZElkZW50aXR5Q2VudGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9tYW5hZ2VkSWRlbnRpdHlDZW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQW9DO0FBQ3BDLHlCQUF5QjtBQUN6QixtQ0FBNEI7QUFDNUIsa0dBQStGO0FBTy9GLE1BQWEscUJBQXNCLFNBQVEsbUJBQUs7SUFDOUMsWUFBWSxFQUFVO1FBQ3BCLEtBQUssQ0FBQyxhQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFN0IsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxnQ0FBZ0MsRUFBRTtZQUNuRSxRQUFRLEVBQUUsTUFBTTtTQUNqQixDQUFDLENBQUM7UUFDSCxNQUFNLG9CQUFvQixHQUF5QixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTFFLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLElBQUksNkRBQTZCLENBQUMsSUFBSSxFQUFFLFVBQVUsTUFBTSxDQUFDLEtBQUssT0FBTyxFQUFFO2dCQUNyRSxTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ3ZCLFlBQVksRUFBRSxNQUFNLENBQUMsT0FBTzthQUM3QixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWhCRCxzREFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IElkZW50aXR5Q2VudGVyR3JvdXBNZW1iZXJzaGlwIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvaWRlbnRpdHlDZW50ZXJHcm91cE1lbWJlcnNoaXBcIjtcblxudHlwZSBJZGVudGl0eUNlbnRlckNvbmZpZyA9IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgbWVtYmVyczogc3RyaW5nW107XG59W107XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkSWRlbnRpdHlDZW50ZXIgZXh0ZW5kcyBTdGFjayB7XG4gIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihBcHAuZ2V0SW5zdGFuY2UoKSwgaWQpO1xuXG4gICAgY29uc3QgY29uZmlnRmlsZSA9IGZzLnJlYWRGaWxlU3luYyhcIi4uL2lkZW50aXR5LWNlbnRlci1jb25maWcuanNvblwiLCB7XG4gICAgICBlbmNvZGluZzogXCJ1dGY4XCJcbiAgICB9KTtcbiAgICBjb25zdCBpZGVudGl0eUNlbnRlckNvbmZpZzogSWRlbnRpdHlDZW50ZXJDb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0ZpbGUpO1xuXG4gICAgaWRlbnRpdHlDZW50ZXJDb25maWcuZm9yRWFjaCgoY29uZmlnKSA9PiB7XG4gICAgICBuZXcgSWRlbnRpdHlDZW50ZXJHcm91cE1lbWJlcnNoaXAodGhpcywgYE1hbmFnZWQke2NvbmZpZy5ncm91cH1Hcm91cGAsIHtcbiAgICAgICAgZ3JvdXBOYW1lOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGdyb3VwTWVtYmVyczogY29uZmlnLm1lbWJlcnNcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -4,10 +4,12 @@ import { Account } from "@aws-sdk/client-organizations";
4
4
  type ExtendedStackProps = Omit<StackProps, "env"> & {
5
5
  env: Required<Pick<Environment, "region" | "account">> & Partial<Omit<Environment, "region" | "account">>;
6
6
  };
7
+ type AccountsConfig = {
8
+ readonly [key: string]: readonly string[] | string;
9
+ };
7
10
  interface ManagedOrganisationProps extends ExtendedStackProps {
8
11
  organisationName: string;
9
- orgAccounts: string[];
10
- platformAccount: string;
12
+ accounts: AccountsConfig;
11
13
  orgEmail: string;
12
14
  existingAccounts?: Account[];
13
15
  costAllocationTags: ICostAllocationTags[];
@@ -16,13 +18,14 @@ interface ManagedOrganisationProps extends ExtendedStackProps {
16
18
  export declare class ManagedOrganisation extends Stack {
17
19
  private organisation;
18
20
  constructor(id: string, props: ManagedOrganisationProps);
19
- private validatePlatformAccount;
20
21
  private createOrganisation;
21
22
  private setupOrganisationFeatures;
23
+ private getPlatformAccountId;
22
24
  private setupIpamDelegation;
23
25
  private enableRamSharing;
24
26
  private enableTrustedAccess;
25
27
  private enableCostAllocationTags;
26
28
  private setupIdentityCenter;
29
+ private updateEnvironmentConfig;
27
30
  }
28
31
  export {};