@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
@@ -9,26 +9,21 @@ const ramSharing_1 = require("../../config/aws/ramSharing");
9
9
  const costAllocationTags_1 = require("../../config/aws/costAllocationTags");
10
10
  const organisation_1 = require("../../config/aws/organisation");
11
11
  const organisationsAccess_1 = require("../../config/aws/organisationsAccess");
12
+ const util_1 = require("@fjall/util");
12
13
  class ManagedOrganisation extends aws_cdk_lib_1.Stack {
13
14
  constructor(id, props) {
14
15
  super(app_1.default.getInstance(), id, props);
15
- this.validatePlatformAccount(props);
16
- this.createOrganisation(id, props);
16
+ this.createOrganisation(props);
17
17
  this.setupOrganisationFeatures({
18
18
  ...props,
19
19
  identityCenter: props.identityCenter ?? true
20
20
  });
21
+ this.updateEnvironmentConfig(props);
21
22
  }
22
- validatePlatformAccount(props) {
23
- if (!props.orgAccounts.includes(props.platformAccount)) {
24
- throw new Error(`Platform account "${props.platformAccount}" is not listed in account names. Valid accounts are: ${props.orgAccounts.join(", ")}`);
25
- }
26
- }
27
- createOrganisation(id, props) {
28
- this.organisation = new organisation_1.default(this, id, {
23
+ createOrganisation(props) {
24
+ this.organisation = new organisation_1.default(this, "ManagedOrganisation", {
29
25
  organisationName: props.organisationName,
30
- orgAccounts: props.orgAccounts,
31
- platformAccount: props.platformAccount,
26
+ accounts: props.accounts,
32
27
  orgEmail: props.orgEmail,
33
28
  env: props.env,
34
29
  existingAccounts: props.existingAccounts
@@ -36,15 +31,29 @@ class ManagedOrganisation extends aws_cdk_lib_1.Stack {
36
31
  }
37
32
  setupOrganisationFeatures(props) {
38
33
  const orgAccounts = this.organisation.getAccounts();
39
- this.setupIpamDelegation(orgAccounts, props);
34
+ const platformAccountId = this.getPlatformAccountId(orgAccounts, props);
35
+ this.setupIpamDelegation(platformAccountId);
40
36
  this.enableRamSharing();
41
37
  this.enableTrustedAccess(props);
42
38
  this.enableCostAllocationTags(props);
43
39
  this.setupIdentityCenter(orgAccounts, props);
44
40
  }
45
- setupIpamDelegation(orgAccounts, props) {
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) {
46
55
  new ipamDelegateAdmin_1.IpamDelegateAdmin(this, "IpamDelegateAdmin", {
47
- accountId: orgAccounts[props.platformAccount]
56
+ accountId: platformAccountId
48
57
  });
49
58
  }
50
59
  enableRamSharing() {
@@ -70,6 +79,21 @@ class ManagedOrganisation extends aws_cdk_lib_1.Stack {
70
79
  });
71
80
  }
72
81
  }
82
+ updateEnvironmentConfig(props) {
83
+ try {
84
+ const config = util_1.Config.loadConfig();
85
+ // Convert accounts to accountTypes format
86
+ const accountTypes = {};
87
+ for (const [envType, accounts] of Object.entries(props.accounts)) {
88
+ accountTypes[envType] = Array.isArray(accounts) ? accounts : [accounts];
89
+ }
90
+ config.updateProviderAccountEnvironments(accountTypes);
91
+ config.saveConfig();
92
+ }
93
+ catch (error) {
94
+ console.warn("Failed to update fjall-config.json with environment mappings:", error);
95
+ }
96
+ }
73
97
  }
74
98
  exports.ManagedOrganisation = ManagedOrganisation;
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZE9yZ2FuaXNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvbWFuYWdlZE9yZ2FuaXNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBNkQ7QUFFN0QsbUNBQTRCO0FBRTVCLG9FQUFpRTtBQUNqRSwwRUFBdUU7QUFDdkUsNERBQXlEO0FBQ3pELDRFQUc2QztBQUM3QyxnRUFBeUQ7QUFFekQsOEVBQW1GO0FBaUJuRixNQUFhLG1CQUFvQixTQUFRLG1CQUFLO0lBRzVDLFlBQVksRUFBVSxFQUFFLEtBQStCO1FBQ3JELEtBQUssQ0FBQyxhQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztZQUM3QixHQUFHLEtBQUs7WUFDUixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWMsSUFBSSxJQUFJO1NBQzdDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxLQUErQjtRQUM3RCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FDYixxQkFDRSxLQUFLLENBQUMsZUFDUix5REFBeUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQzdFLElBQUksQ0FDTCxFQUFFLENBQ0osQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsRUFBVSxFQUFFLEtBQStCO1FBQ3BFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxzQkFBWSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUU7WUFDN0MsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtZQUN4QyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlO1lBQ3RDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7WUFDZCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1NBQ3pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxLQUErQjtRQUMvRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXBELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTyxtQkFBbUIsQ0FDekIsV0FBbUMsRUFDbkMsS0FBK0I7UUFFL0IsSUFBSSxxQ0FBaUIsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDL0MsU0FBUyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1NBQzlDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSx1QkFBVSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsS0FBK0I7UUFDekQsSUFBSSxpREFBMkIsQ0FBQyxJQUFJLEVBQUUsNkJBQTZCLEVBQUU7WUFDbkUsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTztZQUMxQixNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxLQUErQjtRQUM5RCxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEMsSUFBSSx1Q0FBa0IsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7Z0JBQ2pELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxrQkFBa0I7YUFDN0MsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFTyxtQkFBbUIsQ0FDekIsV0FBbUMsRUFDbkMsS0FBK0I7UUFFL0IsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsSUFBSSwrQkFBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFDekMsUUFBUSxFQUFFLFdBQVc7YUFDdEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXBGRCxrREFvRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudCwgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuaW1wb3J0IEFwcCBmcm9tIFwiLi4vLi4vYXBwXCI7XG5cbmltcG9ydCB7IElkZW50aXR5Q2VudGVyIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvaWRlbnRpdHlDZW50ZXJcIjtcbmltcG9ydCB7IElwYW1EZWxlZ2F0ZUFkbWluIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvaXBhbURlbGVnYXRlQWRtaW5cIjtcbmltcG9ydCB7IFJhbVNoYXJpbmcgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2F3cy9yYW1TaGFyaW5nXCI7XG5pbXBvcnQge1xuICBDb3N0QWxsb2NhdGlvblRhZ3MsXG4gIElDb3N0QWxsb2NhdGlvblRhZ3Ncbn0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvY29zdEFsbG9jYXRpb25UYWdzXCI7XG5pbXBvcnQgT3JnYW5pc2F0aW9uIGZyb20gXCIuLi8uLi9jb25maWcvYXdzL29yZ2FuaXNhdGlvblwiO1xuaW1wb3J0IHsgQWNjb3VudCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtb3JnYW5pemF0aW9uc1wiO1xuaW1wb3J0IHsgQWN0aXZhdGVPcmdhbmlzYXRpb25zQWNjZXNzIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3Mvb3JnYW5pc2F0aW9uc0FjY2Vzc1wiO1xuXG50eXBlIEV4dGVuZGVkU3RhY2tQcm9wcyA9IE9taXQ8U3RhY2tQcm9wcywgXCJlbnZcIj4gJiB7XG4gIGVudjogUmVxdWlyZWQ8UGljazxFbnZpcm9ubWVudCwgXCJyZWdpb25cIiB8IFwiYWNjb3VudFwiPj4gJlxuICAgIFBhcnRpYWw8T21pdDxFbnZpcm9ubWVudCwgXCJyZWdpb25cIiB8IFwiYWNjb3VudFwiPj47XG59O1xuXG5pbnRlcmZhY2UgTWFuYWdlZE9yZ2FuaXNhdGlvblByb3BzIGV4dGVuZHMgRXh0ZW5kZWRTdGFja1Byb3BzIHtcbiAgb3JnYW5pc2F0aW9uTmFtZTogc3RyaW5nO1xuICBvcmdBY2NvdW50czogc3RyaW5nW107XG4gIHBsYXRmb3JtQWNjb3VudDogc3RyaW5nO1xuICBvcmdFbWFpbDogc3RyaW5nO1xuICBleGlzdGluZ0FjY291bnRzPzogQWNjb3VudFtdO1xuICBjb3N0QWxsb2NhdGlvblRhZ3M6IElDb3N0QWxsb2NhdGlvblRhZ3NbXTtcbiAgaWRlbnRpdHlDZW50ZXI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZE9yZ2FuaXNhdGlvbiBleHRlbmRzIFN0YWNrIHtcbiAgcHJpdmF0ZSBvcmdhbmlzYXRpb246IE9yZ2FuaXNhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBwcm9wczogTWFuYWdlZE9yZ2FuaXNhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoQXBwLmdldEluc3RhbmNlKCksIGlkLCBwcm9wcyk7XG4gICAgdGhpcy52YWxpZGF0ZVBsYXRmb3JtQWNjb3VudChwcm9wcyk7XG4gICAgdGhpcy5jcmVhdGVPcmdhbmlzYXRpb24oaWQsIHByb3BzKTtcbiAgICB0aGlzLnNldHVwT3JnYW5pc2F0aW9uRmVhdHVyZXMoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBpZGVudGl0eUNlbnRlcjogcHJvcHMuaWRlbnRpdHlDZW50ZXIgPz8gdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBsYXRmb3JtQWNjb3VudChwcm9wczogTWFuYWdlZE9yZ2FuaXNhdGlvblByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy5vcmdBY2NvdW50cy5pbmNsdWRlcyhwcm9wcy5wbGF0Zm9ybUFjY291bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQbGF0Zm9ybSBhY2NvdW50IFwiJHtcbiAgICAgICAgICBwcm9wcy5wbGF0Zm9ybUFjY291bnRcbiAgICAgICAgfVwiIGlzIG5vdCBsaXN0ZWQgaW4gYWNjb3VudCBuYW1lcy4gVmFsaWQgYWNjb3VudHMgYXJlOiAke3Byb3BzLm9yZ0FjY291bnRzLmpvaW4oXG4gICAgICAgICAgXCIsIFwiXG4gICAgICAgICl9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU9yZ2FuaXNhdGlvbihpZDogc3RyaW5nLCBwcm9wczogTWFuYWdlZE9yZ2FuaXNhdGlvblByb3BzKSB7XG4gICAgdGhpcy5vcmdhbmlzYXRpb24gPSBuZXcgT3JnYW5pc2F0aW9uKHRoaXMsIGlkLCB7XG4gICAgICBvcmdhbmlzYXRpb25OYW1lOiBwcm9wcy5vcmdhbmlzYXRpb25OYW1lLFxuICAgICAgb3JnQWNjb3VudHM6IHByb3BzLm9yZ0FjY291bnRzLFxuICAgICAgcGxhdGZvcm1BY2NvdW50OiBwcm9wcy5wbGF0Zm9ybUFjY291bnQsXG4gICAgICBvcmdFbWFpbDogcHJvcHMub3JnRW1haWwsXG4gICAgICBlbnY6IHByb3BzLmVudixcbiAgICAgIGV4aXN0aW5nQWNjb3VudHM6IHByb3BzLmV4aXN0aW5nQWNjb3VudHNcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBPcmdhbmlzYXRpb25GZWF0dXJlcyhwcm9wczogTWFuYWdlZE9yZ2FuaXNhdGlvblByb3BzKSB7XG4gICAgY29uc3Qgb3JnQWNjb3VudHMgPSB0aGlzLm9yZ2FuaXNhdGlvbi5nZXRBY2NvdW50cygpO1xuXG4gICAgdGhpcy5zZXR1cElwYW1EZWxlZ2F0aW9uKG9yZ0FjY291bnRzLCBwcm9wcyk7XG4gICAgdGhpcy5lbmFibGVSYW1TaGFyaW5nKCk7XG4gICAgdGhpcy5lbmFibGVUcnVzdGVkQWNjZXNzKHByb3BzKTtcbiAgICB0aGlzLmVuYWJsZUNvc3RBbGxvY2F0aW9uVGFncyhwcm9wcyk7XG4gICAgdGhpcy5zZXR1cElkZW50aXR5Q2VudGVyKG9yZ0FjY291bnRzLCBwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwSXBhbURlbGVnYXRpb24oXG4gICAgb3JnQWNjb3VudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgcHJvcHM6IE1hbmFnZWRPcmdhbmlzYXRpb25Qcm9wc1xuICApIHtcbiAgICBuZXcgSXBhbURlbGVnYXRlQWRtaW4odGhpcywgXCJJcGFtRGVsZWdhdGVBZG1pblwiLCB7XG4gICAgICBhY2NvdW50SWQ6IG9yZ0FjY291bnRzW3Byb3BzLnBsYXRmb3JtQWNjb3VudF1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlUmFtU2hhcmluZygpIHtcbiAgICBuZXcgUmFtU2hhcmluZyh0aGlzLCBcIlJhbVNoYXJpbmdcIik7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZVRydXN0ZWRBY2Nlc3MocHJvcHM6IE1hbmFnZWRPcmdhbmlzYXRpb25Qcm9wcykge1xuICAgIG5ldyBBY3RpdmF0ZU9yZ2FuaXNhdGlvbnNBY2Nlc3ModGhpcywgXCJBY3RpdmF0ZU9yZ2FuaXNhdGlvbnNBY2Nlc3NcIiwge1xuICAgICAgYWNjb3VudDogcHJvcHMuZW52LmFjY291bnQsXG4gICAgICByZWdpb246IHByb3BzLmVudi5yZWdpb25cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlQ29zdEFsbG9jYXRpb25UYWdzKHByb3BzOiBNYW5hZ2VkT3JnYW5pc2F0aW9uUHJvcHMpIHtcbiAgICBpZiAocHJvcHMuY29zdEFsbG9jYXRpb25UYWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ldyBDb3N0QWxsb2NhdGlvblRhZ3ModGhpcywgXCJDb3N0QWxsb2NhdGlvblRhZ3NcIiwge1xuICAgICAgICBjb3N0QWxsb2NhdGlvblRhZ3M6IHByb3BzLmNvc3RBbGxvY2F0aW9uVGFnc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cElkZW50aXR5Q2VudGVyKFxuICAgIG9yZ0FjY291bnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIHByb3BzOiBNYW5hZ2VkT3JnYW5pc2F0aW9uUHJvcHNcbiAgKSB7XG4gICAgaWYgKHByb3BzLmlkZW50aXR5Q2VudGVyKSB7XG4gICAgICBuZXcgSWRlbnRpdHlDZW50ZXIodGhpcywgXCJJZGVudGl0eUNlbnRlclwiLCB7XG4gICAgICAgIGFjY291bnRzOiBvcmdBY2NvdW50c1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZE9yZ2FuaXNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvbWFuYWdlZE9yZ2FuaXNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBNkQ7QUFFN0QsbUNBQTRCO0FBRTVCLG9FQUFpRTtBQUNqRSwwRUFBdUU7QUFDdkUsNERBQXlEO0FBQ3pELDRFQUc2QztBQUM3QyxnRUFBeUQ7QUFFekQsOEVBQW1GO0FBQ25GLHNDQUFxQztBQW9CckMsTUFBYSxtQkFBb0IsU0FBUSxtQkFBSztJQUc1QyxZQUFZLEVBQVUsRUFBRSxLQUErQjtRQUNyRCxLQUFLLENBQUMsYUFBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1lBQzdCLEdBQUcsS0FBSztZQUNSLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxJQUFJLElBQUk7U0FDN0MsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxLQUErQjtRQUN4RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksc0JBQVksQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUU7WUFDaEUsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtZQUN4QyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHlCQUF5QixDQUFDLEtBQStCO1FBQy9ELE1BQU0sV0FB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QyxFQUFFLENBQUM7WUFDM0QsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pFLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUNELE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2RCxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsSUFBSSxDQUNWLCtEQUErRCxFQUMvRCxLQUFLLENBQ04sQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFuSEQsa0RBbUhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnQsIFN0YWNrLCBTdGFja1Byb3BzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbmltcG9ydCBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuXG5pbXBvcnQgeyBJZGVudGl0eUNlbnRlciB9IGZyb20gXCIuLi8uLi9jb25maWcvYXdzL2lkZW50aXR5Q2VudGVyXCI7XG5pbXBvcnQgeyBJcGFtRGVsZWdhdGVBZG1pbiB9IGZyb20gXCIuLi8uLi9jb25maWcvYXdzL2lwYW1EZWxlZ2F0ZUFkbWluXCI7XG5pbXBvcnQgeyBSYW1TaGFyaW5nIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvcmFtU2hhcmluZ1wiO1xuaW1wb3J0IHtcbiAgQ29zdEFsbG9jYXRpb25UYWdzLFxuICBJQ29zdEFsbG9jYXRpb25UYWdzXG59IGZyb20gXCIuLi8uLi9jb25maWcvYXdzL2Nvc3RBbGxvY2F0aW9uVGFnc1wiO1xuaW1wb3J0IE9yZ2FuaXNhdGlvbiBmcm9tIFwiLi4vLi4vY29uZmlnL2F3cy9vcmdhbmlzYXRpb25cIjtcbmltcG9ydCB7IEFjY291bnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LW9yZ2FuaXphdGlvbnNcIjtcbmltcG9ydCB7IEFjdGl2YXRlT3JnYW5pc2F0aW9uc0FjY2VzcyB9IGZyb20gXCIuLi8uLi9jb25maWcvYXdzL29yZ2FuaXNhdGlvbnNBY2Nlc3NcIjtcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gXCJAZmphbGwvdXRpbFwiO1xuXG50eXBlIEV4dGVuZGVkU3RhY2tQcm9wcyA9IE9taXQ8U3RhY2tQcm9wcywgXCJlbnZcIj4gJiB7XG4gIGVudjogUmVxdWlyZWQ8UGljazxFbnZpcm9ubWVudCwgXCJyZWdpb25cIiB8IFwiYWNjb3VudFwiPj4gJlxuICAgIFBhcnRpYWw8T21pdDxFbnZpcm9ubWVudCwgXCJyZWdpb25cIiB8IFwiYWNjb3VudFwiPj47XG59O1xuXG50eXBlIEFjY291bnRzQ29uZmlnID0ge1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiByZWFkb25seSBzdHJpbmdbXSB8IHN0cmluZztcbn07XG5cbmludGVyZmFjZSBNYW5hZ2VkT3JnYW5pc2F0aW9uUHJvcHMgZXh0ZW5kcyBFeHRlbmRlZFN0YWNrUHJvcHMge1xuICBvcmdhbmlzYXRpb25OYW1lOiBzdHJpbmc7XG4gIGFjY291bnRzOiBBY2NvdW50c0NvbmZpZztcbiAgb3JnRW1haWw6IHN0cmluZztcbiAgZXhpc3RpbmdBY2NvdW50cz86IEFjY291bnRbXTtcbiAgY29zdEFsbG9jYXRpb25UYWdzOiBJQ29zdEFsbG9jYXRpb25UYWdzW107XG4gIGlkZW50aXR5Q2VudGVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRPcmdhbmlzYXRpb24gZXh0ZW5kcyBTdGFjayB7XG4gIHByaXZhdGUgb3JnYW5pc2F0aW9uOiBPcmdhbmlzYXRpb247XG5cbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgcHJvcHM6IE1hbmFnZWRPcmdhbmlzYXRpb25Qcm9wcykge1xuICAgIHN1cGVyKEFwcC5nZXRJbnN0YW5jZSgpLCBpZCwgcHJvcHMpO1xuICAgIHRoaXMuY3JlYXRlT3JnYW5pc2F0aW9uKHByb3BzKTtcbiAgICB0aGlzLnNldHVwT3JnYW5pc2F0aW9uRmVhdHVyZXMoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBpZGVudGl0eUNlbnRlcjogcHJvcHMuaWRlbnRpdHlDZW50ZXIgPz8gdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlRW52aXJvbm1lbnRDb25maWcocHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPcmdhbmlzYXRpb24ocHJvcHM6IE1hbmFnZWRPcmdhbmlzYXRpb25Qcm9wcykge1xuICAgIHRoaXMub3JnYW5pc2F0aW9uID0gbmV3IE9yZ2FuaXNhdGlvbih0aGlzLCBcIk1hbmFnZWRPcmdhbmlzYXRpb25cIiwge1xuICAgICAgb3JnYW5pc2F0aW9uTmFtZTogcHJvcHMub3JnYW5pc2F0aW9uTmFtZSxcbiAgICAgIGFjY291bnRzOiBwcm9wcy5hY2NvdW50cyxcbiAgICAgIG9yZ0VtYWlsOiBwcm9wcy5vcmdFbWFpbCxcbiAgICAgIGVudjogcHJvcHMuZW52LFxuICAgICAgZXhpc3RpbmdBY2NvdW50czogcHJvcHMuZXhpc3RpbmdBY2NvdW50c1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cE9yZ2FuaXNhdGlvbkZlYXR1cmVzKHByb3BzOiBNYW5hZ2VkT3JnYW5pc2F0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBvcmdBY2NvdW50cyA9IHRoaXMub3JnYW5pc2F0aW9uLmdldEFjY291bnRzKCk7XG4gICAgY29uc3QgcGxhdGZvcm1BY2NvdW50SWQgPSB0aGlzLmdldFBsYXRmb3JtQWNjb3VudElkKG9yZ0FjY291bnRzLCBwcm9wcyk7XG5cbiAgICB0aGlzLnNldHVwSXBhbURlbGVnYXRpb24ocGxhdGZvcm1BY2NvdW50SWQpO1xuICAgIHRoaXMuZW5hYmxlUmFtU2hhcmluZygpO1xuICAgIHRoaXMuZW5hYmxlVHJ1c3RlZEFjY2Vzcyhwcm9wcyk7XG4gICAgdGhpcy5lbmFibGVDb3N0QWxsb2NhdGlvblRhZ3MocHJvcHMpO1xuICAgIHRoaXMuc2V0dXBJZGVudGl0eUNlbnRlcihvcmdBY2NvdW50cywgcHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQbGF0Zm9ybUFjY291bnRJZChcbiAgICBvcmdBY2NvdW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBwcm9wczogTWFuYWdlZE9yZ2FuaXNhdGlvblByb3BzXG4gICkge1xuICAgIGNvbnN0IHBsYXRmb3JtRW50cnkgPSBPYmplY3QuZW50cmllcyhwcm9wcy5hY2NvdW50cykuZmluZChcbiAgICAgIChba2V5XSkgPT4ga2V5LnRvTG93ZXJDYXNlKCkgPT09IFwicGxhdGZvcm1cIlxuICAgICk7XG5cbiAgICBpZiAoIXBsYXRmb3JtRW50cnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ05vIHBsYXRmb3JtIGFjY291bnQgZm91bmQuIFBsZWFzZSBpbmNsdWRlIGEgXCJwbGF0Zm9ybVwiIGtleSBpbiB5b3VyIGFjY291bnRzIGNvbmZpZ3VyYXRpb24uJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY2NvdW50ID0gcGxhdGZvcm1FbnRyeVsxXTtcbiAgICBjb25zdCBwbGF0Zm9ybUFjY291bnQgPSBBcnJheS5pc0FycmF5KGFjY291bnQpID8gYWNjb3VudFswXSA6IGFjY291bnQ7XG5cbiAgICBjb25zdCBwbGF0Zm9ybUFjY291bnRJZCA9IG9yZ0FjY291bnRzW3BsYXRmb3JtQWNjb3VudF07XG5cbiAgICBpZiAoIXBsYXRmb3JtQWNjb3VudElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQbGF0Zm9ybSBhY2NvdW50IElEIG5vdCBmb3VuZCBmb3IgYWNjb3VudCBuYW1lOiAke3BsYXRmb3JtQWNjb3VudH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBwbGF0Zm9ybUFjY291bnRJZDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBJcGFtRGVsZWdhdGlvbihwbGF0Zm9ybUFjY291bnRJZDogc3RyaW5nKSB7XG4gICAgbmV3IElwYW1EZWxlZ2F0ZUFkbWluKHRoaXMsIFwiSXBhbURlbGVnYXRlQWRtaW5cIiwge1xuICAgICAgYWNjb3VudElkOiBwbGF0Zm9ybUFjY291bnRJZFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVSYW1TaGFyaW5nKCkge1xuICAgIG5ldyBSYW1TaGFyaW5nKHRoaXMsIFwiUmFtU2hhcmluZ1wiKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlVHJ1c3RlZEFjY2Vzcyhwcm9wczogTWFuYWdlZE9yZ2FuaXNhdGlvblByb3BzKSB7XG4gICAgbmV3IEFjdGl2YXRlT3JnYW5pc2F0aW9uc0FjY2Vzcyh0aGlzLCBcIkFjdGl2YXRlT3JnYW5pc2F0aW9uc0FjY2Vzc1wiLCB7XG4gICAgICBhY2NvdW50OiBwcm9wcy5lbnYuYWNjb3VudCxcbiAgICAgIHJlZ2lvbjogcHJvcHMuZW52LnJlZ2lvblxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVDb3N0QWxsb2NhdGlvblRhZ3MocHJvcHM6IE1hbmFnZWRPcmdhbmlzYXRpb25Qcm9wcykge1xuICAgIGlmIChwcm9wcy5jb3N0QWxsb2NhdGlvblRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbmV3IENvc3RBbGxvY2F0aW9uVGFncyh0aGlzLCBcIkNvc3RBbGxvY2F0aW9uVGFnc1wiLCB7XG4gICAgICAgIGNvc3RBbGxvY2F0aW9uVGFnczogcHJvcHMuY29zdEFsbG9jYXRpb25UYWdzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwSWRlbnRpdHlDZW50ZXIoXG4gICAgb3JnQWNjb3VudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgcHJvcHM6IE1hbmFnZWRPcmdhbmlzYXRpb25Qcm9wc1xuICApIHtcbiAgICBpZiAocHJvcHMuaWRlbnRpdHlDZW50ZXIpIHtcbiAgICAgIG5ldyBJZGVudGl0eUNlbnRlcih0aGlzLCBcIklkZW50aXR5Q2VudGVyXCIsIHtcbiAgICAgICAgYWNjb3VudHM6IG9yZ0FjY291bnRzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVudmlyb25tZW50Q29uZmlnKHByb3BzOiBNYW5hZ2VkT3JnYW5pc2F0aW9uUHJvcHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gQ29uZmlnLmxvYWRDb25maWcoKTtcbiAgICAgIC8vIENvbnZlcnQgYWNjb3VudHMgdG8gYWNjb3VudFR5cGVzIGZvcm1hdFxuICAgICAgY29uc3QgYWNjb3VudFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2VudlR5cGUsIGFjY291bnRzXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcy5hY2NvdW50cykpIHtcbiAgICAgICAgYWNjb3VudFR5cGVzW2VudlR5cGVdID0gQXJyYXkuaXNBcnJheShhY2NvdW50cykgPyBhY2NvdW50cyA6IFthY2NvdW50c107XG4gICAgICB9XG4gICAgICBjb25maWcudXBkYXRlUHJvdmlkZXJBY2NvdW50RW52aXJvbm1lbnRzKGFjY291bnRUeXBlcyk7XG4gICAgICBjb25maWcuc2F2ZUNvbmZpZygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiRmFpbGVkIHRvIHVwZGF0ZSBmamFsbC1jb25maWcuanNvbiB3aXRoIGVudmlyb25tZW50IG1hcHBpbmdzOlwiLFxuICAgICAgICBlcnJvclxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,11 +1,11 @@
1
1
  import { Construct } from "constructs";
2
2
  import { ManagedAccount, ManagedAccountProps } from "./managedAccount";
3
+ type AccountsConfig = {
4
+ readonly [key: string]: readonly string[] | string;
5
+ };
3
6
  interface ManagedPlatformProps extends ManagedAccountProps {
4
- orgAccounts: string[];
7
+ accounts: AccountsConfig;
5
8
  }
6
- /**
7
- * A stack for creating multi environment organisations with a production, staging and development account.
8
- */
9
9
  export declare class ManagedPlatform extends ManagedAccount {
10
10
  constructor(scope: Construct, id: string, props: ManagedPlatformProps);
11
11
  }
@@ -4,19 +4,18 @@ exports.ManagedPlatform = void 0;
4
4
  const ipam_1 = require("../../config/aws/ipam");
5
5
  const ipamPool_1 = require("../../resources/aws/networking/ipamPool");
6
6
  const managedAccount_1 = require("./managedAccount");
7
- /**
8
- * A stack for creating multi environment organisations with a production, staging and development account.
9
- */
10
7
  class ManagedPlatform extends managedAccount_1.ManagedAccount {
11
8
  constructor(scope, id, props) {
12
9
  super(scope, id, props);
13
10
  const ipam = new ipam_1.Ipam(this, "Ipam");
11
+ // Convert accounts to flat array for IpamPool
12
+ const orgAccounts = Object.values(props.accounts).flatMap((account) => Array.isArray(account) ? account : [account]);
14
13
  new ipamPool_1.IpamPool(this, "IpamPool", {
15
- orgAccounts: props.orgAccounts,
14
+ orgAccounts,
16
15
  region: props.region,
17
16
  ipamScope: ipam.privateDefaultScopeId
18
17
  });
19
18
  }
20
19
  }
21
20
  exports.ManagedPlatform = ManagedPlatform;
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZFBsYXRmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9tYW5hZ2VkUGxhdGZvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQTZDO0FBQzdDLHNFQUFtRTtBQUVuRSxxREFBdUU7QUFNdkU7O0dBRUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEsK0JBQWM7SUFDakQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEyQjtRQUNuRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixNQUFNLElBQUksR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFcEMsSUFBSSxtQkFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDN0IsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixTQUFTLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFaRCwwQ0FZQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElwYW0gfSBmcm9tIFwiLi4vLi4vY29uZmlnL2F3cy9pcGFtXCI7XG5pbXBvcnQgeyBJcGFtUG9vbCB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL25ldHdvcmtpbmcvaXBhbVBvb2xcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBNYW5hZ2VkQWNjb3VudCwgTWFuYWdlZEFjY291bnRQcm9wcyB9IGZyb20gXCIuL21hbmFnZWRBY2NvdW50XCI7XG5cbmludGVyZmFjZSBNYW5hZ2VkUGxhdGZvcm1Qcm9wcyBleHRlbmRzIE1hbmFnZWRBY2NvdW50UHJvcHMge1xuICBvcmdBY2NvdW50czogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBzdGFjayBmb3IgY3JlYXRpbmcgbXVsdGkgZW52aXJvbm1lbnQgb3JnYW5pc2F0aW9ucyB3aXRoIGEgcHJvZHVjdGlvbiwgc3RhZ2luZyBhbmQgZGV2ZWxvcG1lbnQgYWNjb3VudC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hbmFnZWRQbGF0Zm9ybSBleHRlbmRzIE1hbmFnZWRBY2NvdW50IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE1hbmFnZWRQbGF0Zm9ybVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBjb25zdCBpcGFtID0gbmV3IElwYW0odGhpcywgXCJJcGFtXCIpO1xuXG4gICAgbmV3IElwYW1Qb29sKHRoaXMsIFwiSXBhbVBvb2xcIiwge1xuICAgICAgb3JnQWNjb3VudHM6IHByb3BzLm9yZ0FjY291bnRzLFxuICAgICAgcmVnaW9uOiBwcm9wcy5yZWdpb24sXG4gICAgICBpcGFtU2NvcGU6IGlwYW0ucHJpdmF0ZURlZmF1bHRTY29wZUlkXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZFBsYXRmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9tYW5hZ2VkUGxhdGZvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQTZDO0FBQzdDLHNFQUFtRTtBQUVuRSxxREFBdUU7QUFVdkUsTUFBYSxlQUFnQixTQUFRLCtCQUFjO0lBQ2pELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkI7UUFDbkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxXQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXBDLDhDQUE4QztRQUM5QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNwRSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQzdDLENBQUM7UUFFRixJQUFJLG1CQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUM3QixXQUFXO1lBQ1gsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLFNBQVMsRUFBRSxJQUFJLENBQUMscUJBQXFCO1NBQ3RDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWpCRCwwQ0FpQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJcGFtIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvaXBhbVwiO1xuaW1wb3J0IHsgSXBhbVBvb2wgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9uZXR3b3JraW5nL2lwYW1Qb29sXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgTWFuYWdlZEFjY291bnQsIE1hbmFnZWRBY2NvdW50UHJvcHMgfSBmcm9tIFwiLi9tYW5hZ2VkQWNjb3VudFwiO1xuXG50eXBlIEFjY291bnRzQ29uZmlnID0ge1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiByZWFkb25seSBzdHJpbmdbXSB8IHN0cmluZztcbn07XG5cbmludGVyZmFjZSBNYW5hZ2VkUGxhdGZvcm1Qcm9wcyBleHRlbmRzIE1hbmFnZWRBY2NvdW50UHJvcHMge1xuICBhY2NvdW50czogQWNjb3VudHNDb25maWc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkUGxhdGZvcm0gZXh0ZW5kcyBNYW5hZ2VkQWNjb3VudCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBNYW5hZ2VkUGxhdGZvcm1Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgY29uc3QgaXBhbSA9IG5ldyBJcGFtKHRoaXMsIFwiSXBhbVwiKTtcblxuICAgIC8vIENvbnZlcnQgYWNjb3VudHMgdG8gZmxhdCBhcnJheSBmb3IgSXBhbVBvb2xcbiAgICBjb25zdCBvcmdBY2NvdW50cyA9IE9iamVjdC52YWx1ZXMocHJvcHMuYWNjb3VudHMpLmZsYXRNYXAoKGFjY291bnQpID0+XG4gICAgICBBcnJheS5pc0FycmF5KGFjY291bnQpID8gYWNjb3VudCA6IFthY2NvdW50XVxuICAgICk7XG5cbiAgICBuZXcgSXBhbVBvb2wodGhpcywgXCJJcGFtUG9vbFwiLCB7XG4gICAgICBvcmdBY2NvdW50cyxcbiAgICAgIHJlZ2lvbjogcHJvcHMucmVnaW9uLFxuICAgICAgaXBhbVNjb3BlOiBpcGFtLnByaXZhdGVEZWZhdWx0U2NvcGVJZFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,17 @@
1
+ import { Stack, StackProps } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ export interface ManagedPlatformStackSetProps extends StackProps {
4
+ }
5
+ /**
6
+ * A StackSet-compatible version of ManagedPlatform that uses CloudFormation parameters
7
+ * for accountId and region.
8
+ *
9
+ * Note: This creates IPAM infrastructure but not the individual account pools,
10
+ * as those require concrete account names at synthesis time. The pools should
11
+ * be created separately after the organization accounts are known.
12
+ *
13
+ * This is designed to be deployed ONLY to the platform account.
14
+ */
15
+ export declare class ManagedPlatformStackSet extends Stack {
16
+ constructor(scope: Construct, id: string, props?: ManagedPlatformStackSetProps);
17
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ManagedPlatformStackSet = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const managedAccount_1 = require("./managedAccount");
6
+ const ipam_1 = require("../../config/aws/ipam");
7
+ /**
8
+ * A StackSet-compatible version of ManagedPlatform that uses CloudFormation parameters
9
+ * for accountId and region.
10
+ *
11
+ * Note: This creates IPAM infrastructure but not the individual account pools,
12
+ * as those require concrete account names at synthesis time. The pools should
13
+ * be created separately after the organization accounts are known.
14
+ *
15
+ * This is designed to be deployed ONLY to the platform account.
16
+ */
17
+ class ManagedPlatformStackSet extends aws_cdk_lib_1.Stack {
18
+ constructor(scope, id, props) {
19
+ super(scope, id, props);
20
+ // Create parameters that will be populated by StackSet
21
+ const accountIdParam = new aws_cdk_lib_1.CfnParameter(this, "AccountId", {
22
+ type: "String",
23
+ description: "The AWS Account ID where this stack is being deployed",
24
+ default: this.account
25
+ });
26
+ const regionParam = new aws_cdk_lib_1.CfnParameter(this, "Region", {
27
+ type: "String",
28
+ description: "The AWS Region where this stack is being deployed",
29
+ default: this.region
30
+ });
31
+ // First, deploy the base ManagedAccount resources
32
+ const managedAccount = new managedAccount_1.ManagedAccount(this, "ManagedAccountResources", {
33
+ accountId: accountIdParam.valueAsString,
34
+ region: regionParam.valueAsString,
35
+ env: {
36
+ account: accountIdParam.valueAsString,
37
+ region: regionParam.valueAsString
38
+ }
39
+ });
40
+ // Create IPAM infrastructure (without pools)
41
+ const ipam = new ipam_1.Ipam(this, "Ipam");
42
+ }
43
+ }
44
+ exports.ManagedPlatformStackSet = ManagedPlatformStackSet;
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZFBsYXRmb3JtU3RhY2tTZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL21hbmFnZWRQbGF0Zm9ybVN0YWNrU2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4RDtBQUU5RCxxREFBa0Q7QUFDbEQsZ0RBQTZDO0FBTTdDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsdUJBQXdCLFNBQVEsbUJBQUs7SUFDaEQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBb0M7UUFFcEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsdURBQXVEO1FBQ3ZELE1BQU0sY0FBYyxHQUFHLElBQUksMEJBQVksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFO1lBQ3pELElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLHVEQUF1RDtZQUNwRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxXQUFXLEdBQUcsSUFBSSwwQkFBWSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDbkQsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQUUsbURBQW1EO1lBQ2hFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTTtTQUNyQixDQUFDLENBQUM7UUFFSCxrREFBa0Q7UUFDbEQsTUFBTSxjQUFjLEdBQUcsSUFBSSwrQkFBYyxDQUFDLElBQUksRUFBRSx5QkFBeUIsRUFBRTtZQUN6RSxTQUFTLEVBQUUsY0FBYyxDQUFDLGFBQWE7WUFDdkMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxhQUFhO1lBQ2pDLEdBQUcsRUFBRTtnQkFDSCxPQUFPLEVBQUUsY0FBYyxDQUFDLGFBQWE7Z0JBQ3JDLE1BQU0sRUFBRSxXQUFXLENBQUMsYUFBYTthQUNsQztTQUNGLENBQUMsQ0FBQztRQUVILDZDQUE2QztRQUM3QyxNQUFNLElBQUksR0FBRyxJQUFJLFdBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGO0FBbENELDBEQWtDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmblBhcmFtZXRlciwgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBNYW5hZ2VkQWNjb3VudCB9IGZyb20gXCIuL21hbmFnZWRBY2NvdW50XCI7XG5pbXBvcnQgeyBJcGFtIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9hd3MvaXBhbVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hbmFnZWRQbGF0Zm9ybVN0YWNrU2V0UHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgLy8gQWRkaXRpb25hbCBwcm9wcyBpZiBuZWVkZWRcbn1cblxuLyoqXG4gKiBBIFN0YWNrU2V0LWNvbXBhdGlibGUgdmVyc2lvbiBvZiBNYW5hZ2VkUGxhdGZvcm0gdGhhdCB1c2VzIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnNcbiAqIGZvciBhY2NvdW50SWQgYW5kIHJlZ2lvbi5cbiAqXG4gKiBOb3RlOiBUaGlzIGNyZWF0ZXMgSVBBTSBpbmZyYXN0cnVjdHVyZSBidXQgbm90IHRoZSBpbmRpdmlkdWFsIGFjY291bnQgcG9vbHMsXG4gKiBhcyB0aG9zZSByZXF1aXJlIGNvbmNyZXRlIGFjY291bnQgbmFtZXMgYXQgc3ludGhlc2lzIHRpbWUuIFRoZSBwb29scyBzaG91bGRcbiAqIGJlIGNyZWF0ZWQgc2VwYXJhdGVseSBhZnRlciB0aGUgb3JnYW5pemF0aW9uIGFjY291bnRzIGFyZSBrbm93bi5cbiAqXG4gKiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGRlcGxveWVkIE9OTFkgdG8gdGhlIHBsYXRmb3JtIGFjY291bnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkUGxhdGZvcm1TdGFja1NldCBleHRlbmRzIFN0YWNrIHtcbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzPzogTWFuYWdlZFBsYXRmb3JtU3RhY2tTZXRQcm9wc1xuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIC8vIENyZWF0ZSBwYXJhbWV0ZXJzIHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQgYnkgU3RhY2tTZXRcbiAgICBjb25zdCBhY2NvdW50SWRQYXJhbSA9IG5ldyBDZm5QYXJhbWV0ZXIodGhpcywgXCJBY2NvdW50SWRcIiwge1xuICAgICAgdHlwZTogXCJTdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBBV1MgQWNjb3VudCBJRCB3aGVyZSB0aGlzIHN0YWNrIGlzIGJlaW5nIGRlcGxveWVkXCIsXG4gICAgICBkZWZhdWx0OiB0aGlzLmFjY291bnRcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlZ2lvblBhcmFtID0gbmV3IENmblBhcmFtZXRlcih0aGlzLCBcIlJlZ2lvblwiLCB7XG4gICAgICB0eXBlOiBcIlN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIEFXUyBSZWdpb24gd2hlcmUgdGhpcyBzdGFjayBpcyBiZWluZyBkZXBsb3llZFwiLFxuICAgICAgZGVmYXVsdDogdGhpcy5yZWdpb25cbiAgICB9KTtcblxuICAgIC8vIEZpcnN0LCBkZXBsb3kgdGhlIGJhc2UgTWFuYWdlZEFjY291bnQgcmVzb3VyY2VzXG4gICAgY29uc3QgbWFuYWdlZEFjY291bnQgPSBuZXcgTWFuYWdlZEFjY291bnQodGhpcywgXCJNYW5hZ2VkQWNjb3VudFJlc291cmNlc1wiLCB7XG4gICAgICBhY2NvdW50SWQ6IGFjY291bnRJZFBhcmFtLnZhbHVlQXNTdHJpbmcsXG4gICAgICByZWdpb246IHJlZ2lvblBhcmFtLnZhbHVlQXNTdHJpbmcsXG4gICAgICBlbnY6IHtcbiAgICAgICAgYWNjb3VudDogYWNjb3VudElkUGFyYW0udmFsdWVBc1N0cmluZyxcbiAgICAgICAgcmVnaW9uOiByZWdpb25QYXJhbS52YWx1ZUFzU3RyaW5nXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgSVBBTSBpbmZyYXN0cnVjdHVyZSAod2l0aG91dCBwb29scylcbiAgICBjb25zdCBpcGFtID0gbmV3IElwYW0odGhpcywgXCJJcGFtXCIpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,11 @@
1
+ import { Construct } from "constructs";
2
+ export declare class AssignmentNew extends Construct {
3
+ constructor(scope: Construct, id: string, props: {
4
+ instanceArn: string;
5
+ permissionSetArn: string;
6
+ principalType: string;
7
+ principalId: string;
8
+ targetType: string;
9
+ targetId: string;
10
+ });
11
+ }
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AssignmentNew = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
6
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
7
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
8
+ const custom_resources_1 = require("aws-cdk-lib/custom-resources");
9
+ const constructs_1 = require("constructs");
10
+ const path_1 = require("path");
11
+ const aws_cdk_lib_2 = require("aws-cdk-lib");
12
+ class AssignmentNew extends constructs_1.Construct {
13
+ constructor(scope, id, props) {
14
+ super(scope, id);
15
+ // 1. Create a dedicated IAM role with the necessary permissions
16
+ const lambdaRole = new aws_iam_1.Role(this, `${id}LambdaRole`, {
17
+ assumedBy: new aws_iam_1.ServicePrincipal("lambda.amazonaws.com"),
18
+ description: `Role for AWS Identity Center Assignment for ${id}`,
19
+ inlinePolicies: {
20
+ // CloudWatch Logs permissions
21
+ "logs-policy": new aws_iam_1.PolicyDocument({
22
+ statements: [
23
+ new aws_iam_1.PolicyStatement({
24
+ effect: aws_iam_1.Effect.ALLOW,
25
+ actions: [
26
+ "logs:CreateLogGroup",
27
+ "logs:CreateLogStream",
28
+ "logs:PutLogEvents"
29
+ ],
30
+ resources: ["*"]
31
+ })
32
+ ]
33
+ }),
34
+ // SSO Admin permissions - comprehensive permissions for both sso: and sso-admin: namespaces
35
+ "sso-admin-policy": new aws_iam_1.PolicyDocument({
36
+ statements: [
37
+ new aws_iam_1.PolicyStatement({
38
+ effect: aws_iam_1.Effect.ALLOW,
39
+ actions: [
40
+ // SSO Admin permissions (using both prefixes to ensure compatibility)
41
+ "sso:*",
42
+ "sso-admin:CreateAccountAssignment",
43
+ "sso-admin:DeleteAccountAssignment",
44
+ "sso-admin:ListAccountAssignments",
45
+ "sso-admin:DescribeAccountAssignmentCreationStatus",
46
+ "sso-admin:DescribeAccountAssignmentDeletionStatus",
47
+ // Original SSO permissions (may still be needed)
48
+ "sso:CreateAccountAssignment",
49
+ "sso:UpdateAccountAssignment",
50
+ "sso:DeleteAccountAssignment",
51
+ "sso:ListAccountAssignments",
52
+ "sso:DescribeAccountAssignmentCreationStatus",
53
+ "sso:DescribeAccountAssignmentDeletionStatus",
54
+ // Identity Store permissions
55
+ "identitystore:DescribeGroup",
56
+ "identitystore:ListGroupMemberships",
57
+ "identitystore:ListUsers",
58
+ "identitystore:ListGroups",
59
+ // Organizations permissions that may be needed for cross-account operations
60
+ "organizations:DescribeAccount",
61
+ "organizations:ListAccounts"
62
+ ],
63
+ resources: ["*"]
64
+ })
65
+ ]
66
+ })
67
+ }
68
+ });
69
+ // 2. Create the Lambda function with the dedicated role
70
+ const lambda = new aws_lambda_1.Function(this, `${id}Lambda`, {
71
+ runtime: aws_lambda_1.Runtime.NODEJS_18_X,
72
+ code: aws_lambda_1.Code.fromAsset((0, path_1.join)(__dirname, "lambda")),
73
+ handler: "assignmentHandler.handler",
74
+ role: lambdaRole,
75
+ timeout: aws_cdk_lib_1.Duration.minutes(5),
76
+ description: `AWS Identity Center Assignment Handler for ${id}`,
77
+ logRetention: aws_logs_1.RetentionDays.ONE_WEEK,
78
+ memorySize: 256 // Increase memory for better performance
79
+ });
80
+ // 3. Create a custom resource provider
81
+ const provider = new custom_resources_1.Provider(this, `${id}Provider`, {
82
+ onEventHandler: lambda,
83
+ logRetention: aws_logs_1.RetentionDays.ONE_WEEK
84
+ });
85
+ // 4. Create the custom resource
86
+ new aws_cdk_lib_2.CustomResource(this, `${id}Resource`, {
87
+ serviceToken: provider.serviceToken,
88
+ properties: {
89
+ InstanceArn: props.instanceArn,
90
+ PermissionSetArn: props.permissionSetArn,
91
+ PrincipalType: props.principalType,
92
+ PrincipalId: props.principalId,
93
+ TargetType: props.targetType,
94
+ TargetId: props.targetId,
95
+ // Add a timestamp to ensure updates are processed
96
+ Timestamp: new Date().toISOString()
97
+ }
98
+ });
99
+ }
100
+ }
101
+ exports.AssignmentNew = AssignmentNew;
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWdubWVudE5ldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2lhbS9pZGVudGl0eUNlbnRlci9hc3NpZ25tZW50TmV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF1QztBQUN2QyxpREFNNkI7QUFDN0IsdURBQWlFO0FBQ2pFLG1EQUFxRDtBQUNyRCxtRUFBd0Q7QUFDeEQsMkNBQXVDO0FBQ3ZDLCtCQUE0QjtBQUM1Qiw2Q0FBNkM7QUFFN0MsTUFBYSxhQUFjLFNBQVEsc0JBQVM7SUFDMUMsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FPQztRQUVELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsZ0VBQWdFO1FBQ2hFLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFO1lBQ25ELFNBQVMsRUFBRSxJQUFJLDBCQUFnQixDQUFDLHNCQUFzQixDQUFDO1lBQ3ZELFdBQVcsRUFBRSwrQ0FBK0MsRUFBRSxFQUFFO1lBQ2hFLGNBQWMsRUFBRTtnQkFDZCw4QkFBOEI7Z0JBQzlCLGFBQWEsRUFBRSxJQUFJLHdCQUFjLENBQUM7b0JBQ2hDLFVBQVUsRUFBRTt3QkFDVixJQUFJLHlCQUFlLENBQUM7NEJBQ2xCLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7NEJBQ3BCLE9BQU8sRUFBRTtnQ0FDUCxxQkFBcUI7Z0NBQ3JCLHNCQUFzQjtnQ0FDdEIsbUJBQW1COzZCQUNwQjs0QkFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7eUJBQ2pCLENBQUM7cUJBQ0g7aUJBQ0YsQ0FBQztnQkFDRiw0RkFBNEY7Z0JBQzVGLGtCQUFrQixFQUFFLElBQUksd0JBQWMsQ0FBQztvQkFDckMsVUFBVSxFQUFFO3dCQUNWLElBQUkseUJBQWUsQ0FBQzs0QkFDbEIsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSzs0QkFDcEIsT0FBTyxFQUFFO2dDQUNQLHNFQUFzRTtnQ0FDdEUsT0FBTztnQ0FDUCxtQ0FBbUM7Z0NBQ25DLG1DQUFtQztnQ0FDbkMsa0NBQWtDO2dDQUNsQyxtREFBbUQ7Z0NBQ25ELG1EQUFtRDtnQ0FFbkQsaURBQWlEO2dDQUNqRCw2QkFBNkI7Z0NBQzdCLDZCQUE2QjtnQ0FDN0IsNkJBQTZCO2dDQUM3Qiw0QkFBNEI7Z0NBQzVCLDZDQUE2QztnQ0FDN0MsNkNBQTZDO2dDQUU3Qyw2QkFBNkI7Z0NBQzdCLDZCQUE2QjtnQ0FDN0Isb0NBQW9DO2dDQUNwQyx5QkFBeUI7Z0NBQ3pCLDBCQUEwQjtnQ0FFMUIsNEVBQTRFO2dDQUM1RSwrQkFBK0I7Z0NBQy9CLDRCQUE0Qjs2QkFDN0I7NEJBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO3lCQUNqQixDQUFDO3FCQUNIO2lCQUNGLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztRQUVILHdEQUF3RDtRQUN4RCxNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUU7WUFDL0MsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxTQUFTLENBQUMsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9DLE9BQU8sRUFBRSwyQkFBMkI7WUFDcEMsSUFBSSxFQUFFLFVBQVU7WUFDaEIsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM1QixXQUFXLEVBQUUsOENBQThDLEVBQUUsRUFBRTtZQUMvRCxZQUFZLEVBQUUsd0JBQWEsQ0FBQyxRQUFRO1lBQ3BDLFVBQVUsRUFBRSxHQUFHLENBQUMseUNBQXlDO1NBQzFELENBQUMsQ0FBQztRQUVILHVDQUF1QztRQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLDJCQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUU7WUFDbkQsY0FBYyxFQUFFLE1BQU07WUFDdEIsWUFBWSxFQUFFLHdCQUFhLENBQUMsUUFBUTtTQUNyQyxDQUFDLENBQUM7UUFFSCxnQ0FBZ0M7UUFDaEMsSUFBSSw0QkFBYyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFO1lBQ3hDLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtZQUNuQyxVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUM5QixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO2dCQUN4QyxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7Z0JBQ2xDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUM1QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7Z0JBQ3hCLGtEQUFrRDtnQkFDbEQsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2FBQ3BDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBMUdELHNDQTBHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1xuICBQb2xpY3lEb2N1bWVudCxcbiAgUG9saWN5U3RhdGVtZW50LFxuICBFZmZlY3QsXG4gIFJvbGUsXG4gIFNlcnZpY2VQcmluY2lwYWxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IEN1c3RvbVJlc291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbmV4cG9ydCBjbGFzcyBBc3NpZ25tZW50TmV3IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiB7XG4gICAgICBpbnN0YW5jZUFybjogc3RyaW5nO1xuICAgICAgcGVybWlzc2lvblNldEFybjogc3RyaW5nO1xuICAgICAgcHJpbmNpcGFsVHlwZTogc3RyaW5nO1xuICAgICAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgICAgIHRhcmdldFR5cGU6IHN0cmluZztcbiAgICAgIHRhcmdldElkOiBzdHJpbmc7XG4gICAgfVxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gMS4gQ3JlYXRlIGEgZGVkaWNhdGVkIElBTSByb2xlIHdpdGggdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9uc1xuICAgIGNvbnN0IGxhbWJkYVJvbGUgPSBuZXcgUm9sZSh0aGlzLCBgJHtpZH1MYW1iZGFSb2xlYCwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbChcImxhbWJkYS5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgZGVzY3JpcHRpb246IGBSb2xlIGZvciBBV1MgSWRlbnRpdHkgQ2VudGVyIEFzc2lnbm1lbnQgZm9yICR7aWR9YCxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIC8vIENsb3VkV2F0Y2ggTG9ncyBwZXJtaXNzaW9uc1xuICAgICAgICBcImxvZ3MtcG9saWN5XCI6IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgXCJsb2dzOkNyZWF0ZUxvZ0dyb3VwXCIsXG4gICAgICAgICAgICAgICAgXCJsb2dzOkNyZWF0ZUxvZ1N0cmVhbVwiLFxuICAgICAgICAgICAgICAgIFwibG9nczpQdXRMb2dFdmVudHNcIlxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICB9KSxcbiAgICAgICAgLy8gU1NPIEFkbWluIHBlcm1pc3Npb25zIC0gY29tcHJlaGVuc2l2ZSBwZXJtaXNzaW9ucyBmb3IgYm90aCBzc286IGFuZCBzc28tYWRtaW46IG5hbWVzcGFjZXNcbiAgICAgICAgXCJzc28tYWRtaW4tcG9saWN5XCI6IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgLy8gU1NPIEFkbWluIHBlcm1pc3Npb25zICh1c2luZyBib3RoIHByZWZpeGVzIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgICAgIFwic3NvOipcIixcbiAgICAgICAgICAgICAgICBcInNzby1hZG1pbjpDcmVhdGVBY2NvdW50QXNzaWdubWVudFwiLFxuICAgICAgICAgICAgICAgIFwic3NvLWFkbWluOkRlbGV0ZUFjY291bnRBc3NpZ25tZW50XCIsXG4gICAgICAgICAgICAgICAgXCJzc28tYWRtaW46TGlzdEFjY291bnRBc3NpZ25tZW50c1wiLFxuICAgICAgICAgICAgICAgIFwic3NvLWFkbWluOkRlc2NyaWJlQWNjb3VudEFzc2lnbm1lbnRDcmVhdGlvblN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIFwic3NvLWFkbWluOkRlc2NyaWJlQWNjb3VudEFzc2lnbm1lbnREZWxldGlvblN0YXR1c1wiLFxuXG4gICAgICAgICAgICAgICAgLy8gT3JpZ2luYWwgU1NPIHBlcm1pc3Npb25zIChtYXkgc3RpbGwgYmUgbmVlZGVkKVxuICAgICAgICAgICAgICAgIFwic3NvOkNyZWF0ZUFjY291bnRBc3NpZ25tZW50XCIsXG4gICAgICAgICAgICAgICAgXCJzc286VXBkYXRlQWNjb3VudEFzc2lnbm1lbnRcIixcbiAgICAgICAgICAgICAgICBcInNzbzpEZWxldGVBY2NvdW50QXNzaWdubWVudFwiLFxuICAgICAgICAgICAgICAgIFwic3NvOkxpc3RBY2NvdW50QXNzaWdubWVudHNcIixcbiAgICAgICAgICAgICAgICBcInNzbzpEZXNjcmliZUFjY291bnRBc3NpZ25tZW50Q3JlYXRpb25TdGF0dXNcIixcbiAgICAgICAgICAgICAgICBcInNzbzpEZXNjcmliZUFjY291bnRBc3NpZ25tZW50RGVsZXRpb25TdGF0dXNcIixcblxuICAgICAgICAgICAgICAgIC8vIElkZW50aXR5IFN0b3JlIHBlcm1pc3Npb25zXG4gICAgICAgICAgICAgICAgXCJpZGVudGl0eXN0b3JlOkRlc2NyaWJlR3JvdXBcIixcbiAgICAgICAgICAgICAgICBcImlkZW50aXR5c3RvcmU6TGlzdEdyb3VwTWVtYmVyc2hpcHNcIixcbiAgICAgICAgICAgICAgICBcImlkZW50aXR5c3RvcmU6TGlzdFVzZXJzXCIsXG4gICAgICAgICAgICAgICAgXCJpZGVudGl0eXN0b3JlOkxpc3RHcm91cHNcIixcblxuICAgICAgICAgICAgICAgIC8vIE9yZ2FuaXphdGlvbnMgcGVybWlzc2lvbnMgdGhhdCBtYXkgYmUgbmVlZGVkIGZvciBjcm9zcy1hY2NvdW50IG9wZXJhdGlvbnNcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6RGVzY3JpYmVBY2NvdW50XCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb25zOkxpc3RBY2NvdW50c1wiXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyAyLiBDcmVhdGUgdGhlIExhbWJkYSBmdW5jdGlvbiB3aXRoIHRoZSBkZWRpY2F0ZWQgcm9sZVxuICAgIGNvbnN0IGxhbWJkYSA9IG5ldyBGdW5jdGlvbih0aGlzLCBgJHtpZH1MYW1iZGFgLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoam9pbihfX2Rpcm5hbWUsIFwibGFtYmRhXCIpKSxcbiAgICAgIGhhbmRsZXI6IFwiYXNzaWdubWVudEhhbmRsZXIuaGFuZGxlclwiLFxuICAgICAgcm9sZTogbGFtYmRhUm9sZSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICBkZXNjcmlwdGlvbjogYEFXUyBJZGVudGl0eSBDZW50ZXIgQXNzaWdubWVudCBIYW5kbGVyIGZvciAke2lkfWAsXG4gICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX1dFRUssXG4gICAgICBtZW1vcnlTaXplOiAyNTYgLy8gSW5jcmVhc2UgbWVtb3J5IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICB9KTtcblxuICAgIC8vIDMuIENyZWF0ZSBhIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlclxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IFByb3ZpZGVyKHRoaXMsIGAke2lkfVByb3ZpZGVyYCwge1xuICAgICAgb25FdmVudEhhbmRsZXI6IGxhbWJkYSxcbiAgICAgIGxvZ1JldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfV0VFS1xuICAgIH0pO1xuXG4gICAgLy8gNC4gQ3JlYXRlIHRoZSBjdXN0b20gcmVzb3VyY2VcbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgYCR7aWR9UmVzb3VyY2VgLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgSW5zdGFuY2VBcm46IHByb3BzLmluc3RhbmNlQXJuLFxuICAgICAgICBQZXJtaXNzaW9uU2V0QXJuOiBwcm9wcy5wZXJtaXNzaW9uU2V0QXJuLFxuICAgICAgICBQcmluY2lwYWxUeXBlOiBwcm9wcy5wcmluY2lwYWxUeXBlLFxuICAgICAgICBQcmluY2lwYWxJZDogcHJvcHMucHJpbmNpcGFsSWQsXG4gICAgICAgIFRhcmdldFR5cGU6IHByb3BzLnRhcmdldFR5cGUsXG4gICAgICAgIFRhcmdldElkOiBwcm9wcy50YXJnZXRJZCxcbiAgICAgICAgLy8gQWRkIGEgdGltZXN0YW1wIHRvIGVuc3VyZSB1cGRhdGVzIGFyZSBwcm9jZXNzZWRcbiAgICAgICAgVGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,24 @@
1
+ interface CloudFormationEvent {
2
+ RequestType: "Create" | "Update" | "Delete";
3
+ ResponseURL: string;
4
+ StackId: string;
5
+ RequestId: string;
6
+ ResourceType: string;
7
+ LogicalResourceId: string;
8
+ PhysicalResourceId?: string;
9
+ ResourceProperties: {
10
+ ServiceToken: string;
11
+ InstanceArn: string;
12
+ PermissionSetArn: string;
13
+ PrincipalType: string;
14
+ PrincipalId: string;
15
+ TargetType: string;
16
+ TargetId: string;
17
+ [key: string]: any;
18
+ };
19
+ OldResourceProperties?: {
20
+ [key: string]: any;
21
+ };
22
+ }
23
+ export declare const handler: (event: CloudFormationEvent) => Promise<any>;
24
+ export {};