@fjall/components-infrastructure 2.30.0 → 2.30.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/lib/__tests__/setup.d.ts +48 -0
  2. package/dist/lib/__tests__/setup.js +1 -0
  3. package/dist/lib/config/aws/accountId.d.ts +6 -0
  4. package/dist/lib/config/aws/accountId.js +33 -0
  5. package/dist/lib/config/aws/backupGlobalSettings.d.ts +29 -0
  6. package/dist/lib/config/aws/backupGlobalSettings.js +51 -0
  7. package/dist/lib/config/aws/costAllocationTags.d.ts +12 -0
  8. package/dist/lib/config/aws/costAllocationTags.js +48 -0
  9. package/dist/lib/config/aws/eventBus.d.ts +7 -0
  10. package/dist/lib/config/aws/eventBus.js +24 -0
  11. package/dist/lib/config/aws/identityCenterGroupMembership.d.ts +10 -0
  12. package/dist/lib/config/aws/identityCenterGroupMembership.js +115 -0
  13. package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +8 -0
  14. package/dist/lib/config/aws/ipamDelegateAdmin.js +58 -0
  15. package/dist/lib/config/aws/ipamPoolId.d.ts +10 -0
  16. package/dist/lib/config/aws/ipamPoolId.js +39 -0
  17. package/dist/lib/config/aws/organisation.d.ts +30 -0
  18. package/dist/lib/config/aws/organisation.js +95 -0
  19. package/dist/lib/config/aws/organisationId.d.ts +7 -0
  20. package/dist/lib/config/aws/organisationId.js +46 -0
  21. package/dist/lib/config/aws/organisationsAccess.d.ts +10 -0
  22. package/dist/lib/config/aws/organisationsAccess.js +50 -0
  23. package/dist/lib/config/aws/ramSharing.d.ts +4 -0
  24. package/dist/lib/config/aws/ramSharing.js +35 -0
  25. package/dist/lib/config/monitoring.d.ts +18 -0
  26. package/dist/lib/config/monitoring.js +22 -0
  27. package/dist/lib/patterns/aws/cicdRole.d.ts +67 -0
  28. package/dist/lib/patterns/aws/cicdRole.js +68 -0
  29. package/dist/lib/patterns/aws/compute.js +9 -0
  30. package/dist/lib/patterns/aws/computeLambda.d.ts +38 -3
  31. package/dist/lib/patterns/aws/computeLambda.js +29 -2
  32. package/dist/lib/patterns/aws/hostedZone.d.ts +28 -0
  33. package/dist/lib/patterns/aws/hostedZone.js +150 -0
  34. package/dist/lib/patterns/aws/managedAccount.d.ts +9 -0
  35. package/dist/lib/patterns/aws/managedAccount.js +55 -0
  36. package/dist/lib/patterns/aws/managedIdentityCenter.d.ts +4 -0
  37. package/dist/lib/patterns/aws/managedIdentityCenter.js +24 -0
  38. package/dist/lib/patterns/aws/managedOrganisation.d.ts +36 -0
  39. package/dist/lib/patterns/aws/managedOrganisation.js +97 -0
  40. package/dist/lib/patterns/aws/managedPlatform.d.ts +12 -0
  41. package/dist/lib/patterns/aws/managedPlatform.js +29 -0
  42. package/dist/lib/patterns/aws/subdomainHostedZone.d.ts +9 -0
  43. package/dist/lib/patterns/aws/subdomainHostedZone.js +39 -0
  44. package/dist/lib/resources/aws/cicd/cicdRole.d.ts +65 -0
  45. package/dist/lib/resources/aws/cicd/cicdRole.js +191 -0
  46. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +75 -0
  47. package/dist/lib/resources/aws/compute/ecsFreeTier.js +1 -0
  48. package/dist/lib/resources/aws/compute/ecsImages.js +3 -25
  49. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +75 -0
  50. package/dist/lib/resources/aws/compute/ecsSpot.js +1 -0
  51. package/dist/lib/resources/aws/compute/imageTagParameter.d.ts +12 -0
  52. package/dist/lib/resources/aws/compute/imageTagParameter.js +32 -0
  53. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +20 -0
  54. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +1 -0
  55. package/dist/lib/resources/aws/database/database.d.ts +14 -0
  56. package/dist/lib/resources/aws/database/database.js +28 -0
  57. package/dist/lib/resources/aws/database/databaseInstance.d.ts +15 -0
  58. package/dist/lib/resources/aws/database/databaseInstance.js +30 -0
  59. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +13 -0
  60. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +52 -0
  61. package/dist/lib/resources/aws/iam/securityGroup.d.ts +5 -0
  62. package/dist/lib/resources/aws/iam/securityGroup.js +14 -0
  63. package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +28 -0
  64. package/dist/lib/resources/aws/monitoring/monitoringRole.js +125 -0
  65. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +5 -0
  66. package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -0
  67. package/dist/lib/utils/addSuffixToEmail.js +5 -1
  68. package/dist/lib/utils/capitalizeString.d.ts +1 -0
  69. package/dist/lib/utils/capitalizeString.js +7 -0
  70. package/package.json +4 -4
  71. package/dist/lib/config/aws/identityCenterMembership.d.ts +0 -11
  72. package/dist/lib/config/aws/identityCenterMembership.js +0 -61
@@ -0,0 +1,6 @@
1
+ import { CfnOutput } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ export declare class AccountId extends Construct {
4
+ readonly accountId: CfnOutput;
5
+ constructor(scope: Construct, id: string);
6
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AccountId = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const customResources = require("aws-cdk-lib/custom-resources");
6
+ const constructs_1 = require("constructs");
7
+ const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
8
+ class AccountId extends constructs_1.Construct {
9
+ constructor(scope, id) {
10
+ super(scope, id);
11
+ const sts = new awsCustomResource_1.AwsCustomResource(this, "GetAccountIdResource", {
12
+ functionName: "getAccountId",
13
+ onCreate: {
14
+ service: "sts",
15
+ action: "GetCallerIdentityCommand", // https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sts/command/GetCallerIdentityCommand/
16
+ physicalResourceId: customResources.PhysicalResourceId.of("getAccountId")
17
+ },
18
+ onUpdate: {
19
+ service: "sts",
20
+ action: "GetCallerIdentityCommand", // https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sts/command/GetCallerIdentityCommand/
21
+ physicalResourceId: customResources.PhysicalResourceId.of("getAccountId")
22
+ },
23
+ resourceType: "Custom::getAccountId"
24
+ });
25
+ this.accountId = new aws_cdk_lib_1.CfnOutput(this, "AccountIdOutput", {
26
+ key: "AccountId",
27
+ value: sts.getResponseField("Account"),
28
+ exportName: "AccountId"
29
+ });
30
+ }
31
+ }
32
+ exports.AccountId = AccountId;
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudElkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2NvbmZpZy9hd3MvYWNjb3VudElkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF3QztBQUN4QyxnRUFBZ0U7QUFDaEUsMkNBQXVDO0FBRXZDLHVGQUFvRjtBQUVwRixNQUFhLFNBQVUsU0FBUSxzQkFBUztJQUd0QyxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sR0FBRyxHQUFHLElBQUkscUNBQWlCLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQzlELFlBQVksRUFBRSxjQUFjO1lBQzVCLFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsS0FBSztnQkFDZCxNQUFNLEVBQUUsMEJBQTBCLEVBQUUsc0dBQXNHO2dCQUMxSSxrQkFBa0IsRUFDaEIsZUFBZSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUM7YUFDeEQ7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFLDBCQUEwQixFQUFFLHNHQUFzRztnQkFDMUksa0JBQWtCLEVBQ2hCLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ3hEO1lBQ0QsWUFBWSxFQUFFLHNCQUFzQjtTQUNyQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDdEQsR0FBRyxFQUFFLFdBQVc7WUFDaEIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7WUFDdEMsVUFBVSxFQUFFLFdBQVc7U0FDeEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBN0JELDhCQTZCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgY3VzdG9tUmVzb3VyY2VzIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL3V0aWxpdGllcy9hd3NDdXN0b21SZXNvdXJjZVwiO1xuXG5leHBvcnQgY2xhc3MgQWNjb3VudElkIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGFjY291bnRJZDogQ2ZuT3V0cHV0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qgc3RzID0gbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiR2V0QWNjb3VudElkUmVzb3VyY2VcIiwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBcImdldEFjY291bnRJZFwiLFxuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJzdHNcIixcbiAgICAgICAgYWN0aW9uOiBcIkdldENhbGxlcklkZW50aXR5Q29tbWFuZFwiLCAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy92My9sYXRlc3QvY2xpZW50L3N0cy9jb21tYW5kL0dldENhbGxlcklkZW50aXR5Q29tbWFuZC9cbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOlxuICAgICAgICAgIGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXCJnZXRBY2NvdW50SWRcIilcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcInN0c1wiLFxuICAgICAgICBhY3Rpb246IFwiR2V0Q2FsbGVySWRlbnRpdHlDb21tYW5kXCIsIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL3YzL2xhdGVzdC9jbGllbnQvc3RzL2NvbW1hbmQvR2V0Q2FsbGVySWRlbnRpdHlDb21tYW5kL1xuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6XG4gICAgICAgICAgY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcImdldEFjY291bnRJZFwiKVxuICAgICAgfSxcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OmdldEFjY291bnRJZFwiXG4gICAgfSk7XG5cbiAgICB0aGlzLmFjY291bnRJZCA9IG5ldyBDZm5PdXRwdXQodGhpcywgXCJBY2NvdW50SWRPdXRwdXRcIiwge1xuICAgICAga2V5OiBcIkFjY291bnRJZFwiLFxuICAgICAgdmFsdWU6IHN0cy5nZXRSZXNwb25zZUZpZWxkKFwiQWNjb3VudFwiKSxcbiAgICAgIGV4cG9ydE5hbWU6IFwiQWNjb3VudElkXCJcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,29 @@
1
+ import { Construct } from "constructs";
2
+ import { type StackProps } from "aws-cdk-lib";
3
+ interface BackupGlobalSettingsProps extends StackProps {
4
+ account: string;
5
+ region: string;
6
+ /**
7
+ * Enable cross-account backup copying.
8
+ * Required for enterprise tier backups to compliance account.
9
+ * @default true
10
+ */
11
+ enableCrossAccountBackup?: boolean;
12
+ /**
13
+ * Enable delegated administrator for AWS Backup.
14
+ * Allows managing backups from a member account instead of root.
15
+ * Recommended for security best practices.
16
+ * @default false
17
+ */
18
+ enableDelegatedAdministrator?: boolean;
19
+ /**
20
+ * Enable Multi-Party Approval for backup restores.
21
+ * Requires approval workflow for restore operations.
22
+ * @default false
23
+ */
24
+ enableMpa?: boolean;
25
+ }
26
+ export declare class BackupGlobalSettings extends Construct {
27
+ constructor(scope: Construct, id: string, props: BackupGlobalSettingsProps);
28
+ }
29
+ export {};
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BackupGlobalSettings = void 0;
4
+ const customResources = require("aws-cdk-lib/custom-resources");
5
+ const constructs_1 = require("constructs");
6
+ const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
7
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
8
+ class BackupGlobalSettings extends constructs_1.Construct {
9
+ constructor(scope, id, props) {
10
+ super(scope, id);
11
+ const { enableCrossAccountBackup = true, enableDelegatedAdministrator = false, enableMpa = false } = props;
12
+ const globalSettings = {
13
+ isCrossAccountBackupEnabled: enableCrossAccountBackup.toString(),
14
+ isDelegatedAdministratorEnabled: enableDelegatedAdministrator.toString(),
15
+ isMpaEnabled: enableMpa.toString()
16
+ };
17
+ // Update global settings on create and update
18
+ new awsCustomResource_1.AwsCustomResource(this, "BackupGlobalSettings", {
19
+ functionName: "updateBackupGlobalSettings",
20
+ onCreate: {
21
+ service: "backup",
22
+ action: "UpdateGlobalSettingsCommand",
23
+ parameters: {
24
+ GlobalSettings: globalSettings
25
+ },
26
+ physicalResourceId: customResources.PhysicalResourceId.of("BackupGlobalSettings")
27
+ },
28
+ onUpdate: {
29
+ service: "backup",
30
+ action: "UpdateGlobalSettingsCommand",
31
+ parameters: {
32
+ GlobalSettings: globalSettings
33
+ },
34
+ physicalResourceId: customResources.PhysicalResourceId.of("BackupGlobalSettings")
35
+ },
36
+ resourceType: "Custom::BackupGlobalSettings",
37
+ policy: customResources.AwsCustomResourcePolicy.fromStatements([
38
+ new aws_iam_1.PolicyStatement({
39
+ actions: [
40
+ "backup:UpdateGlobalSettings",
41
+ "backup:DescribeGlobalSettings"
42
+ ],
43
+ resources: ["*"],
44
+ effect: aws_iam_1.Effect.ALLOW
45
+ })
46
+ ])
47
+ });
48
+ }
49
+ }
50
+ exports.BackupGlobalSettings = BackupGlobalSettings;
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwR2xvYmFsU2V0dGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9iYWNrdXBHbG9iYWxTZXR0aW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnRUFBZ0U7QUFDaEUsMkNBQXVDO0FBQ3ZDLHVGQUFvRjtBQUNwRixpREFBOEQ7QUEyQjlELE1BQWEsb0JBQXFCLFNBQVEsc0JBQVM7SUFDakQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQztRQUN4RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sRUFDSix3QkFBd0IsR0FBRyxJQUFJLEVBQy9CLDRCQUE0QixHQUFHLEtBQUssRUFDcEMsU0FBUyxHQUFHLEtBQUssRUFDbEIsR0FBRyxLQUFLLENBQUM7UUFFVixNQUFNLGNBQWMsR0FBMkI7WUFDN0MsMkJBQTJCLEVBQUUsd0JBQXdCLENBQUMsUUFBUSxFQUFFO1lBQ2hFLCtCQUErQixFQUFFLDRCQUE0QixDQUFDLFFBQVEsRUFBRTtZQUN4RSxZQUFZLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRTtTQUNuQyxDQUFDO1FBRUYsOENBQThDO1FBQzlDLElBQUkscUNBQWlCLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQ2xELFlBQVksRUFBRSw0QkFBNEI7WUFDMUMsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxRQUFRO2dCQUNqQixNQUFNLEVBQUUsNkJBQTZCO2dCQUNyQyxVQUFVLEVBQUU7b0JBQ1YsY0FBYyxFQUFFLGNBQWM7aUJBQy9CO2dCQUNELGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQ3ZELHNCQUFzQixDQUN2QjthQUNGO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxRQUFRO2dCQUNqQixNQUFNLEVBQUUsNkJBQTZCO2dCQUNyQyxVQUFVLEVBQUU7b0JBQ1YsY0FBYyxFQUFFLGNBQWM7aUJBQy9CO2dCQUNELGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQ3ZELHNCQUFzQixDQUN2QjthQUNGO1lBQ0QsWUFBWSxFQUFFLDhCQUE4QjtZQUM1QyxNQUFNLEVBQUUsZUFBZSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQztnQkFDN0QsSUFBSSx5QkFBZSxDQUFDO29CQUNsQixPQUFPLEVBQUU7d0JBQ1AsNkJBQTZCO3dCQUM3QiwrQkFBK0I7cUJBQ2hDO29CQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDaEIsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztpQkFDckIsQ0FBQzthQUNILENBQUM7U0FDSCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFwREQsb0RBb0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3VzdG9tUmVzb3VyY2VzIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQXdzQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCB7IEVmZmVjdCwgUG9saWN5U3RhdGVtZW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IHR5cGUgU3RhY2tQcm9wcyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5pbnRlcmZhY2UgQmFja3VwR2xvYmFsU2V0dGluZ3NQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICBhY2NvdW50OiBzdHJpbmc7XG4gIHJlZ2lvbjogc3RyaW5nO1xuICAvKipcbiAgICogRW5hYmxlIGNyb3NzLWFjY291bnQgYmFja3VwIGNvcHlpbmcuXG4gICAqIFJlcXVpcmVkIGZvciBlbnRlcnByaXNlIHRpZXIgYmFja3VwcyB0byBjb21wbGlhbmNlIGFjY291bnQuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZUNyb3NzQWNjb3VudEJhY2t1cD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbmFibGUgZGVsZWdhdGVkIGFkbWluaXN0cmF0b3IgZm9yIEFXUyBCYWNrdXAuXG4gICAqIEFsbG93cyBtYW5hZ2luZyBiYWNrdXBzIGZyb20gYSBtZW1iZXIgYWNjb3VudCBpbnN0ZWFkIG9mIHJvb3QuXG4gICAqIFJlY29tbWVuZGVkIGZvciBzZWN1cml0eSBiZXN0IHByYWN0aWNlcy5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGVuYWJsZURlbGVnYXRlZEFkbWluaXN0cmF0b3I/OiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlIE11bHRpLVBhcnR5IEFwcHJvdmFsIGZvciBiYWNrdXAgcmVzdG9yZXMuXG4gICAqIFJlcXVpcmVzIGFwcHJvdmFsIHdvcmtmbG93IGZvciByZXN0b3JlIG9wZXJhdGlvbnMuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBlbmFibGVNcGE/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgQmFja3VwR2xvYmFsU2V0dGluZ3MgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQmFja3VwR2xvYmFsU2V0dGluZ3NQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVDcm9zc0FjY291bnRCYWNrdXAgPSB0cnVlLFxuICAgICAgZW5hYmxlRGVsZWdhdGVkQWRtaW5pc3RyYXRvciA9IGZhbHNlLFxuICAgICAgZW5hYmxlTXBhID0gZmFsc2VcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBnbG9iYWxTZXR0aW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGlzQ3Jvc3NBY2NvdW50QmFja3VwRW5hYmxlZDogZW5hYmxlQ3Jvc3NBY2NvdW50QmFja3VwLnRvU3RyaW5nKCksXG4gICAgICBpc0RlbGVnYXRlZEFkbWluaXN0cmF0b3JFbmFibGVkOiBlbmFibGVEZWxlZ2F0ZWRBZG1pbmlzdHJhdG9yLnRvU3RyaW5nKCksXG4gICAgICBpc01wYUVuYWJsZWQ6IGVuYWJsZU1wYS50b1N0cmluZygpXG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBnbG9iYWwgc2V0dGluZ3Mgb24gY3JlYXRlIGFuZCB1cGRhdGVcbiAgICBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJCYWNrdXBHbG9iYWxTZXR0aW5nc1wiLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IFwidXBkYXRlQmFja3VwR2xvYmFsU2V0dGluZ3NcIixcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwiYmFja3VwXCIsXG4gICAgICAgIGFjdGlvbjogXCJVcGRhdGVHbG9iYWxTZXR0aW5nc0NvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEdsb2JhbFNldHRpbmdzOiBnbG9iYWxTZXR0aW5nc1xuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgXCJCYWNrdXBHbG9iYWxTZXR0aW5nc1wiXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcImJhY2t1cFwiLFxuICAgICAgICBhY3Rpb246IFwiVXBkYXRlR2xvYmFsU2V0dGluZ3NDb21tYW5kXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBHbG9iYWxTZXR0aW5nczogZ2xvYmFsU2V0dGluZ3NcbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjdXN0b21SZXNvdXJjZXMuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgIFwiQmFja3VwR2xvYmFsU2V0dGluZ3NcIlxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6QmFja3VwR2xvYmFsU2V0dGluZ3NcIixcbiAgICAgIHBvbGljeTogY3VzdG9tUmVzb3VyY2VzLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TdGF0ZW1lbnRzKFtcbiAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgXCJiYWNrdXA6VXBkYXRlR2xvYmFsU2V0dGluZ3NcIixcbiAgICAgICAgICAgIFwiYmFja3VwOkRlc2NyaWJlR2xvYmFsU2V0dGluZ3NcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XXG4gICAgICAgIH0pXG4gICAgICBdKVxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,12 @@
1
+ import { Construct } from "constructs";
2
+ export interface ICostAllocationTags {
3
+ TagKey: string;
4
+ Status: string;
5
+ }
6
+ interface CostAllocationTagsProps {
7
+ costAllocationTags: ICostAllocationTags[];
8
+ }
9
+ export declare class CostAllocationTags extends Construct {
10
+ constructor(scope: Construct, id: string, props: CostAllocationTagsProps);
11
+ }
12
+ export {};
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CostAllocationTags = void 0;
4
+ const customResources = require("aws-cdk-lib/custom-resources");
5
+ const constructs_1 = require("constructs");
6
+ const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
7
+ function toggleCostTag(tags, tagStatus) {
8
+ return tags.map((tag) => {
9
+ return {
10
+ TagKey: tag.TagKey,
11
+ Status: tagStatus
12
+ };
13
+ });
14
+ }
15
+ class CostAllocationTags extends constructs_1.Construct {
16
+ constructor(scope, id, props) {
17
+ super(scope, id);
18
+ new awsCustomResource_1.AwsCustomResource(this, "costAllocationTags", {
19
+ functionName: "enableCostAllocationTags",
20
+ onCreate: {
21
+ service: "CostExplorer",
22
+ action: "updateCostAllocationTagsStatus",
23
+ parameters: {
24
+ CostAllocationTagsStatus: toggleCostTag(props.costAllocationTags, "Active")
25
+ },
26
+ physicalResourceId: customResources.PhysicalResourceId.of("enableCostAllocationTags")
27
+ },
28
+ onUpdate: {
29
+ service: "CostExplorer",
30
+ action: "updateCostAllocationTagsStatus",
31
+ parameters: {
32
+ CostAllocationTagsStatus: toggleCostTag(props.costAllocationTags, "Active")
33
+ },
34
+ physicalResourceId: customResources.PhysicalResourceId.of("updateCostAllocationTags")
35
+ },
36
+ onDelete: {
37
+ service: "CostExplorer",
38
+ action: "updateCostAllocationTagsStatus",
39
+ parameters: {
40
+ CostAllocationTagsStatus: toggleCostTag(props.costAllocationTags, "Inactive")
41
+ }
42
+ },
43
+ resourceType: "Custom::CostAllocationTags"
44
+ });
45
+ }
46
+ }
47
+ exports.CostAllocationTags = CostAllocationTags;
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zdEFsbG9jYXRpb25UYWdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2NvbmZpZy9hd3MvY29zdEFsbG9jYXRpb25UYWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdFQUFnRTtBQUNoRSwyQ0FBdUM7QUFFdkMsdUZBQW9GO0FBV3BGLFNBQVMsYUFBYSxDQUFDLElBQTJCLEVBQUUsU0FBaUI7SUFDbkUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDdEIsT0FBTztZQUNMLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNsQixNQUFNLEVBQUUsU0FBUztTQUNsQixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUztJQUMvQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxxQ0FBaUIsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7WUFDaEQsWUFBWSxFQUFFLDBCQUEwQjtZQUN4QyxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLGNBQWM7Z0JBQ3ZCLE1BQU0sRUFBRSxnQ0FBZ0M7Z0JBQ3hDLFVBQVUsRUFBRTtvQkFDVix3QkFBd0IsRUFBRSxhQUFhLENBQ3JDLEtBQUssQ0FBQyxrQkFBa0IsRUFDeEIsUUFBUSxDQUNUO2lCQUNGO2dCQUNELGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQ3ZELDBCQUEwQixDQUMzQjthQUNGO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxjQUFjO2dCQUN2QixNQUFNLEVBQUUsZ0NBQWdDO2dCQUN4QyxVQUFVLEVBQUU7b0JBQ1Ysd0JBQXdCLEVBQUUsYUFBYSxDQUNyQyxLQUFLLENBQUMsa0JBQWtCLEVBQ3hCLFFBQVEsQ0FDVDtpQkFDRjtnQkFDRCxrQkFBa0IsRUFBRSxlQUFlLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUN2RCwwQkFBMEIsQ0FDM0I7YUFDRjtZQUNELFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsY0FBYztnQkFDdkIsTUFBTSxFQUFFLGdDQUFnQztnQkFDeEMsVUFBVSxFQUFFO29CQUNWLHdCQUF3QixFQUFFLGFBQWEsQ0FDckMsS0FBSyxDQUFDLGtCQUFrQixFQUN4QixVQUFVLENBQ1g7aUJBQ0Y7YUFDRjtZQUNELFlBQVksRUFBRSw0QkFBNEI7U0FDM0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBN0NELGdEQTZDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGN1c3RvbVJlc291cmNlcyBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuaW1wb3J0IHsgQXdzQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQ29zdEFsbG9jYXRpb25UYWdzIHtcbiAgVGFnS2V5OiBzdHJpbmc7XG4gIFN0YXR1czogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ29zdEFsbG9jYXRpb25UYWdzUHJvcHMge1xuICBjb3N0QWxsb2NhdGlvblRhZ3M6IElDb3N0QWxsb2NhdGlvblRhZ3NbXTtcbn1cblxuZnVuY3Rpb24gdG9nZ2xlQ29zdFRhZyh0YWdzOiBJQ29zdEFsbG9jYXRpb25UYWdzW10sIHRhZ1N0YXR1czogc3RyaW5nKSB7XG4gIHJldHVybiB0YWdzLm1hcCgodGFnKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFRhZ0tleTogdGFnLlRhZ0tleSxcbiAgICAgIFN0YXR1czogdGFnU3RhdHVzXG4gICAgfTtcbiAgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb3N0QWxsb2NhdGlvblRhZ3MgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ29zdEFsbG9jYXRpb25UYWdzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiY29zdEFsbG9jYXRpb25UYWdzXCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogXCJlbmFibGVDb3N0QWxsb2NhdGlvblRhZ3NcIixcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwiQ29zdEV4cGxvcmVyXCIsXG4gICAgICAgIGFjdGlvbjogXCJ1cGRhdGVDb3N0QWxsb2NhdGlvblRhZ3NTdGF0dXNcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIENvc3RBbGxvY2F0aW9uVGFnc1N0YXR1czogdG9nZ2xlQ29zdFRhZyhcbiAgICAgICAgICAgIHByb3BzLmNvc3RBbGxvY2F0aW9uVGFncyxcbiAgICAgICAgICAgIFwiQWN0aXZlXCJcbiAgICAgICAgICApXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBcImVuYWJsZUNvc3RBbGxvY2F0aW9uVGFnc1wiXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIkNvc3RFeHBsb3JlclwiLFxuICAgICAgICBhY3Rpb246IFwidXBkYXRlQ29zdEFsbG9jYXRpb25UYWdzU3RhdHVzXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBDb3N0QWxsb2NhdGlvblRhZ3NTdGF0dXM6IHRvZ2dsZUNvc3RUYWcoXG4gICAgICAgICAgICBwcm9wcy5jb3N0QWxsb2NhdGlvblRhZ3MsXG4gICAgICAgICAgICBcIkFjdGl2ZVwiXG4gICAgICAgICAgKVxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgXCJ1cGRhdGVDb3N0QWxsb2NhdGlvblRhZ3NcIlxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgc2VydmljZTogXCJDb3N0RXhwbG9yZXJcIixcbiAgICAgICAgYWN0aW9uOiBcInVwZGF0ZUNvc3RBbGxvY2F0aW9uVGFnc1N0YXR1c1wiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgQ29zdEFsbG9jYXRpb25UYWdzU3RhdHVzOiB0b2dnbGVDb3N0VGFnKFxuICAgICAgICAgICAgcHJvcHMuY29zdEFsbG9jYXRpb25UYWdzLFxuICAgICAgICAgICAgXCJJbmFjdGl2ZVwiXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6Q29zdEFsbG9jYXRpb25UYWdzXCJcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,7 @@
1
+ import { CfnOutput } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ export declare class DefaultEventBus extends Construct {
4
+ readonly defaultEventBusName: CfnOutput;
5
+ readonly defaultEventBusArn: CfnOutput;
6
+ constructor(scope: Construct, id: string);
7
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultEventBus = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const Events = require("aws-cdk-lib/aws-events");
6
+ const constructs_1 = require("constructs");
7
+ class DefaultEventBus extends constructs_1.Construct {
8
+ constructor(scope, id) {
9
+ super(scope, id);
10
+ const eventBridge = Events.EventBus.fromEventBusName(this, "defaultEventBus", "default");
11
+ this.defaultEventBusName = new aws_cdk_lib_1.CfnOutput(this, "defaultEventBusName", {
12
+ key: `defaultEventBusName`,
13
+ value: eventBridge.eventBusName,
14
+ exportName: "defaultEventBusName"
15
+ });
16
+ this.defaultEventBusArn = new aws_cdk_lib_1.CfnOutput(this, "defaultEventBusArn", {
17
+ key: `defaultEventBusArn`,
18
+ value: eventBridge.eventBusArn,
19
+ exportName: "defaultEventBusArn"
20
+ });
21
+ }
22
+ }
23
+ exports.DefaultEventBus = DefaultEventBus;
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRCdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9ldmVudEJ1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBd0M7QUFDeEMsaURBQWlEO0FBQ2pELDJDQUF1QztBQUV2QyxNQUFhLGVBQWdCLFNBQVEsc0JBQVM7SUFJNUMsWUFBWSxLQUFnQixFQUFFLEVBQVU7UUFDdEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUNsRCxJQUFJLEVBQ0osaUJBQWlCLEVBQ2pCLFNBQVMsQ0FDVixDQUFDO1FBRUYsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUU7WUFDcEUsR0FBRyxFQUFFLHFCQUFxQjtZQUMxQixLQUFLLEVBQUUsV0FBVyxDQUFDLFlBQVk7WUFDL0IsVUFBVSxFQUFFLHFCQUFxQjtTQUNsQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUNsRSxHQUFHLEVBQUUsb0JBQW9CO1lBQ3pCLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVztZQUM5QixVQUFVLEVBQUUsb0JBQW9CO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXpCRCwwQ0F5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIEV2ZW50cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGNsYXNzIERlZmF1bHRFdmVudEJ1cyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0RXZlbnRCdXNOYW1lOiBDZm5PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0RXZlbnRCdXNBcm46IENmbk91dHB1dDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGV2ZW50QnJpZGdlID0gRXZlbnRzLkV2ZW50QnVzLmZyb21FdmVudEJ1c05hbWUoXG4gICAgICB0aGlzLFxuICAgICAgXCJkZWZhdWx0RXZlbnRCdXNcIixcbiAgICAgIFwiZGVmYXVsdFwiXG4gICAgKTtcblxuICAgIHRoaXMuZGVmYXVsdEV2ZW50QnVzTmFtZSA9IG5ldyBDZm5PdXRwdXQodGhpcywgXCJkZWZhdWx0RXZlbnRCdXNOYW1lXCIsIHtcbiAgICAgIGtleTogYGRlZmF1bHRFdmVudEJ1c05hbWVgLFxuICAgICAgdmFsdWU6IGV2ZW50QnJpZGdlLmV2ZW50QnVzTmFtZSxcbiAgICAgIGV4cG9ydE5hbWU6IFwiZGVmYXVsdEV2ZW50QnVzTmFtZVwiXG4gICAgfSk7XG5cbiAgICB0aGlzLmRlZmF1bHRFdmVudEJ1c0FybiA9IG5ldyBDZm5PdXRwdXQodGhpcywgXCJkZWZhdWx0RXZlbnRCdXNBcm5cIiwge1xuICAgICAga2V5OiBgZGVmYXVsdEV2ZW50QnVzQXJuYCxcbiAgICAgIHZhbHVlOiBldmVudEJyaWRnZS5ldmVudEJ1c0FybixcbiAgICAgIGV4cG9ydE5hbWU6IFwiZGVmYXVsdEV2ZW50QnVzQXJuXCJcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,10 @@
1
+ import { NestedStack, type StackProps } from "aws-cdk-lib";
2
+ import { type Construct } from "constructs";
3
+ interface IdentityCenterGroupMembershipProps extends StackProps {
4
+ groupName: string;
5
+ groupMembers: string[];
6
+ }
7
+ export declare class IdentityCenterGroupMembership extends NestedStack {
8
+ constructor(scope: Construct, id: string, props: IdentityCenterGroupMembershipProps);
9
+ }
10
+ export {};
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IdentityCenterGroupMembership = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const customResources = require("aws-cdk-lib/custom-resources");
6
+ const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
7
+ // TODO: This requires a deletion and recreation to update
8
+ class IdentityCenterGroupMembership extends aws_cdk_lib_1.NestedStack {
9
+ constructor(scope, id, props) {
10
+ super(scope, id);
11
+ const identityStoreId = aws_cdk_lib_1.Fn.importValue("identityStoreId");
12
+ const groupId = aws_cdk_lib_1.Fn.importValue(`${props.groupName}GroupId`);
13
+ for (const member of props.groupMembers) {
14
+ const memberGroup = member
15
+ .split("@")[0]
16
+ .split(/[^a-zA-Z0-9]/)
17
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
18
+ .join("") +
19
+ props.groupName.charAt(0).toUpperCase() +
20
+ props.groupName.slice(1);
21
+ const listUser = new awsCustomResource_1.AwsCustomResource(this, `ListUsersResource${memberGroup}`, {
22
+ functionName: `listUsers${memberGroup}`,
23
+ onCreate: {
24
+ service: "identityStore",
25
+ action: "listUsers",
26
+ parameters: {
27
+ IdentityStoreId: identityStoreId,
28
+ Filters: [
29
+ {
30
+ AttributePath: "UserName",
31
+ AttributeValue: member
32
+ }
33
+ ]
34
+ },
35
+ physicalResourceId: customResources.PhysicalResourceId.of(`listUsers${memberGroup}`)
36
+ },
37
+ onUpdate: {
38
+ service: "identityStore",
39
+ action: "listusers",
40
+ parameters: {
41
+ IdentityStoreId: identityStoreId,
42
+ Filters: [
43
+ {
44
+ AttributePath: "UserName",
45
+ AttributeValue: member
46
+ }
47
+ ]
48
+ },
49
+ physicalResourceId: customResources.PhysicalResourceId.of(`listUsers${memberGroup}`)
50
+ }
51
+ });
52
+ const userId = listUser.getResponseField("Users.0.UserId");
53
+ const groupMembershipId = new awsCustomResource_1.AwsCustomResource(this, `CreateGroupMembershipResource${memberGroup}`, {
54
+ functionName: "createGroupMembership",
55
+ onCreate: {
56
+ service: "identityStore",
57
+ action: "createGroupMembership",
58
+ parameters: {
59
+ GroupId: groupId,
60
+ IdentityStoreId: identityStoreId,
61
+ MemberId: {
62
+ UserId: userId
63
+ }
64
+ },
65
+ physicalResourceId: customResources.PhysicalResourceId.of(`createGroupMembership${memberGroup}`)
66
+ },
67
+ resourceType: "Custom::IdentityCenterUsers"
68
+ });
69
+ const refreshMembership = new awsCustomResource_1.AwsCustomResource(this, `RefreshMembershipResource${memberGroup}`, {
70
+ functionName: `refreshGroupMembership${memberGroup}`,
71
+ onUpdate: {
72
+ service: "identityStore",
73
+ action: "deleteGroupMembership",
74
+ parameters: {
75
+ IdentityStoreId: identityStoreId,
76
+ MembershipId: groupMembershipId.getResponseField("MembershipId")
77
+ },
78
+ physicalResourceId: customResources.PhysicalResourceId.of(`refreshGroupMembership${memberGroup}`)
79
+ },
80
+ resourceType: "Custom::IdentityCenterUsers"
81
+ });
82
+ const recreateMembership = new awsCustomResource_1.AwsCustomResource(this, `RecreateGroupMembershipResource${memberGroup}`, {
83
+ functionName: `recreateGroupMembership${memberGroup}`,
84
+ onUpdate: {
85
+ service: "identityStore",
86
+ action: "createGroupMembership",
87
+ parameters: {
88
+ GroupId: groupId,
89
+ IdentityStoreId: identityStoreId,
90
+ MemberId: {
91
+ UserId: userId
92
+ }
93
+ },
94
+ physicalResourceId: customResources.PhysicalResourceId.of(`recreateGroupMembership${memberGroup}`)
95
+ },
96
+ resourceType: "Custom::IdentityCenterUsers"
97
+ });
98
+ refreshMembership.node.addDependency(recreateMembership);
99
+ new awsCustomResource_1.AwsCustomResource(this, `DeleteGroupMembershipResource${memberGroup}`, {
100
+ functionName: "deleteGroupMembership",
101
+ onDelete: {
102
+ service: "identityStore",
103
+ action: "deleteGroupMembership",
104
+ parameters: {
105
+ IdentityStoreId: identityStoreId,
106
+ MembershipId: groupMembershipId.getResponseField("MembershipId")
107
+ }
108
+ },
109
+ resourceType: "Custom::IdentityCenterUsers"
110
+ });
111
+ }
112
+ }
113
+ }
114
+ exports.IdentityCenterGroupMembership = IdentityCenterGroupMembership;
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHlDZW50ZXJHcm91cE1lbWJlcnNoaXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9pZGVudGl0eUNlbnRlckdyb3VwTWVtYmVyc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBK0Q7QUFDL0QsZ0VBQWdFO0FBQ2hFLHVGQUFvRjtBQVFwRiwwREFBMEQ7QUFDMUQsTUFBYSw2QkFBOEIsU0FBUSx5QkFBVztJQUM1RCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUF5QztRQUV6QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sZUFBZSxHQUFHLGdCQUFFLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsZ0JBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQztRQUU1RCxLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QyxNQUFNLFdBQVcsR0FDZixNQUFNO2lCQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2IsS0FBSyxDQUFDLGNBQWMsQ0FBQztpQkFDckIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNELElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO2dCQUN2QyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUzQixNQUFNLFFBQVEsR0FBRyxJ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QkFDRjtnQkFDRCxZQUFZLEVBQUUsNkJBQTZCO2FBQzVDLENBQ0YsQ0FBQztZQUVGLGlCQUFpQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUV6RCxJQUFJLHFDQUFpQixDQUNuQixJQUFJLEVBQ0osZ0NBQWdDLFdBQVcsRUFBRSxFQUM3QztnQkFDRSxZQUFZLEVBQUUsdUJBQXVCO2dCQUNyQyxRQUFRLEVBQUU7b0JBQ1IsT0FBTyxFQUFFLGVBQWU7b0JBQ3hCLE1BQU0sRUFBRSx1QkFBdUI7b0JBQy9CLFVBQVUsRUFBRTt3QkFDVixlQUFlLEVBQUUsZUFBZTt3QkFDaEMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQztxQkFDakU7aUJBQ0Y7Z0JBQ0QsWUFBWSxFQUFFLDZCQUE2QjthQUM1QyxDQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBckpELHNFQXFKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZuLCBOZXN0ZWRTdGFjaywgdHlwZSBTdGFja1Byb3BzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBjdXN0b21SZXNvdXJjZXMgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvdXRpbGl0aWVzL2F3c0N1c3RvbVJlc291cmNlXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmludGVyZmFjZSBJZGVudGl0eUNlbnRlckdyb3VwTWVtYmVyc2hpcFByb3BzIGV4dGVuZHMgU3RhY2tQcm9wcyB7XG4gIGdyb3VwTmFtZTogc3RyaW5nO1xuICBncm91cE1lbWJlcnM6IHN0cmluZ1tdO1xufVxuXG4vLyBUT0RPOiBUaGlzIHJlcXVpcmVzIGEgZGVsZXRpb24gYW5kIHJlY3JlYXRpb24gdG8gdXBkYXRlXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlDZW50ZXJHcm91cE1lbWJlcnNoaXAgZXh0ZW5kcyBOZXN0ZWRTdGFjayB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSWRlbnRpdHlDZW50ZXJHcm91cE1lbWJlcnNoaXBQcm9wc1xuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgaWRlbnRpdHlTdG9yZUlkID0gRm4uaW1wb3J0VmFsdWUoXCJpZGVudGl0eVN0b3JlSWRcIik7XG4gICAgY29uc3QgZ3JvdXBJZCA9IEZuLmltcG9ydFZhbHVlKGAke3Byb3BzLmdyb3VwTmFtZX1Hcm91cElkYCk7XG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcm9wcy5ncm91cE1lbWJlcnMpIHtcbiAgICAgIGNvbnN0IG1lbWJlckdyb3VwID1cbiAgICAgICAgbWVtYmVyXG4gICAgICAgICAgLnNwbGl0KFwiQFwiKVswXVxuICAgICAgICAgIC5zcGxpdCgvW15hLXpBLVowLTldLylcbiAgICAgICAgICAubWFwKChwYXJ0KSA9PiBwYXJ0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcGFydC5zbGljZSgxKSlcbiAgICAgICAgICAuam9pbihcIlwiKSArXG4gICAgICAgIHByb3BzLmdyb3VwTmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArXG4gICAgICAgIHByb3BzLmdyb3VwTmFtZS5zbGljZSgxKTtcblxuICAgICAgY29uc3QgbGlzdFVzZXIgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGBMaXN0VXNlcnNSZXNvdXJjZSR7bWVtYmVyR3JvdXB9YCxcbiAgICAgICAge1xuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogYGxpc3RVc2VycyR7bWVtYmVyR3JvdXB9YCxcbiAgICAgICAgICBvbkNyZWF0ZToge1xuICAgICAgICAgICAgc2VydmljZTogXCJpZGVudGl0eVN0b3JlXCIsXG4gICAgICAgICAgICBhY3Rpb246IFwibGlzdFVzZXJzXCIsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgIElkZW50aXR5U3RvcmVJZDogaWRlbnRpdHlTdG9yZUlkLFxuICAgICAgICAgICAgICBGaWx0ZXJzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgQXR0cmlidXRlUGF0aDogXCJVc2VyTmFtZVwiLFxuICAgICAgICAgICAgICAgICAgQXR0cmlidXRlVmFsdWU6IG1lbWJlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICAgICAgYGxpc3RVc2VycyR7bWVtYmVyR3JvdXB9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgICAgIHNlcnZpY2U6IFwiaWRlbnRpdHlTdG9yZVwiLFxuICAgICAgICAgICAgYWN0aW9uOiBcImxpc3R1c2Vyc1wiLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBJZGVudGl0eVN0b3JlSWQ6IGlkZW50aXR5U3RvcmVJZCxcbiAgICAgICAgICAgICAgRmlsdGVyczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVBhdGg6IFwiVXNlck5hbWVcIixcbiAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVZhbHVlOiBtZW1iZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICAgIGBsaXN0VXNlcnMke21lbWJlckdyb3VwfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHVzZXJJZCA9IGxpc3RVc2VyLmdldFJlc3BvbnNlRmllbGQoXCJVc2Vycy4wLlVzZXJJZFwiKTtcblxuICAgICAgY29uc3QgZ3JvdXBNZW1iZXJzaGlwSWQgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGBDcmVhdGVHcm91cE1lbWJlcnNoaXBSZXNvdXJjZSR7bWVtYmVyR3JvdXB9YCxcbiAgICAgICAge1xuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogXCJjcmVhdGVHcm91cE1lbWJlcnNoaXBcIixcbiAgICAgICAgICBvbkNyZWF0ZToge1xuICAgICAgICAgICAgc2VydmljZTogXCJpZGVudGl0eVN0b3JlXCIsXG4gICAgICAgICAgICBhY3Rpb246IFwiY3JlYXRlR3JvdXBNZW1iZXJzaGlwXCIsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgIEdyb3VwSWQ6IGdyb3VwSWQsXG4gICAgICAgICAgICAgIElkZW50aXR5U3RvcmVJZDogaWRlbnRpdHlTdG9yZUlkLFxuICAgICAgICAgICAgICBNZW1iZXJJZDoge1xuICAgICAgICAgICAgICAgIFVzZXJJZDogdXNlcklkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICAgIGBjcmVhdGVHcm91cE1lbWJlcnNoaXAke21lbWJlckdyb3VwfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OklkZW50aXR5Q2VudGVyVXNlcnNcIlxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCByZWZyZXNoTWVtYmVyc2hpcCA9IG5ldyBBd3NDdXN0b21SZXNvdXJjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYFJlZnJlc2hNZW1iZXJzaGlwUmVzb3VyY2Uke21lbWJlckdyb3VwfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6IGByZWZyZXNoR3JvdXBNZW1iZXJzaGlwJHttZW1iZXJHcm91cH1gLFxuICAgICAgICAgIG9uVXBkYXRlOiB7XG4gICAgICAgICAgICBzZXJ2aWNlOiBcImlkZW50aXR5U3RvcmVcIixcbiAgICAgICAgICAgIGFjdGlvbjogXCJkZWxldGVHcm91cE1lbWJlcnNoaXBcIixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgSWRlbnRpdHlTdG9yZUlkOiBpZGVudGl0eVN0b3JlSWQsXG4gICAgICAgICAgICAgIE1lbWJlcnNoaXBJZDogZ3JvdXBNZW1iZXJzaGlwSWQuZ2V0UmVzcG9uc2VGaWVsZChcIk1lbWJlcnNoaXBJZFwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICAgICAgYHJlZnJlc2hHcm91cE1lbWJlcnNoaXAke21lbWJlckdyb3VwfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OklkZW50aXR5Q2VudGVyVXNlcnNcIlxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCByZWNyZWF0ZU1lbWJlcnNoaXAgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGBSZWNyZWF0ZUdyb3VwTWVtYmVyc2hpcFJlc291cmNlJHttZW1iZXJHcm91cH1gLFxuICAgICAgICB7XG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiBgcmVjcmVhdGVHcm91cE1lbWJlcnNoaXAke21lbWJlckdyb3VwfWAsXG4gICAgICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgICAgIHNlcnZpY2U6IFwiaWRlbnRpdHlTdG9yZVwiLFxuICAgICAgICAgICAgYWN0aW9uOiBcImNyZWF0ZUdyb3VwTWVtYmVyc2hpcFwiLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBHcm91cElkOiBncm91cElkLFxuICAgICAgICAgICAgICBJZGVudGl0eVN0b3JlSWQ6IGlkZW50aXR5U3RvcmVJZCxcbiAgICAgICAgICAgICAgTWVtYmVySWQ6IHtcbiAgICAgICAgICAgICAgICBVc2VySWQ6IHVzZXJJZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjdXN0b21SZXNvdXJjZXMuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgICAgICBgcmVjcmVhdGVHcm91cE1lbWJlcnNoaXAke21lbWJlckdyb3VwfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OklkZW50aXR5Q2VudGVyVXNlcnNcIlxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZWZyZXNoTWVtYmVyc2hpcC5ub2RlLmFkZERlcGVuZGVuY3kocmVjcmVhdGVNZW1iZXJzaGlwKTtcblxuICAgICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgRGVsZXRlR3JvdXBNZW1iZXJzaGlwUmVzb3VyY2Uke21lbWJlckdyb3VwfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6IFwiZGVsZXRlR3JvdXBNZW1iZXJzaGlwXCIsXG4gICAgICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgICAgIHNlcnZpY2U6IFwiaWRlbnRpdHlTdG9yZVwiLFxuICAgICAgICAgICAgYWN0aW9uOiBcImRlbGV0ZUdyb3VwTWVtYmVyc2hpcFwiLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBJZGVudGl0eVN0b3JlSWQ6IGlkZW50aXR5U3RvcmVJZCxcbiAgICAgICAgICAgICAgTWVtYmVyc2hpcElkOiBncm91cE1lbWJlcnNoaXBJZC5nZXRSZXNwb25zZUZpZWxkKFwiTWVtYmVyc2hpcElkXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpJZGVudGl0eUNlbnRlclVzZXJzXCJcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ import { Construct } from "constructs";
2
+ interface IpamDelegateAdminProps {
3
+ accountId: string;
4
+ }
5
+ export declare class IpamDelegateAdmin extends Construct {
6
+ constructor(scope: Construct, id: string, props: IpamDelegateAdminProps);
7
+ }
8
+ export {};
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IpamDelegateAdmin = void 0;
4
+ const customResources = require("aws-cdk-lib/custom-resources");
5
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
6
+ const constructs_1 = require("constructs");
7
+ const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
8
+ class IpamDelegateAdmin extends constructs_1.Construct {
9
+ constructor(scope, id, props) {
10
+ super(scope, id);
11
+ new awsCustomResource_1.AwsCustomResource(this, "ipamDelegateAdmin", {
12
+ functionName: "ipamDelegateAdmin",
13
+ onCreate: {
14
+ service: "EC2",
15
+ action: "enableIpamOrganizationAdminAccount", // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/EC2.html#enableIpamOrganizationAdminAccount-property
16
+ parameters: {
17
+ DryRun: false,
18
+ DelegatedAdminAccountId: props.accountId
19
+ },
20
+ physicalResourceId: customResources.PhysicalResourceId.of("ipamDelegateAdmin")
21
+ },
22
+ onUpdate: {
23
+ service: "EC2",
24
+ action: "enableIpamOrganizationAdminAccount",
25
+ parameters: {
26
+ DryRun: false,
27
+ DelegatedAdminAccountId: props.accountId
28
+ },
29
+ physicalResourceId: customResources.PhysicalResourceId.of("ipamDelegateAdmin")
30
+ },
31
+ onDelete: {
32
+ service: "EC2",
33
+ action: "disableIpamOrganizationAdminAccount", // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/EC2.html#disableIpamOrganizationAdminAccount-property
34
+ parameters: {
35
+ DryRun: false,
36
+ DelegatedAdminAccountId: props.accountId
37
+ }
38
+ },
39
+ resourceType: "Custom::ipamDelegateAdmin",
40
+ policy: customResources.AwsCustomResourcePolicy.fromStatements([
41
+ new aws_iam_1.PolicyStatement({
42
+ actions: [
43
+ "ec2:EnableIpamOrganizationAdminAccount",
44
+ "ec2:DisableIpamOrganizationAdminAccount",
45
+ "organizations:EnableAWSServiceAccess",
46
+ "organizations:DisableAWSServiceAccess",
47
+ "organizations:RegisterDelegatedAdministrator",
48
+ "organizations:DeregisterDelegatedAdministrator",
49
+ "iam:CreateServiceLinkedRole"
50
+ ],
51
+ resources: ["*"] // TODO: Find out the exact principal for this
52
+ })
53
+ ])
54
+ });
55
+ }
56
+ }
57
+ exports.IpamDelegateAdmin = IpamDelegateAdmin;
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBhbURlbGVnYXRlQWRtaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9pcGFtRGVsZWdhdGVBZG1pbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnRUFBZ0U7QUFDaEUsaURBQXNEO0FBQ3RELDJDQUF1QztBQUN2Qyx1RkFBb0Y7QUFNcEYsTUFBYSxpQkFBa0IsU0FBUSxzQkFBUztJQUM5QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTZCO1FBQ3JFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxxQ0FBaUIsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDL0MsWUFBWSxFQUFFLG1CQUFtQjtZQUNqQyxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFLG9DQUFvQyxFQUFFLCtHQUErRztnQkFDN0osVUFBVSxFQUFFO29CQUNWLE1BQU0sRUFBRSxLQUFLO29CQUNiLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxTQUFTO2lCQUN6QztnQkFDRCxrQkFBa0IsRUFDaEIsZUFBZSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQzthQUM3RDtZQUNELFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsS0FBSztnQkFDZCxNQUFNLEVBQUUsb0NBQW9DO2dCQUM1QyxVQUFVLEVBQUU7b0JBQ1YsTUFBTSxFQUFFLEtBQUs7b0JBQ2IsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLFNBQVM7aUJBQ3pDO2dCQUNELGtCQUFrQixFQUNoQixlQUFlLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDO2FBQzdEO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE1BQU0sRUFBRSxxQ0FBcUMsRUFBRSxnSEFBZ0g7Z0JBQy9KLFVBQVUsRUFBRTtvQkFDVixNQUFNLEVBQUUsS0FBSztvQkFDYix1QkFBdUIsRUFBRSxLQUFLLENBQUMsU0FBUztpQkFDekM7YUFDRjtZQUNELFlBQVksRUFBRSwyQkFBMkI7WUFDekMsTUFBTSxFQUFFLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUM7Z0JBQzdELElBQUkseUJBQWUsQ0FBQztvQkFDbEIsT0FBTyxFQUFFO3dCQUNQLHdDQUF3Qzt3QkFDeEMseUNBQXlDO3dCQUN6QyxzQ0FBc0M7d0JBQ3RDLHVDQUF1Qzt3QkFDdkMsOENBQThDO3dCQUM5QyxnREFBZ0Q7d0JBQ2hELDZCQUE2QjtxQkFDOUI7b0JBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsOENBQThDO2lCQUNoRSxDQUFDO2FBQ0gsQ0FBQztTQUNILENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQW5ERCw4Q0FtREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjdXN0b21SZXNvdXJjZXMgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQXdzQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcblxuaW50ZXJmYWNlIElwYW1EZWxlZ2F0ZUFkbWluUHJvcHMge1xuICBhY2NvdW50SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIElwYW1EZWxlZ2F0ZUFkbWluIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElwYW1EZWxlZ2F0ZUFkbWluUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiaXBhbURlbGVnYXRlQWRtaW5cIiwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBcImlwYW1EZWxlZ2F0ZUFkbWluXCIsXG4gICAgICBvbkNyZWF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIkVDMlwiLFxuICAgICAgICBhY3Rpb246IFwiZW5hYmxlSXBhbU9yZ2FuaXphdGlvbkFkbWluQWNjb3VudFwiLCAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy9sYXRlc3QvQVdTL0VDMi5odG1sI2VuYWJsZUlwYW1Pcmdhbml6YXRpb25BZG1pbkFjY291bnQtcHJvcGVydHlcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIERyeVJ1bjogZmFsc2UsXG4gICAgICAgICAgRGVsZWdhdGVkQWRtaW5BY2NvdW50SWQ6IHByb3BzLmFjY291bnRJZFxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6XG4gICAgICAgICAgY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcImlwYW1EZWxlZ2F0ZUFkbWluXCIpXG4gICAgICB9LFxuICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJFQzJcIixcbiAgICAgICAgYWN0aW9uOiBcImVuYWJsZUlwYW1Pcmdhbml6YXRpb25BZG1pbkFjY291bnRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIERyeVJ1bjogZmFsc2UsXG4gICAgICAgICAgRGVsZWdhdGVkQWRtaW5BY2NvdW50SWQ6IHByb3BzLmFjY291bnRJZFxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6XG4gICAgICAgICAgY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcImlwYW1EZWxlZ2F0ZUFkbWluXCIpXG4gICAgICB9LFxuICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgc2VydmljZTogXCJFQzJcIixcbiAgICAgICAgYWN0aW9uOiBcImRpc2FibGVJcGFtT3JnYW5pemF0aW9uQWRtaW5BY2NvdW50XCIsIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL2xhdGVzdC9BV1MvRUMyLmh0bWwjZGlzYWJsZUlwYW1Pcmdhbml6YXRpb25BZG1pbkFjY291bnQtcHJvcGVydHlcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIERyeVJ1bjogZmFsc2UsXG4gICAgICAgICAgRGVsZWdhdGVkQWRtaW5BY2NvdW50SWQ6IHByb3BzLmFjY291bnRJZFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6aXBhbURlbGVnYXRlQWRtaW5cIixcbiAgICAgIHBvbGljeTogY3VzdG9tUmVzb3VyY2VzLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TdGF0ZW1lbnRzKFtcbiAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgXCJlYzI6RW5hYmxlSXBhbU9yZ2FuaXphdGlvbkFkbWluQWNjb3VudFwiLFxuICAgICAgICAgICAgXCJlYzI6RGlzYWJsZUlwYW1Pcmdhbml6YXRpb25BZG1pbkFjY291bnRcIixcbiAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpFbmFibGVBV1NTZXJ2aWNlQWNjZXNzXCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6RGlzYWJsZUFXU1NlcnZpY2VBY2Nlc3NcIixcbiAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpSZWdpc3RlckRlbGVnYXRlZEFkbWluaXN0cmF0b3JcIixcbiAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpEZXJlZ2lzdGVyRGVsZWdhdGVkQWRtaW5pc3RyYXRvclwiLFxuICAgICAgICAgICAgXCJpYW06Q3JlYXRlU2VydmljZUxpbmtlZFJvbGVcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdIC8vIFRPRE86IEZpbmQgb3V0IHRoZSBleGFjdCBwcmluY2lwYWwgZm9yIHRoaXNcbiAgICAgICAgfSlcbiAgICAgIF0pXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { Construct } from "constructs";
2
+ interface IpamPoolIdProps {
3
+ region: string;
4
+ ownerId: string;
5
+ accountId: string;
6
+ }
7
+ export declare class IpamPoolId extends Construct {
8
+ constructor(scope: Construct, id: string, props: IpamPoolIdProps);
9
+ }
10
+ export {};
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IpamPoolId = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const constructs_1 = require("constructs");
6
+ const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
7
+ const customResources = require("aws-cdk-lib/custom-resources");
8
+ class IpamPoolId extends constructs_1.Construct {
9
+ constructor(scope, id, props) {
10
+ super(scope, id);
11
+ const ipamPoolId = new awsCustomResource_1.AwsCustomResource(this, "IpamPoolIdResource", {
12
+ functionName: "ipamPoolId",
13
+ onCreate: {
14
+ service: "ec2",
15
+ action: "DescribeIpamPoolsCommand",
16
+ parameters: {
17
+ Filters: [
18
+ {
19
+ Name: "locale",
20
+ Values: [props.region]
21
+ }
22
+ ]
23
+ },
24
+ physicalResourceId: customResources.PhysicalResourceId.of("ipamPoolId")
25
+ },
26
+ resourceType: "Custom::DescribeIpamPools"
27
+ });
28
+ // Create region-specific suffix for unique exports
29
+ const regionSuffix = props.region.replace(/-/g, "");
30
+ // Stores the IpamPoolId in CfnOutput with region suffix
31
+ new aws_cdk_lib_1.CfnOutput(this, "IpamPoolIdOutput", {
32
+ key: `IpamPoolId${props.accountId}${regionSuffix}`,
33
+ value: ipamPoolId.getResponseField("IpamPools.0.IpamPoolId"),
34
+ exportName: `IpamPoolId${props.accountId}${regionSuffix}`
35
+ });
36
+ }
37
+ }
38
+ exports.IpamPoolId = IpamPoolId;
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBhbVBvb2xJZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9jb25maWcvYXdzL2lwYW1Qb29sSWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXdDO0FBQ3hDLDJDQUF1QztBQUN2Qyx1RkFBb0Y7QUFDcEYsZ0VBQWdFO0FBUWhFLE1BQWEsVUFBVyxTQUFRLHNCQUFTO0lBQ3ZDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7UUFDOUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFVBQVUsR0FBRyxJQUFJLHFDQUFpQixDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUNuRSxZQUFZLEVBQUUsWUFBWTtZQUMxQixRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFLDBCQUEwQjtnQkFDbEMsVUFBVSxFQUFFO29CQUNWLE9BQU8sRUFBRTt3QkFDUDs0QkFDRSxJQUFJLEVBQUUsUUFBUTs0QkFDZCxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO3lCQUN2QjtxQkFDRjtpQkFDRjtnQkFDRCxrQkFBa0IsRUFBRSxlQUFlLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQzthQUN4RTtZQUNELFlBQVksRUFBRSwyQkFBMkI7U0FDMUMsQ0FBQyxDQUFDO1FBRUgsbURBQW1EO1FBQ25ELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVwRCx3REFBd0Q7UUFDeEQsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUN0QyxHQUFHLEVBQUUsYUFBYSxLQUFLLENBQUMsU0FBUyxHQUFHLFlBQVksRUFBRTtZQUNsRCxLQUFLLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QixDQUFDO1lBQzVELFVBQVUsRUFBRSxhQUFhLEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBWSxFQUFFO1NBQzFELENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWhDRCxnQ0FnQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL3V0aWxpdGllcy9hd3NDdXN0b21SZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgY3VzdG9tUmVzb3VyY2VzIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5cbmludGVyZmFjZSBJcGFtUG9vbElkUHJvcHMge1xuICByZWdpb246IHN0cmluZztcbiAgb3duZXJJZDogc3RyaW5nO1xuICBhY2NvdW50SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIElwYW1Qb29sSWQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSXBhbVBvb2xJZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGlwYW1Qb29sSWQgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJJcGFtUG9vbElkUmVzb3VyY2VcIiwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBcImlwYW1Qb29sSWRcIixcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwiZWMyXCIsXG4gICAgICAgIGFjdGlvbjogXCJEZXNjcmliZUlwYW1Qb29sc0NvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEZpbHRlcnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgTmFtZTogXCJsb2NhbGVcIixcbiAgICAgICAgICAgICAgVmFsdWVzOiBbcHJvcHMucmVnaW9uXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjdXN0b21SZXNvdXJjZXMuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFwiaXBhbVBvb2xJZFwiKVxuICAgICAgfSxcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OkRlc2NyaWJlSXBhbVBvb2xzXCJcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSByZWdpb24tc3BlY2lmaWMgc3VmZml4IGZvciB1bmlxdWUgZXhwb3J0c1xuICAgIGNvbnN0IHJlZ2lvblN1ZmZpeCA9IHByb3BzLnJlZ2lvbi5yZXBsYWNlKC8tL2csIFwiXCIpO1xuXG4gICAgLy8gU3RvcmVzIHRoZSBJcGFtUG9vbElkIGluIENmbk91dHB1dCB3aXRoIHJlZ2lvbiBzdWZmaXhcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiSXBhbVBvb2xJZE91dHB1dFwiLCB7XG4gICAgICBrZXk6IGBJcGFtUG9vbElkJHtwcm9wcy5hY2NvdW50SWR9JHtyZWdpb25TdWZmaXh9YCxcbiAgICAgIHZhbHVlOiBpcGFtUG9vbElkLmdldFJlc3BvbnNlRmllbGQoXCJJcGFtUG9vbHMuMC5JcGFtUG9vbElkXCIpLFxuICAgICAgZXhwb3J0TmFtZTogYElwYW1Qb29sSWQke3Byb3BzLmFjY291bnRJZH0ke3JlZ2lvblN1ZmZpeH1gXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,30 @@
1
+ import { CfnOutput, type StackProps } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ import { type Account as ExistingAccounts } from "@aws-sdk/client-organizations";
4
+ import { type KeyValue } from "../../types";
5
+ interface OrganisationProps extends StackProps {
6
+ organisationName: string;
7
+ accounts: AccountsConfig;
8
+ orgEmail: string;
9
+ existingAccounts?: ExistingAccounts[];
10
+ }
11
+ type AccountsConfig = {
12
+ readonly [key: string]: readonly string[] | string;
13
+ };
14
+ /**
15
+ * A construct for creating multi environment organisations with a production, staging and development account.
16
+ */
17
+ export default class Organisation extends Construct {
18
+ accountId: CfnOutput;
19
+ private existingAccounts?;
20
+ private accounts;
21
+ private organisation;
22
+ private organisationalUnits;
23
+ constructor(scope: Construct, id: string, props: OrganisationProps);
24
+ private addOrganisation;
25
+ private addOrganisationUnitsAndAccounts;
26
+ private addOrganisationalUnit;
27
+ private addAccount;
28
+ getAccounts(): KeyValue;
29
+ }
30
+ export {};