@fjall/components-infrastructure 0.29.0 → 0.29.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/config/aws/organisation.d.ts +1 -3
- package/dist/lib/config/aws/organisation.js +17 -13
- package/dist/lib/resources/aws/organisations/account.d.ts +37 -0
- package/dist/lib/resources/aws/organisations/account.js +220 -0
- package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +14 -0
- package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +61 -0
- package/dist/lib/resources/aws/organisations/index.d.ts +8 -0
- package/dist/lib/resources/aws/organisations/index.js +22 -0
- package/dist/lib/resources/aws/organisations/interfaces.d.ts +105 -0
- package/dist/lib/resources/aws/organisations/interfaces.js +3 -0
- package/dist/lib/resources/aws/organisations/organisation.d.ts +47 -0
- package/dist/lib/resources/aws/organisations/organisation.js +263 -0
- package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +28 -0
- package/dist/lib/resources/aws/organisations/organisationalUnit.js +170 -0
- package/dist/lib/resources/aws/organisations/policy.d.ts +17 -0
- package/dist/lib/resources/aws/organisations/policy.js +93 -0
- package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +13 -0
- package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +58 -0
- package/dist/lib/resources/aws/organisations/types.d.ts +165 -0
- package/dist/lib/resources/aws/organisations/types.js +36 -0
- package/package.json +3 -4
|
@@ -8,9 +8,7 @@ interface OrganisationProps extends StackProps {
|
|
|
8
8
|
orgEmail: string;
|
|
9
9
|
existingAccounts?: ExistingAccounts[];
|
|
10
10
|
}
|
|
11
|
-
type AccountsConfig =
|
|
12
|
-
readonly [key: string]: readonly string[] | string;
|
|
13
|
-
};
|
|
11
|
+
type AccountsConfig = Record<string, string | string[] | readonly string[]>;
|
|
14
12
|
/**
|
|
15
13
|
* A construct for creating multi environment organisations with a production, staging and development account.
|
|
16
14
|
*/
|
|
@@ -4,7 +4,7 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
|
4
4
|
const constructs_1 = require("constructs");
|
|
5
5
|
const aws_cdk_lib_2 = require("aws-cdk-lib");
|
|
6
6
|
const stripAndCamelCase_1 = require("../../utils/stripAndCamelCase");
|
|
7
|
-
const
|
|
7
|
+
const organisations_1 = require("../../resources/aws/organisations");
|
|
8
8
|
const addSuffixToEmail_1 = require("../../utils/addSuffixToEmail");
|
|
9
9
|
/**
|
|
10
10
|
* A construct for creating multi environment organisations with a production, staging and development account.
|
|
@@ -19,16 +19,16 @@ class Organisation extends constructs_1.Construct {
|
|
|
19
19
|
this.addOrganisationUnitsAndAccounts(props.accounts, props.orgEmail);
|
|
20
20
|
}
|
|
21
21
|
addOrganisation(organisationName) {
|
|
22
|
-
this.organisation = new
|
|
23
|
-
featureSet:
|
|
22
|
+
this.organisation = new organisations_1.Organisation(this, organisationName, {
|
|
23
|
+
featureSet: organisations_1.FeatureSet.ALL
|
|
24
24
|
});
|
|
25
25
|
// TODO: Validate this enables trusted access
|
|
26
26
|
this.organisation.enableAwsServiceAccess("account.amazonaws.com");
|
|
27
27
|
const enforcedPolicyTypes = [
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
organisations_1.PolicyType.SERVICE_CONTROL_POLICY,
|
|
29
|
+
organisations_1.PolicyType.TAG_POLICY,
|
|
30
|
+
organisations_1.PolicyType.BACKUP_POLICY,
|
|
31
|
+
organisations_1.PolicyType.AISERVICES_OPT_OUT_POLICY
|
|
32
32
|
];
|
|
33
33
|
for (const policyType of enforcedPolicyTypes) {
|
|
34
34
|
this.organisation.enablePolicyType(policyType);
|
|
@@ -38,13 +38,17 @@ class Organisation extends constructs_1.Construct {
|
|
|
38
38
|
for (const [environmentType, accountList] of Object.entries(accounts)) {
|
|
39
39
|
// Create OU for each environment type
|
|
40
40
|
const ouName = environmentType.charAt(0).toUpperCase() + environmentType.slice(1);
|
|
41
|
-
const orgUnit = this.addOrganisationalUnit(`${ouName}
|
|
41
|
+
const orgUnit = this.addOrganisationalUnit(`${ouName}OrganisationalUnit`, ouName);
|
|
42
42
|
// Convert single account to array for uniform processing
|
|
43
43
|
const accountsArray = Array.isArray(accountList)
|
|
44
|
-
? accountList
|
|
44
|
+
? [...accountList] // Convert readonly array to mutable array
|
|
45
45
|
: [accountList];
|
|
46
46
|
// Add accounts to this OU
|
|
47
47
|
for (const accountName of accountsArray) {
|
|
48
|
+
// Ensure accountName is a string (it should be after array conversion)
|
|
49
|
+
if (typeof accountName !== "string") {
|
|
50
|
+
continue; // Skip if somehow it's not a string
|
|
51
|
+
}
|
|
48
52
|
const accountNameId = (0, stripAndCamelCase_1.stripAndCamelCase)(accountName);
|
|
49
53
|
const importedAccount = this.existingAccounts?.find((account) => account.Name === accountName);
|
|
50
54
|
const accountEmail = importedAccount
|
|
@@ -57,8 +61,8 @@ class Organisation extends constructs_1.Construct {
|
|
|
57
61
|
}
|
|
58
62
|
}
|
|
59
63
|
addOrganisationalUnit(id, name) {
|
|
60
|
-
const ou = new
|
|
61
|
-
|
|
64
|
+
const ou = new organisations_1.OrganisationalUnit(this, id, {
|
|
65
|
+
organisationalUnitName: name,
|
|
62
66
|
parent: this.organisation.root,
|
|
63
67
|
importOnDuplicate: true
|
|
64
68
|
});
|
|
@@ -66,7 +70,7 @@ class Organisation extends constructs_1.Construct {
|
|
|
66
70
|
return ou;
|
|
67
71
|
}
|
|
68
72
|
addAccount(id, name, email, tags, organisationalUnit) {
|
|
69
|
-
const acc = new
|
|
73
|
+
const acc = new organisations_1.Account(this, id, {
|
|
70
74
|
accountName: name,
|
|
71
75
|
email: email,
|
|
72
76
|
parent: organisationalUnit,
|
|
@@ -93,4 +97,4 @@ class Organisation extends constructs_1.Construct {
|
|
|
93
97
|
}
|
|
94
98
|
}
|
|
95
99
|
exports.default = Organisation;
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pc2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2NvbmZpZy9hd3Mvb3JnYW5pc2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQW9EO0FBQ3BELDJDQUF1QztBQUN2Qyw2Q0FBbUM7QUFDbkMscUVBQWtFO0FBRWxFLG9FQU1zQztBQUN0QyxtRUFBNEQ7QUFjNUQ7O0dBRUc7QUFFSCxNQUFxQixZQUFhLFNBQVEsc0JBQVM7SUFRakQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF3QjtRQUNoRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBTFgsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUV4Qix3QkFBbUIsR0FBeUIsRUFBRSxDQUFDO1FBS3JELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVPLGVBQWUsQ0FBQyxnQkFBd0I7UUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGdDQUFZLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzNELFVBQVUsRUFBRSw4QkFBVSxDQUFDLEdBQUc7U0FDM0IsQ0FBQyxDQUFDO1FBRUgsNkNBQTZDO1FBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUVsRSxNQUFNLG1CQUFtQixHQUFpQjtZQUN4Qyw4QkFBVSxDQUFDLHNCQUFzQjtZQUNqQyw4QkFBVSxDQUFDLFVBQVU7WUFDckIsOEJBQVUsQ0FBQyxhQUFhO1lBQ3hCLDhCQUFVLENBQUMseUJBQXlCO1NBQ3JDLENBQUM7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QztRQUVwQyxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7WUFDN0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1lBQ3BCLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUM7UUFDSCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUU7WUFDOUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLO1lBQ2YsS0FBSyxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQ3JCLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSztTQUN2QixDQUFDLENBQUM7UUFFSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUE5SEQsK0JBOEhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBTdGFja1Byb3BzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVGFncyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgc3RyaXBBbmRDYW1lbENhc2UgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc3RyaXBBbmRDYW1lbENhc2VcIjtcbmltcG9ydCB7IEFjY291bnQgYXMgRXhpc3RpbmdBY2NvdW50cyB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtb3JnYW5pemF0aW9uc1wiO1xuaW1wb3J0IHtcbiAgQWNjb3VudCxcbiAgRmVhdHVyZVNldCxcbiAgT3JnYW5pemF0aW9uLFxuICBPcmdhbml6YXRpb25hbFVuaXQsXG4gIFBvbGljeVR5cGVcbn0gZnJvbSBcIkBwZXBwZXJpemUvY2RrLW9yZ2FuaXphdGlvbnNcIjtcbmltcG9ydCBhZGRTdWZmaXhUb0VtYWlsIGZyb20gXCIuLi8uLi91dGlscy9hZGRTdWZmaXhUb0VtYWlsXCI7XG5pbXBvcnQgeyBLZXlWYWx1ZSB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG5pbnRlcmZhY2UgT3JnYW5pc2F0aW9uUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgb3JnYW5pc2F0aW9uTmFtZTogc3RyaW5nO1xuICBhY2NvdW50czogQWNjb3VudHNDb25maWc7XG4gIG9yZ0VtYWlsOiBzdHJpbmc7XG4gIGV4aXN0aW5nQWNjb3VudHM/OiBFeGlzdGluZ0FjY291bnRzW107XG59XG5cbnR5cGUgQWNjb3VudHNDb25maWcgPSB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHJlYWRvbmx5IHN0cmluZ1tdIHwgc3RyaW5nO1xufTtcblxuLyoqXG4gKiBBIGNvbnN0cnVjdCBmb3IgY3JlYXRpbmcgbXVsdGkgZW52aXJvbm1lbnQgb3JnYW5pc2F0aW9ucyB3aXRoIGEgcHJvZHVjdGlvbiwgc3RhZ2luZyBhbmQgZGV2ZWxvcG1lbnQgYWNjb3VudC5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPcmdhbmlzYXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgYWNjb3VudElkOiBDZm5PdXRwdXQ7XG5cbiAgcHJpdmF0ZSBleGlzdGluZ0FjY291bnRzPzogRXhpc3RpbmdBY2NvdW50c1tdO1xuICBwcml2YXRlIGFjY291bnRzOiBLZXlWYWx1ZSA9IHt9O1xuICBwcml2YXRlIG9yZ2FuaXNhdGlvbjogT3JnYW5pemF0aW9uO1xuICBwcml2YXRlIG9yZ2FuaXNhdGlvbmFsVW5pdHM6IE9yZ2FuaXphdGlvbmFsVW5pdFtdID0gW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9yZ2FuaXNhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuZXhpc3RpbmdBY2NvdW50cyA9IHByb3BzLmV4aXN0aW5nQWNjb3VudHM7XG4gICAgdGhpcy5hZGRPcmdhbmlzYXRpb24ocHJvcHMub3JnYW5pc2F0aW9uTmFtZSk7XG4gICAgdGhpcy5hZGRPcmdhbmlzYXRpb25Vbml0c0FuZEFjY291bnRzKHByb3BzLmFjY291bnRzLCBwcm9wcy5vcmdFbWFpbCk7XG4gIH1cblxuICBwcml2YXRlIGFkZE9yZ2FuaXNhdGlvbihvcmdhbmlzYXRpb25OYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLm9yZ2FuaXNhdGlvbiA9IG5ldyBPcmdhbml6YXRpb24odGhpcywgb3JnYW5pc2F0aW9uTmFtZSwge1xuICAgICAgZmVhdHVyZVNldDogRmVhdHVyZVNldC5BTExcbiAgICB9KTtcblxuICAgIC8vIFRPRE86IFZhbGlkYXRlIHRoaXMgZW5hYmxlcyB0cnVzdGVkIGFjY2Vzc1xuICAgIHRoaXMub3JnYW5pc2F0aW9uLmVuYWJsZUF3c1NlcnZpY2VBY2Nlc3MoXCJhY2NvdW50LmFtYXpvbmF3cy5jb21cIik7XG5cbiAgICBjb25zdCBlbmZvcmNlZFBvbGljeVR5cGVzOiBQb2xpY3lUeXBlW10gPSBbXG4gICAgICBQb2xpY3lUeXBlLlNFUlZJQ0VfQ09OVFJPTF9QT0xJQ1ksXG4gICAgICBQb2xpY3lUeXBlLlRBR19QT0xJQ1ksXG4gICAgICBQb2xpY3lUeXBlLkJBQ0tVUF9QT0xJQ1ksXG4gICAgICBQb2xpY3lUeXBlLkFJU0VSVklDRVNfT1BUX09VVF9QT0xJQ1lcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBwb2xpY3lUeXBlIG9mIGVuZm9yY2VkUG9saWN5VHlwZXMpIHtcbiAgICAgIHRoaXMub3JnYW5pc2F0aW9uLmVuYWJsZVBvbGljeVR5cGUocG9saWN5VHlwZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRPcmdhbmlzYXRpb25Vbml0c0FuZEFjY291bnRzKFxuICAgIGFjY291bnRzOiBBY2NvdW50c0NvbmZpZyxcbiAgICBvcmdFbWFpbDogc3RyaW5nXG4gICkge1xuICAgIGZvciAoY29uc3QgW2Vudmlyb25tZW50VHlwZSwgYWNjb3VudExpc3RdIG9mIE9iamVjdC5lbnRyaWVzKGFjY291bnRzKSkge1xuICAgICAgLy8gQ3JlYXRlIE9VIGZvciBlYWNoIGVudmlyb25tZW50IHR5cGVcbiAgICAgIGNvbnN0IG91TmFtZSA9XG4gICAgICAgIGVudmlyb25tZW50VHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGVudmlyb25tZW50VHlwZS5zbGljZSgxKTtcbiAgICAgIGNvbnN0IG9yZ1VuaXQgPSB0aGlzLmFkZE9yZ2FuaXNhdGlvbmFsVW5pdChcbiAgICAgICAgYCR7b3VOYW1lfU9yZ2FuaXphdGlvbmFsVW5pdGAsXG4gICAgICAgIG91TmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ29udmVydCBzaW5nbGUgYWNjb3VudCB0byBhcnJheSBmb3IgdW5pZm9ybSBwcm9jZXNzaW5nXG4gICAgICBjb25zdCBhY2NvdW50c0FycmF5ID0gQXJyYXkuaXNBcnJheShhY2NvdW50TGlzdClcbiAgICAgICAgPyBhY2NvdW50TGlzdFxuICAgICAgICA6IFthY2NvdW50TGlzdF07XG5cbiAgICAgIC8vIEFkZCBhY2NvdW50cyB0byB0aGlzIE9VXG4gICAgICBmb3IgKGNvbnN0IGFjY291bnROYW1lIG9mIGFjY291bnRzQXJyYXkpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudE5hbWVJZCA9IHN0cmlwQW5kQ2FtZWxDYXNlKGFjY291bnROYW1lKTtcblxuICAgICAgICBjb25zdCBpbXBvcnRlZEFjY291bnQgPSB0aGlzLmV4aXN0aW5nQWNjb3VudHM/LmZpbmQoXG4gICAgICAgICAgKGFjY291bnQpID0+IGFjY291bnQuTmFtZSA9PT0gYWNjb3VudE5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYWNjb3VudEVtYWlsID0gaW1wb3J0ZWRBY2NvdW50XG4gICAgICAgICAgPyBpbXBvcnRlZEFjY291bnQuRW1haWxcbiAgICAgICAgICA6IGFkZFN1ZmZpeFRvRW1haWwob3JnRW1haWwsIGFjY291bnROYW1lSWQudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgaWYgKGFjY291bnRFbWFpbCkge1xuICAgICAgICAgIHRoaXMuYWRkQWNjb3VudChcbiAgICAgICAgICAgIGAke2FjY291bnROYW1lSWR9QWNjb3VudGAsXG4gICAgICAgICAgICBhY2NvdW50TmFtZSxcbiAgICAgICAgICAgIGFjY291bnRFbWFpbCxcbiAgICAgICAgICAgIHsgZW52OiBlbnZpcm9ubWVudFR5cGUgfSxcbiAgICAgICAgICAgIG9yZ1VuaXRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRPcmdhbmlzYXRpb25hbFVuaXQoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogT3JnYW5pemF0aW9uYWxVbml0IHtcbiAgICBjb25zdCBvdSA9IG5ldyBPcmdhbml6YXRpb25hbFVuaXQodGhpcywgaWQsIHtcbiAgICAgIG9yZ2FuaXphdGlvbmFsVW5pdE5hbWU6IG5hbWUsXG4gICAgICBwYXJlbnQ6IHRoaXMub3JnYW5pc2F0aW9uLnJvb3QsXG4gICAgICBpbXBvcnRPbkR1cGxpY2F0ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5vcmdhbmlzYXRpb25hbFVuaXRzLnB1c2gob3UpO1xuICAgIHJldHVybiBvdTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQWNjb3VudChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgb3JnYW5pc2F0aW9uYWxVbml0OiBPcmdhbml6YXRpb25hbFVuaXRcbiAgKTogQWNjb3VudCB7XG4gICAgY29uc3QgYWNjID0gbmV3IEFjY291bnQodGhpcywgaWQsIHtcbiAgICAgIGFjY291bnROYW1lOiBuYW1lLFxuICAgICAgZW1haWw6IGVtYWlsLFxuICAgICAgcGFyZW50OiBvcmdhbmlzYXRpb25hbFVuaXQsXG4gICAgICBpbXBvcnRPbkR1cGxpY2F0ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCB0YWcgaW4gdGFncykge1xuICAgICAgVGFncy5vZihhY2MpLmFkZCh0YWcsIHRhZ3NbdGFnXSk7XG4gICAgfVxuXG4gICAgdGhpcy5hY2NvdW50c1tuYW1lXSA9IGFjYy5hY2NvdW50SWQ7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfUlkYCwge1xuICAgICAga2V5OiBgJHtpZH1JZGAsXG4gICAgICB2YWx1ZTogYWNjLmFjY291bnRJZCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke2lkfUlkYFxuICAgIH0pO1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9QXJuYCwge1xuICAgICAga2V5OiBgJHtpZH1Bcm5gLFxuICAgICAgdmFsdWU6IGFjYy5hY2NvdW50QXJuLFxuICAgICAgZXhwb3J0TmFtZTogYCR7aWR9QXJuYFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFjYztcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY2NvdW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5hY2NvdW50cztcbiAgfVxufVxuIl19
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pc2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2NvbmZpZy9hd3Mvb3JnYW5pc2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQW9EO0FBQ3BELDJDQUF1QztBQUN2Qyw2Q0FBbUM7QUFDbkMscUVBQWtFO0FBRWxFLHFFQU0yQztBQUMzQyxtRUFBNEQ7QUFZNUQ7O0dBRUc7QUFFSCxNQUFxQixZQUFhLFNBQVEsc0JBQVM7SUFRakQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF3QjtRQUNoRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBTFgsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUV4Qix3QkFBbUIsR0FBeUIsRUFBRSxDQUFDO1FBS3JELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVPLGVBQWUsQ0FBQyxnQkFBd0I7UUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLDRCQUFpQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUNoRSxVQUFVLEVBQUUsMEJBQVUsQ0FBQyxHQUFHO1NBQzNCLENBQUMsQ0FBQztRQUVILDZDQUE2QztRQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFbEUsTUFBTSxtQkFBbUIsR0FBaUI7WUFDeEMsMEJBQVUsQ0FBQyxzQkFBc0I7WUFDakMsMEJBQVUsQ0FBQyxVQUFVO1lBQ3JCLDBCQUFVLENBQUMsYUFBYTtZQUN4QiwwQkFBVSxDQUFDLHlCQUF5QjtTQUNyQyxDQUFD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LEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUVwQyxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7WUFDN0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1lBQ3BCLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUM7UUFDSCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUU7WUFDOUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLO1lBQ2YsS0FBSyxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQ3JCLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSztTQUN2QixDQUFDLENBQUM7UUFFSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUFuSUQsK0JBbUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBTdGFja1Byb3BzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVGFncyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgc3RyaXBBbmRDYW1lbENhc2UgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc3RyaXBBbmRDYW1lbENhc2VcIjtcbmltcG9ydCB7IEFjY291bnQgYXMgRXhpc3RpbmdBY2NvdW50cyB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtb3JnYW5pemF0aW9uc1wiO1xuaW1wb3J0IHtcbiAgQWNjb3VudCxcbiAgRmVhdHVyZVNldCxcbiAgT3JnYW5pc2F0aW9uIGFzIEZqYWxsT3JnYW5pc2F0aW9uLFxuICBPcmdhbmlzYXRpb25hbFVuaXQsXG4gIFBvbGljeVR5cGVcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvb3JnYW5pc2F0aW9uc1wiO1xuaW1wb3J0IGFkZFN1ZmZpeFRvRW1haWwgZnJvbSBcIi4uLy4uL3V0aWxzL2FkZFN1ZmZpeFRvRW1haWxcIjtcbmltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbmludGVyZmFjZSBPcmdhbmlzYXRpb25Qcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICBvcmdhbmlzYXRpb25OYW1lOiBzdHJpbmc7XG4gIGFjY291bnRzOiBBY2NvdW50c0NvbmZpZztcbiAgb3JnRW1haWw6IHN0cmluZztcbiAgZXhpc3RpbmdBY2NvdW50cz86IEV4aXN0aW5nQWNjb3VudHNbXTtcbn1cblxudHlwZSBBY2NvdW50c0NvbmZpZyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgcmVhZG9ubHkgc3RyaW5nW10+O1xuXG4vKipcbiAqIEEgY29uc3RydWN0IGZvciBjcmVhdGluZyBtdWx0aSBlbnZpcm9ubWVudCBvcmdhbmlzYXRpb25zIHdpdGggYSBwcm9kdWN0aW9uLCBzdGFnaW5nIGFuZCBkZXZlbG9wbWVudCBhY2NvdW50LlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9yZ2FuaXNhdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyBhY2NvdW50SWQ6IENmbk91dHB1dDtcblxuICBwcml2YXRlIGV4aXN0aW5nQWNjb3VudHM/OiBFeGlzdGluZ0FjY291bnRzW107XG4gIHByaXZhdGUgYWNjb3VudHM6IEtleVZhbHVlID0ge307XG4gIHByaXZhdGUgb3JnYW5pc2F0aW9uOiBGamFsbE9yZ2FuaXNhdGlvbjtcbiAgcHJpdmF0ZSBvcmdhbmlzYXRpb25hbFVuaXRzOiBPcmdhbmlzYXRpb25hbFVuaXRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBPcmdhbmlzYXRpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmV4aXN0aW5nQWNjb3VudHMgPSBwcm9wcy5leGlzdGluZ0FjY291bnRzO1xuICAgIHRoaXMuYWRkT3JnYW5pc2F0aW9uKHByb3BzLm9yZ2FuaXNhdGlvbk5hbWUpO1xuICAgIHRoaXMuYWRkT3JnYW5pc2F0aW9uVW5pdHNBbmRBY2NvdW50cyhwcm9wcy5hY2NvdW50cywgcHJvcHMub3JnRW1haWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRPcmdhbmlzYXRpb24ob3JnYW5pc2F0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcmdhbmlzYXRpb24gPSBuZXcgRmphbGxPcmdhbmlzYXRpb24odGhpcywgb3JnYW5pc2F0aW9uTmFtZSwge1xuICAgICAgZmVhdHVyZVNldDogRmVhdHVyZVNldC5BTExcbiAgICB9KTtcblxuICAgIC8vIFRPRE86IFZhbGlkYXRlIHRoaXMgZW5hYmxlcyB0cnVzdGVkIGFjY2Vzc1xuICAgIHRoaXMub3JnYW5pc2F0aW9uLmVuYWJsZUF3c1NlcnZpY2VBY2Nlc3MoXCJhY2NvdW50LmFtYXpvbmF3cy5jb21cIik7XG5cbiAgICBjb25zdCBlbmZvcmNlZFBvbGljeVR5cGVzOiBQb2xpY3lUeXBlW10gPSBbXG4gICAgICBQb2xpY3lUeXBlLlNFUlZJQ0VfQ09OVFJPTF9QT0xJQ1ksXG4gICAgICBQb2xpY3lUeXBlLlRBR19QT0xJQ1ksXG4gICAgICBQb2xpY3lUeXBlLkJBQ0tVUF9QT0xJQ1ksXG4gICAgICBQb2xpY3lUeXBlLkFJU0VSVklDRVNfT1BUX09VVF9QT0xJQ1lcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBwb2xpY3lUeXBlIG9mIGVuZm9yY2VkUG9saWN5VHlwZXMpIHtcbiAgICAgIHRoaXMub3JnYW5pc2F0aW9uLmVuYWJsZVBvbGljeVR5cGUocG9saWN5VHlwZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRPcmdhbmlzYXRpb25Vbml0c0FuZEFjY291bnRzKFxuICAgIGFjY291bnRzOiBBY2NvdW50c0NvbmZpZyxcbiAgICBvcmdFbWFpbDogc3RyaW5nXG4gICkge1xuICAgIGZvciAoY29uc3QgW2Vudmlyb25tZW50VHlwZSwgYWNjb3VudExpc3RdIG9mIE9iamVjdC5lbnRyaWVzKGFjY291bnRzKSkge1xuICAgICAgLy8gQ3JlYXRlIE9VIGZvciBlYWNoIGVudmlyb25tZW50IHR5cGVcbiAgICAgIGNvbnN0IG91TmFtZSA9XG4gICAgICAgIGVudmlyb25tZW50VHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGVudmlyb25tZW50VHlwZS5zbGljZSgxKTtcbiAgICAgIGNvbnN0IG9yZ1VuaXQgPSB0aGlzLmFkZE9yZ2FuaXNhdGlvbmFsVW5pdChcbiAgICAgICAgYCR7b3VOYW1lfU9yZ2FuaXNhdGlvbmFsVW5pdGAsXG4gICAgICAgIG91TmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ29udmVydCBzaW5nbGUgYWNjb3VudCB0byBhcnJheSBmb3IgdW5pZm9ybSBwcm9jZXNzaW5nXG4gICAgICBjb25zdCBhY2NvdW50c0FycmF5ID0gQXJyYXkuaXNBcnJheShhY2NvdW50TGlzdClcbiAgICAgICAgPyBbLi4uYWNjb3VudExpc3RdIC8vIENvbnZlcnQgcmVhZG9ubHkgYXJyYXkgdG8gbXV0YWJsZSBhcnJheVxuICAgICAgICA6IFthY2NvdW50TGlzdF07XG5cbiAgICAgIC8vIEFkZCBhY2NvdW50cyB0byB0aGlzIE9VXG4gICAgICBmb3IgKGNvbnN0IGFjY291bnROYW1lIG9mIGFjY291bnRzQXJyYXkpIHtcbiAgICAgICAgLy8gRW5zdXJlIGFjY291bnROYW1lIGlzIGEgc3RyaW5nIChpdCBzaG91bGQgYmUgYWZ0ZXIgYXJyYXkgY29udmVyc2lvbilcbiAgICAgICAgaWYgKHR5cGVvZiBhY2NvdW50TmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGlmIHNvbWVob3cgaXQncyBub3QgYSBzdHJpbmdcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjY291bnROYW1lSWQgPSBzdHJpcEFuZENhbWVsQ2FzZShhY2NvdW50TmFtZSk7XG5cbiAgICAgICAgY29uc3QgaW1wb3J0ZWRBY2NvdW50ID0gdGhpcy5leGlzdGluZ0FjY291bnRzPy5maW5kKFxuICAgICAgICAgIChhY2NvdW50KSA9PiBhY2NvdW50Lk5hbWUgPT09IGFjY291bnROYW1lXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGFjY291bnRFbWFpbCA9IGltcG9ydGVkQWNjb3VudFxuICAgICAgICAgID8gaW1wb3J0ZWRBY2NvdW50LkVtYWlsXG4gICAgICAgICAgOiBhZGRTdWZmaXhUb0VtYWlsKG9yZ0VtYWlsLCBhY2NvdW50TmFtZUlkLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgIGlmIChhY2NvdW50RW1haWwpIHtcbiAgICAgICAgICB0aGlzLmFkZEFjY291bnQoXG4gICAgICAgICAgICBgJHthY2NvdW50TmFtZUlkfUFjY291bnRgLFxuICAgICAgICAgICAgYWNjb3VudE5hbWUsXG4gICAgICAgICAgICBhY2NvdW50RW1haWwsXG4gICAgICAgICAgICB7IGVudjogZW52aXJvbm1lbnRUeXBlIH0sXG4gICAgICAgICAgICBvcmdVbml0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkT3JnYW5pc2F0aW9uYWxVbml0KGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IE9yZ2FuaXNhdGlvbmFsVW5pdCB7XG4gICAgY29uc3Qgb3UgPSBuZXcgT3JnYW5pc2F0aW9uYWxVbml0KHRoaXMsIGlkLCB7XG4gICAgICBvcmdhbmlzYXRpb25hbFVuaXROYW1lOiBuYW1lLFxuICAgICAgcGFyZW50OiB0aGlzLm9yZ2FuaXNhdGlvbi5yb290LFxuICAgICAgaW1wb3J0T25EdXBsaWNhdGU6IHRydWVcbiAgICB9KTtcblxuICAgIHRoaXMub3JnYW5pc2F0aW9uYWxVbml0cy5wdXNoKG91KTtcbiAgICByZXR1cm4gb3U7XG4gIH1cblxuICBwcml2YXRlIGFkZEFjY291bnQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICB0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9LFxuICAgIG9yZ2FuaXNhdGlvbmFsVW5pdDogT3JnYW5pc2F0aW9uYWxVbml0XG4gICk6IEFjY291bnQge1xuICAgIGNvbnN0IGFjYyA9IG5ldyBBY2NvdW50KHRoaXMsIGlkLCB7XG4gICAgICBhY2NvdW50TmFtZTogbmFtZSxcbiAgICAgIGVtYWlsOiBlbWFpbCxcbiAgICAgIHBhcmVudDogb3JnYW5pc2F0aW9uYWxVbml0LFxuICAgICAgaW1wb3J0T25EdXBsaWNhdGU6IHRydWVcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgdGFnIGluIHRhZ3MpIHtcbiAgICAgIFRhZ3Mub2YoYWNjKS5hZGQodGFnLCB0YWdzW3RhZ10pO1xuICAgIH1cblxuICAgIHRoaXMuYWNjb3VudHNbbmFtZV0gPSBhY2MuYWNjb3VudElkO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1JZGAsIHtcbiAgICAgIGtleTogYCR7aWR9SWRgLFxuICAgICAgdmFsdWU6IGFjYy5hY2NvdW50SWQsXG4gICAgICBleHBvcnROYW1lOiBgJHtpZH1JZGBcbiAgICB9KTtcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfUFybmAsIHtcbiAgICAgIGtleTogYCR7aWR9QXJuYCxcbiAgICAgIHZhbHVlOiBhY2MuYWNjb3VudEFybixcbiAgICAgIGV4cG9ydE5hbWU6IGAke2lkfUFybmBcbiAgICB9KTtcblxuICAgIHJldHVybiBhY2M7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWNjb3VudHMoKTogS2V5VmFsdWUge1xuICAgIHJldHVybiB0aGlzLmFjY291bnRzO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import { IAccount, IPolicy } from "./interfaces";
|
|
3
|
+
import { AccountProps } from "./types";
|
|
4
|
+
/**
|
|
5
|
+
* AWS Account construct for managing member accounts
|
|
6
|
+
*/
|
|
7
|
+
export declare class Account extends Construct implements IAccount {
|
|
8
|
+
readonly accountId: string;
|
|
9
|
+
readonly accountArn: string;
|
|
10
|
+
readonly accountName: string;
|
|
11
|
+
readonly email: string;
|
|
12
|
+
constructor(scope: Construct, id: string, props: AccountProps);
|
|
13
|
+
/**
|
|
14
|
+
* Attach policy to this account
|
|
15
|
+
*/
|
|
16
|
+
attachPolicy(policy: IPolicy): void;
|
|
17
|
+
/**
|
|
18
|
+
* Delegate administrator privileges for a service
|
|
19
|
+
*/
|
|
20
|
+
delegateAdministrator(servicePrincipal: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Helper to normalize account names for construct IDs
|
|
23
|
+
*/
|
|
24
|
+
private normalizeAccountName;
|
|
25
|
+
/**
|
|
26
|
+
* Helper to normalize policy names for construct IDs
|
|
27
|
+
*/
|
|
28
|
+
private normalizePolicyName;
|
|
29
|
+
/**
|
|
30
|
+
* Helper to normalize service names for construct IDs
|
|
31
|
+
*/
|
|
32
|
+
private normalizeServiceName;
|
|
33
|
+
/**
|
|
34
|
+
* Get the root ID (placeholder - would need custom logic to get this)
|
|
35
|
+
*/
|
|
36
|
+
private getRootId;
|
|
37
|
+
}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Account = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const customResources = require("aws-cdk-lib/custom-resources");
|
|
6
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
7
|
+
const constructs_1 = require("constructs");
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
const awsCustomResource_1 = require("../utilities/awsCustomResource");
|
|
10
|
+
/**
|
|
11
|
+
* AWS Account construct for managing member accounts
|
|
12
|
+
*/
|
|
13
|
+
class Account extends constructs_1.Construct {
|
|
14
|
+
constructor(scope, id, props) {
|
|
15
|
+
super(scope, id);
|
|
16
|
+
this.accountName = props.accountName;
|
|
17
|
+
this.email = props.email;
|
|
18
|
+
const importOnDuplicate = props.importOnDuplicate ?? true;
|
|
19
|
+
const removalPolicy = props.removalPolicy ?? aws_cdk_lib_1.RemovalPolicy.RETAIN;
|
|
20
|
+
const iamUserAccessToBilling = props.iamUserAccessToBilling ?? types_1.IamUserAccessToBilling.ALLOW;
|
|
21
|
+
const roleName = props.roleName ?? "OrganisationAccountAccessRole";
|
|
22
|
+
// Create account
|
|
23
|
+
const accountResource = new awsCustomResource_1.AwsCustomResource(this, "AccountResource", {
|
|
24
|
+
functionName: `manageAccount${this.normalizeAccountName(props.accountName)}`,
|
|
25
|
+
onCreate: {
|
|
26
|
+
service: "organizations",
|
|
27
|
+
action: "CreateAccountCommand",
|
|
28
|
+
parameters: {
|
|
29
|
+
Email: props.email,
|
|
30
|
+
AccountName: props.accountName,
|
|
31
|
+
RoleName: roleName,
|
|
32
|
+
IamUserAccessToBilling: iamUserAccessToBilling
|
|
33
|
+
},
|
|
34
|
+
physicalResourceId: customResources.PhysicalResourceId.of(`account-${props.email}`),
|
|
35
|
+
ignoreErrorCodesMatching: importOnDuplicate
|
|
36
|
+
? "FinalizingOrganizationException|AlreadyInOrganizationException"
|
|
37
|
+
: undefined
|
|
38
|
+
},
|
|
39
|
+
onUpdate: {
|
|
40
|
+
service: "organizations",
|
|
41
|
+
action: "DescribeAccountCommand",
|
|
42
|
+
parameters: {
|
|
43
|
+
AccountId: this.accountId
|
|
44
|
+
},
|
|
45
|
+
physicalResourceId: customResources.PhysicalResourceId.of(`account-${props.email}`)
|
|
46
|
+
},
|
|
47
|
+
onDelete: removalPolicy === aws_cdk_lib_1.RemovalPolicy.DESTROY
|
|
48
|
+
? {
|
|
49
|
+
service: "organizations",
|
|
50
|
+
action: "CloseAccountCommand",
|
|
51
|
+
parameters: {
|
|
52
|
+
AccountId: this.accountId
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
: undefined,
|
|
56
|
+
resourceType: "Custom::Account",
|
|
57
|
+
policy: customResources.AwsCustomResourcePolicy.fromStatements([
|
|
58
|
+
new aws_iam_1.PolicyStatement({
|
|
59
|
+
actions: [
|
|
60
|
+
"organizations:CreateAccount",
|
|
61
|
+
"organizations:DescribeAccount",
|
|
62
|
+
"organizations:CloseAccount",
|
|
63
|
+
"organizations:ListAccounts",
|
|
64
|
+
"organizations:MoveAccount"
|
|
65
|
+
],
|
|
66
|
+
resources: ["*"],
|
|
67
|
+
effect: aws_iam_1.Effect.ALLOW
|
|
68
|
+
})
|
|
69
|
+
])
|
|
70
|
+
});
|
|
71
|
+
// Get account details from the create operation
|
|
72
|
+
this.accountId = accountResource.getResponseField("CreateAccountStatus.AccountId");
|
|
73
|
+
this.accountArn = `arn:aws:organizations::${this.node.tryGetContext("account")}:account/o-${this.node.tryGetContext("organisationId")}/${this.accountId}`;
|
|
74
|
+
// Move account to the specified parent OU (if not root)
|
|
75
|
+
if (props.parent.organisationalUnitName !== "Root") {
|
|
76
|
+
new awsCustomResource_1.AwsCustomResource(this, "MoveAccount", {
|
|
77
|
+
functionName: `moveAccount${this.normalizeAccountName(props.accountName)}`,
|
|
78
|
+
onCreate: {
|
|
79
|
+
service: "organizations",
|
|
80
|
+
action: "MoveAccountCommand",
|
|
81
|
+
parameters: {
|
|
82
|
+
AccountId: this.accountId,
|
|
83
|
+
SourceParentId: this.getRootId(),
|
|
84
|
+
DestinationParentId: props.parent.organisationalUnitId
|
|
85
|
+
},
|
|
86
|
+
physicalResourceId: customResources.PhysicalResourceId.of(`move-account-${this.accountId}-to-${props.parent.organisationalUnitId}`)
|
|
87
|
+
},
|
|
88
|
+
resourceType: "Custom::MoveAccount",
|
|
89
|
+
policy: customResources.AwsCustomResourcePolicy.fromStatements([
|
|
90
|
+
new aws_iam_1.PolicyStatement({
|
|
91
|
+
actions: ["organizations:MoveAccount", "organizations:ListRoots"],
|
|
92
|
+
resources: ["*"],
|
|
93
|
+
effect: aws_iam_1.Effect.ALLOW
|
|
94
|
+
})
|
|
95
|
+
])
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// Export account details
|
|
99
|
+
new aws_cdk_lib_1.CfnOutput(this, "AccountId", {
|
|
100
|
+
key: `${id}Id`,
|
|
101
|
+
value: this.accountId,
|
|
102
|
+
exportName: `${id}Id`
|
|
103
|
+
});
|
|
104
|
+
new aws_cdk_lib_1.CfnOutput(this, "AccountArn", {
|
|
105
|
+
key: `${id}Arn`,
|
|
106
|
+
value: this.accountArn,
|
|
107
|
+
exportName: `${id}Arn`
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Attach policy to this account
|
|
112
|
+
*/
|
|
113
|
+
attachPolicy(policy) {
|
|
114
|
+
const policyName = this.normalizePolicyName(policy.policyName);
|
|
115
|
+
new awsCustomResource_1.AwsCustomResource(this, `AttachPolicy${policyName}`, {
|
|
116
|
+
functionName: `attachPolicyToAccount${policyName}${this.normalizeAccountName(this.accountName)}`,
|
|
117
|
+
onCreate: {
|
|
118
|
+
service: "organizations",
|
|
119
|
+
action: "AttachPolicyCommand",
|
|
120
|
+
parameters: {
|
|
121
|
+
PolicyId: policy.policyId,
|
|
122
|
+
TargetId: this.accountId
|
|
123
|
+
},
|
|
124
|
+
physicalResourceId: customResources.PhysicalResourceId.of(`attach-policy-${policy.policyId}-to-${this.accountId}`)
|
|
125
|
+
},
|
|
126
|
+
onDelete: {
|
|
127
|
+
service: "organizations",
|
|
128
|
+
action: "DetachPolicyCommand",
|
|
129
|
+
parameters: {
|
|
130
|
+
PolicyId: policy.policyId,
|
|
131
|
+
TargetId: this.accountId
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
resourceType: "Custom::AttachPolicyToAccount",
|
|
135
|
+
policy: customResources.AwsCustomResourcePolicy.fromStatements([
|
|
136
|
+
new aws_iam_1.PolicyStatement({
|
|
137
|
+
actions: [
|
|
138
|
+
"organizations:AttachPolicy",
|
|
139
|
+
"organizations:DetachPolicy",
|
|
140
|
+
"organizations:ListPoliciesForTarget"
|
|
141
|
+
],
|
|
142
|
+
resources: ["*"],
|
|
143
|
+
effect: aws_iam_1.Effect.ALLOW
|
|
144
|
+
})
|
|
145
|
+
])
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Delegate administrator privileges for a service
|
|
150
|
+
*/
|
|
151
|
+
delegateAdministrator(servicePrincipal) {
|
|
152
|
+
const serviceName = this.normalizeServiceName(servicePrincipal);
|
|
153
|
+
new awsCustomResource_1.AwsCustomResource(this, `DelegateAdmin${serviceName}`, {
|
|
154
|
+
functionName: `delegateAdmin${serviceName}${this.normalizeAccountName(this.accountName)}`,
|
|
155
|
+
onCreate: {
|
|
156
|
+
service: "organizations",
|
|
157
|
+
action: "RegisterDelegatedAdministratorCommand",
|
|
158
|
+
parameters: {
|
|
159
|
+
AccountId: this.accountId,
|
|
160
|
+
ServicePrincipal: servicePrincipal
|
|
161
|
+
},
|
|
162
|
+
physicalResourceId: customResources.PhysicalResourceId.of(`delegate-admin-${servicePrincipal}-to-${this.accountId}`)
|
|
163
|
+
},
|
|
164
|
+
onDelete: {
|
|
165
|
+
service: "organizations",
|
|
166
|
+
action: "DeregisterDelegatedAdministratorCommand",
|
|
167
|
+
parameters: {
|
|
168
|
+
AccountId: this.accountId,
|
|
169
|
+
ServicePrincipal: servicePrincipal
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
resourceType: "Custom::DelegateAdministrator",
|
|
173
|
+
policy: customResources.AwsCustomResourcePolicy.fromStatements([
|
|
174
|
+
new aws_iam_1.PolicyStatement({
|
|
175
|
+
actions: [
|
|
176
|
+
"organizations:RegisterDelegatedAdministrator",
|
|
177
|
+
"organizations:DeregisterDelegatedAdministrator",
|
|
178
|
+
"organizations:ListDelegatedAdministrators"
|
|
179
|
+
],
|
|
180
|
+
resources: ["*"],
|
|
181
|
+
effect: aws_iam_1.Effect.ALLOW
|
|
182
|
+
})
|
|
183
|
+
])
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Helper to normalize account names for construct IDs
|
|
188
|
+
*/
|
|
189
|
+
normalizeAccountName(accountName) {
|
|
190
|
+
return accountName
|
|
191
|
+
.replace(/[^a-zA-Z0-9]/g, "")
|
|
192
|
+
.replace(/^([a-z])/, (match) => match.toUpperCase());
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Helper to normalize policy names for construct IDs
|
|
196
|
+
*/
|
|
197
|
+
normalizePolicyName(policyName) {
|
|
198
|
+
return policyName
|
|
199
|
+
.replace(/[^a-zA-Z0-9]/g, "")
|
|
200
|
+
.replace(/^([a-z])/, (match) => match.toUpperCase());
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Helper to normalize service names for construct IDs
|
|
204
|
+
*/
|
|
205
|
+
normalizeServiceName(servicePrincipal) {
|
|
206
|
+
return servicePrincipal
|
|
207
|
+
.replace(/[^a-zA-Z0-9]/g, "")
|
|
208
|
+
.replace(/^([a-z])/, (match) => match.toUpperCase());
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get the root ID (placeholder - would need custom logic to get this)
|
|
212
|
+
*/
|
|
213
|
+
getRootId() {
|
|
214
|
+
// This would need to be implemented with a custom resource to get the root ID
|
|
215
|
+
// For now, using a placeholder
|
|
216
|
+
return this.node.tryGetContext("organisationRootId") || "r-placeholder";
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
exports.Account = Account;
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL29yZ2FuaXNhdGlvbnMvYWNjb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUQ7QUFDdkQsZ0VBQWdFO0FBQ2hFLGlEQUE4RDtBQUM5RCwyQ0FBdUM7QUFFdkMsbUNBQStEO0FBQy9ELHNFQUFtRTtBQUVuRTs7R0FFRztBQUNILE1BQWEsT0FBUSxTQUFRLHNCQUFTO0lBTXBDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBbUI7UUFDM0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3pCLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQztRQUMxRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxJQUFJLDJCQUFhLENBQUMsTUFBTSxDQUFDO1FBQ2xFLE1BQU0sc0JBQXNCLEdBQzFCLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSw4QkFBc0IsQ0FBQyxLQUFLLENBQUM7UUFDL0QsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSwrQkFBK0IsQ0FBQztRQUVuRSxpQkFBaUI7UUFDakIsTUFBTSxlQUFlLEdBQUcsSUFBSSxxQ0FBaUIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDckUsWUFBWSxFQUFFLGdCQUFnQixJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzVFLFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsTUFBTSxFQUFFLHNCQUFzQjtnQkFDOUIsVUFBVSxFQUFFO29CQUNWLEtB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TyxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUztRQUNmLDhFQUE4RTtRQUM5RSwrQkFBK0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLGVBQWUsQ0FBQztJQUMxRSxDQUFDO0NBQ0Y7QUE5T0QsMEJBOE9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBjdXN0b21SZXNvdXJjZXMgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IEVmZmVjdCwgUG9saWN5U3RhdGVtZW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBJQWNjb3VudCwgSVBvbGljeSB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IEFjY291bnRQcm9wcywgSWFtVXNlckFjY2Vzc1RvQmlsbGluZyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcblxuLyoqXG4gKiBBV1MgQWNjb3VudCBjb25zdHJ1Y3QgZm9yIG1hbmFnaW5nIG1lbWJlciBhY2NvdW50c1xuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudCBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElBY2NvdW50IHtcbiAgcmVhZG9ubHkgYWNjb3VudElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFjY291bnRBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgYWNjb3VudE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZW1haWw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQWNjb3VudFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuYWNjb3VudE5hbWUgPSBwcm9wcy5hY2NvdW50TmFtZTtcbiAgICB0aGlzLmVtYWlsID0gcHJvcHMuZW1haWw7XG4gICAgY29uc3QgaW1wb3J0T25EdXBsaWNhdGUgPSBwcm9wcy5pbXBvcnRPbkR1cGxpY2F0ZSA/PyB0cnVlO1xuICAgIGNvbnN0IHJlbW92YWxQb2xpY3kgPSBwcm9wcy5yZW1vdmFsUG9saWN5ID8/IFJlbW92YWxQb2xpY3kuUkVUQUlOO1xuICAgIGNvbnN0IGlhbVVzZXJBY2Nlc3NUb0JpbGxpbmcgPVxuICAgICAgcHJvcHMuaWFtVXNlckFjY2Vzc1RvQmlsbGluZyA/PyBJYW1Vc2VyQWNjZXNzVG9CaWxsaW5nLkFMTE9XO1xuICAgIGNvbnN0IHJvbGVOYW1lID0gcHJvcHMucm9sZU5hbWUgPz8gXCJPcmdhbmlzYXRpb25BY2NvdW50QWNjZXNzUm9sZVwiO1xuXG4gICAgLy8gQ3JlYXRlIGFjY291bnRcbiAgICBjb25zdCBhY2NvdW50UmVzb3VyY2UgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJBY2NvdW50UmVzb3VyY2VcIiwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBgbWFuYWdlQWNjb3VudCR7dGhpcy5ub3JtYWxpemVBY2NvdW50TmFtZShwcm9wcy5hY2NvdW50TmFtZSl9YCxcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICBhY3Rpb246IFwiQ3JlYXRlQWNjb3VudENvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEVtYWlsOiBwcm9wcy5lbWFpbCxcbiAgICAgICAgICBBY2NvdW50TmFtZTogcHJvcHMuYWNjb3VudE5hbWUsXG4gICAgICAgICAgUm9sZU5hbWU6IHJvbGVOYW1lLFxuICAgICAgICAgIElhbVVzZXJBY2Nlc3NUb0JpbGxpbmc6IGlhbVVzZXJBY2Nlc3NUb0JpbGxpbmdcbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjdXN0b21SZXNvdXJjZXMuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgIGBhY2NvdW50LSR7cHJvcHMuZW1haWx9YFxuICAgICAgICApLFxuICAgICAgICBpZ25vcmVFcnJvckNvZGVzTWF0Y2hpbmc6IGltcG9ydE9uRHVwbGljYXRlXG4gICAgICAgICAgPyBcIkZpbmFsaXppbmdPcmdhbml6YXRpb25FeGNlcHRpb258QWxyZWFkeUluT3JnYW5pemF0aW9uRXhjZXB0aW9uXCJcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICAgIG9uVXBkYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICBhY3Rpb246IFwiRGVzY3JpYmVBY2NvdW50Q29tbWFuZFwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgQWNjb3VudElkOiB0aGlzLmFjY291bnRJZFxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgYGFjY291bnQtJHtwcm9wcy5lbWFpbH1gXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBvbkRlbGV0ZTpcbiAgICAgICAgcmVtb3ZhbFBvbGljeSA9PT0gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICAgICAgICBhY3Rpb246IFwiQ2xvc2VBY2NvdW50Q29tbWFuZFwiLFxuICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgQWNjb3VudElkOiB0aGlzLmFjY291bnRJZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpBY2NvdW50XCIsXG4gICAgICBwb2xpY3k6IGN1c3RvbVJlc291cmNlcy5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU3RhdGVtZW50cyhbXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpDcmVhdGVBY2NvdW50XCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6RGVzY3JpYmVBY2NvdW50XCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6Q2xvc2VBY2NvdW50XCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6TGlzdEFjY291bnRzXCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6TW92ZUFjY291bnRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XXG4gICAgICAgIH0pXG4gICAgICBdKVxuICAgIH0pO1xuXG4gICAgLy8gR2V0IGFjY291bnQgZGV0YWlscyBmcm9tIHRoZSBjcmVhdGUgb3BlcmF0aW9uXG4gICAgdGhpcy5hY2NvdW50SWQgPSBhY2NvdW50UmVzb3VyY2UuZ2V0UmVzcG9uc2VGaWVsZChcbiAgICAgIFwiQ3JlYXRlQWNjb3VudFN0YXR1cy5BY2NvdW50SWRcIlxuICAgICk7XG4gICAgdGhpcy5hY2NvdW50QXJuID0gYGFybjphd3M6b3JnYW5pemF0aW9uczo6JHt0aGlzLm5vZGUudHJ5R2V0Q29udGV4dChcImFjY291bnRcIil9OmFjY291bnQvby0ke3RoaXMubm9kZS50cnlHZXRDb250ZXh0KFwib3JnYW5pc2F0aW9uSWRcIil9LyR7dGhpcy5hY2NvdW50SWR9YDtcblxuICAgIC8vIE1vdmUgYWNjb3VudCB0byB0aGUgc3BlY2lmaWVkIHBhcmVudCBPVSAoaWYgbm90IHJvb3QpXG4gICAgaWYgKHByb3BzLnBhcmVudC5vcmdhbmlzYXRpb25hbFVuaXROYW1lICE9PSBcIlJvb3RcIikge1xuICAgICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiTW92ZUFjY291bnRcIiwge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGBtb3ZlQWNjb3VudCR7dGhpcy5ub3JtYWxpemVBY2NvdW50TmFtZShwcm9wcy5hY2NvdW50TmFtZSl9YCxcbiAgICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgICBzZXJ2aWNlOiBcIm9yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgICBhY3Rpb246IFwiTW92ZUFjY291bnRDb21tYW5kXCIsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgQWNjb3VudElkOiB0aGlzLmFjY291bnRJZCxcbiAgICAgICAgICAgIFNvdXJjZVBhcmVudElkOiB0aGlzLmdldFJvb3RJZCgpLFxuICAgICAgICAgICAgRGVzdGluYXRpb25QYXJlbnRJZDogcHJvcHMucGFyZW50Lm9yZ2FuaXNhdGlvbmFsVW5pdElkXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICBgbW92ZS1hY2NvdW50LSR7dGhpcy5hY2NvdW50SWR9LXRvLSR7cHJvcHMucGFyZW50Lm9yZ2FuaXNhdGlvbmFsVW5pdElkfWBcbiAgICAgICAgICApXG4gICAgICAgIH0sXG4gICAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206Ok1vdmVBY2NvdW50XCIsXG4gICAgICAgIHBvbGljeTogY3VzdG9tUmVzb3VyY2VzLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TdGF0ZW1lbnRzKFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcIm9yZ2FuaXphdGlvbnM6TW92ZUFjY291bnRcIiwgXCJvcmdhbml6YXRpb25zOkxpc3RSb290c1wiXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XXG4gICAgICAgICAgfSlcbiAgICAgICAgXSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEV4cG9ydCBhY2NvdW50IGRldGFpbHNcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiQWNjb3VudElkXCIsIHtcbiAgICAgIGtleTogYCR7aWR9SWRgLFxuICAgICAgdmFsdWU6IHRoaXMuYWNjb3VudElkLFxuICAgICAgZXhwb3J0TmFtZTogYCR7aWR9SWRgXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiQWNjb3VudEFyblwiLCB7XG4gICAgICBrZXk6IGAke2lkfUFybmAsXG4gICAgICB2YWx1ZTogdGhpcy5hY2NvdW50QXJuLFxuICAgICAgZXhwb3J0TmFtZTogYCR7aWR9QXJuYFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBwb2xpY3kgdG8gdGhpcyBhY2NvdW50XG4gICAqL1xuICBhdHRhY2hQb2xpY3kocG9saWN5OiBJUG9saWN5KTogdm9pZCB7XG4gICAgY29uc3QgcG9saWN5TmFtZSA9IHRoaXMubm9ybWFsaXplUG9saWN5TmFtZShwb2xpY3kucG9saWN5TmFtZSk7XG5cbiAgICBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgYEF0dGFjaFBvbGljeSR7cG9saWN5TmFtZX1gLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGBhdHRhY2hQb2xpY3lUb0FjY291bnQke3BvbGljeU5hbWV9JHt0aGlzLm5vcm1hbGl6ZUFjY291bnROYW1lKHRoaXMuYWNjb3VudE5hbWUpfWAsXG4gICAgICBvbkNyZWF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIm9yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgYWN0aW9uOiBcIkF0dGFjaFBvbGljeUNvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIFBvbGljeUlkOiBwb2xpY3kucG9saWN5SWQsXG4gICAgICAgICAgVGFyZ2V0SWQ6IHRoaXMuYWNjb3VudElkXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBgYXR0YWNoLXBvbGljeS0ke3BvbGljeS5wb2xpY3lJZH0tdG8tJHt0aGlzLmFjY291bnRJZH1gXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBvbkRlbGV0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIm9yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgYWN0aW9uOiBcIkRldGFjaFBvbGljeUNvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIFBvbGljeUlkOiBwb2xpY3kucG9saWN5SWQsXG4gICAgICAgICAgVGFyZ2V0SWQ6IHRoaXMuYWNjb3VudElkXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpBdHRhY2hQb2xpY3lUb0FjY291bnRcIixcbiAgICAgIHBvbGljeTogY3VzdG9tUmVzb3VyY2VzLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TdGF0ZW1lbnRzKFtcbiAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgXCJvcmdhbml6YXRpb25zOkF0dGFjaFBvbGljeVwiLFxuICAgICAgICAgICAgXCJvcmdhbml6YXRpb25zOkRldGFjaFBvbGljeVwiLFxuICAgICAgICAgICAgXCJvcmdhbml6YXRpb25zOkxpc3RQb2xpY2llc0ZvclRhcmdldFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1dcbiAgICAgICAgfSlcbiAgICAgIF0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZWdhdGUgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzIGZvciBhIHNlcnZpY2VcbiAgICovXG4gIGRlbGVnYXRlQWRtaW5pc3RyYXRvcihzZXJ2aWNlUHJpbmNpcGFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHRoaXMubm9ybWFsaXplU2VydmljZU5hbWUoc2VydmljZVByaW5jaXBhbCk7XG5cbiAgICBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgYERlbGVnYXRlQWRtaW4ke3NlcnZpY2VOYW1lfWAsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYGRlbGVnYXRlQWRtaW4ke3NlcnZpY2VOYW1lfSR7dGhpcy5ub3JtYWxpemVBY2NvdW50TmFtZSh0aGlzLmFjY291bnROYW1lKX1gLFxuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJvcmdhbml6YXRpb25zXCIsXG4gICAgICAgIGFjdGlvbjogXCJSZWdpc3RlckRlbGVnYXRlZEFkbWluaXN0cmF0b3JDb21tYW5kXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBBY2NvdW50SWQ6IHRoaXMuYWNjb3VudElkLFxuICAgICAgICAgIFNlcnZpY2VQcmluY2lwYWw6IHNlcnZpY2VQcmluY2lwYWxcbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjdXN0b21SZXNvdXJjZXMuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgIGBkZWxlZ2F0ZS1hZG1pbi0ke3NlcnZpY2VQcmluY2lwYWx9LXRvLSR7dGhpcy5hY2NvdW50SWR9YFxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgc2VydmljZTogXCJvcmdhbml6YXRpb25zXCIsXG4gICAgICAgIGFjdGlvbjogXCJEZXJlZ2lzdGVyRGVsZWdhdGVkQWRtaW5pc3RyYXRvckNvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEFjY291bnRJZDogdGhpcy5hY2NvdW50SWQsXG4gICAgICAgICAgU2VydmljZVByaW5jaXBhbDogc2VydmljZVByaW5jaXBhbFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6RGVsZWdhdGVBZG1pbmlzdHJhdG9yXCIsXG4gICAgICBwb2xpY3k6IGN1c3RvbVJlc291cmNlcy5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU3RhdGVtZW50cyhbXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpSZWdpc3RlckRlbGVnYXRlZEFkbWluaXN0cmF0b3JcIixcbiAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpEZXJlZ2lzdGVyRGVsZWdhdGVkQWRtaW5pc3RyYXRvclwiLFxuICAgICAgICAgICAgXCJvcmdhbml6YXRpb25zOkxpc3REZWxlZ2F0ZWRBZG1pbmlzdHJhdG9yc1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1dcbiAgICAgICAgfSlcbiAgICAgIF0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIG5vcm1hbGl6ZSBhY2NvdW50IG5hbWVzIGZvciBjb25zdHJ1Y3QgSURzXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZUFjY291bnROYW1lKGFjY291bnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBhY2NvdW50TmFtZVxuICAgICAgLnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoL14oW2Etel0pLywgKG1hdGNoKSA9PiBtYXRjaC50b1VwcGVyQ2FzZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gbm9ybWFsaXplIHBvbGljeSBuYW1lcyBmb3IgY29uc3RydWN0IElEc1xuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVQb2xpY3lOYW1lKHBvbGljeU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBvbGljeU5hbWVcbiAgICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9eKFthLXpdKS8sIChtYXRjaCkgPT4gbWF0Y2gudG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIG5vcm1hbGl6ZSBzZXJ2aWNlIG5hbWVzIGZvciBjb25zdHJ1Y3QgSURzXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVNlcnZpY2VOYW1lKHNlcnZpY2VQcmluY2lwYWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNlcnZpY2VQcmluY2lwYWxcbiAgICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9eKFthLXpdKS8sIChtYXRjaCkgPT4gbWF0Y2gudG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSByb290IElEIChwbGFjZWhvbGRlciAtIHdvdWxkIG5lZWQgY3VzdG9tIGxvZ2ljIHRvIGdldCB0aGlzKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSb290SWQoKTogc3RyaW5nIHtcbiAgICAvLyBUaGlzIHdvdWxkIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgd2l0aCBhIGN1c3RvbSByZXNvdXJjZSB0byBnZXQgdGhlIHJvb3QgSURcbiAgICAvLyBGb3Igbm93LCB1c2luZyBhIHBsYWNlaG9sZGVyXG4gICAgcmV0dXJuIHRoaXMubm9kZS50cnlHZXRDb250ZXh0KFwib3JnYW5pc2F0aW9uUm9vdElkXCIpIHx8IFwici1wbGFjZWhvbGRlclwiO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import { DelegatedAdministratorProps } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* AWS Organisations Delegated Administrator construct
|
|
5
|
+
*/
|
|
6
|
+
export declare class DelegatedAdministrator extends Construct {
|
|
7
|
+
readonly servicePrincipal: string;
|
|
8
|
+
readonly accountId: string;
|
|
9
|
+
constructor(scope: Construct, id: string, props: DelegatedAdministratorProps);
|
|
10
|
+
/**
|
|
11
|
+
* Helper to normalize service names for construct IDs
|
|
12
|
+
*/
|
|
13
|
+
private normalizeServiceName;
|
|
14
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DelegatedAdministrator = 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("../utilities/awsCustomResource");
|
|
8
|
+
/**
|
|
9
|
+
* AWS Organisations Delegated Administrator construct
|
|
10
|
+
*/
|
|
11
|
+
class DelegatedAdministrator extends constructs_1.Construct {
|
|
12
|
+
constructor(scope, id, props) {
|
|
13
|
+
super(scope, id);
|
|
14
|
+
this.servicePrincipal = props.servicePrincipal;
|
|
15
|
+
this.accountId = props.accountId;
|
|
16
|
+
const serviceName = this.normalizeServiceName(props.servicePrincipal);
|
|
17
|
+
// Register delegated administrator
|
|
18
|
+
new awsCustomResource_1.AwsCustomResource(this, "DelegatedAdministratorResource", {
|
|
19
|
+
functionName: `delegateAdmin${serviceName}`,
|
|
20
|
+
onCreate: {
|
|
21
|
+
service: "organizations",
|
|
22
|
+
action: "RegisterDelegatedAdministratorCommand",
|
|
23
|
+
parameters: {
|
|
24
|
+
AccountId: props.accountId,
|
|
25
|
+
ServicePrincipal: props.servicePrincipal
|
|
26
|
+
},
|
|
27
|
+
physicalResourceId: customResources.PhysicalResourceId.of(`delegate-admin-${props.servicePrincipal}-${props.accountId}`)
|
|
28
|
+
},
|
|
29
|
+
onDelete: {
|
|
30
|
+
service: "organizations",
|
|
31
|
+
action: "DeregisterDelegatedAdministratorCommand",
|
|
32
|
+
parameters: {
|
|
33
|
+
AccountId: props.accountId,
|
|
34
|
+
ServicePrincipal: props.servicePrincipal
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
resourceType: "Custom::DelegatedAdministrator",
|
|
38
|
+
policy: customResources.AwsCustomResourcePolicy.fromStatements([
|
|
39
|
+
new aws_iam_1.PolicyStatement({
|
|
40
|
+
actions: [
|
|
41
|
+
"organizations:RegisterDelegatedAdministrator",
|
|
42
|
+
"organizations:DeregisterDelegatedAdministrator",
|
|
43
|
+
"organizations:ListDelegatedAdministrators"
|
|
44
|
+
],
|
|
45
|
+
resources: ["*"],
|
|
46
|
+
effect: aws_iam_1.Effect.ALLOW
|
|
47
|
+
})
|
|
48
|
+
])
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Helper to normalize service names for construct IDs
|
|
53
|
+
*/
|
|
54
|
+
normalizeServiceName(servicePrincipal) {
|
|
55
|
+
return servicePrincipal
|
|
56
|
+
.replace(/[^a-zA-Z0-9]/g, "")
|
|
57
|
+
.replace(/^([a-z])/, (match) => match.toUpperCase());
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.DelegatedAdministrator = DelegatedAdministrator;
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdGVkQWRtaW5pc3RyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL29yZ2FuaXNhdGlvbnMvZGVsZWdhdGVkQWRtaW5pc3RyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnRUFBZ0U7QUFDaEUsaURBQThEO0FBQzlELDJDQUF1QztBQUV2QyxzRUFBbUU7QUFFbkU7O0dBRUc7QUFDSCxNQUFhLHNCQUF1QixTQUFRLHNCQUFTO0lBSW5ELFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQWtDO1FBRWxDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFFakMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXRFLG1DQUFtQztRQUNuQyxJQUFJLHFDQUFpQixDQUFDLElBQUksRUFBRSxnQ0FBZ0MsRUFBRTtZQUM1RCxZQUFZLEVBQUUsZ0JBQWdCLFdBQVcsRUFBRTtZQUMzQyxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLE1BQU0sRUFBRSx1Q0FBdUM7Z0JBQy9DLFVBQVUsRUFBRTtvQkFDVixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7b0JBQzFCLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7aUJBQ3pDO2dCQUNELGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQ3ZELGtCQUFrQixLQUFLLENBQUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUM5RDthQUNGO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixNQUFNLEVBQUUseUNBQXlDO2dCQUNqRCxVQUFVLEVBQUU7b0JBQ1YsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO29CQUMxQixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO2lCQUN6QzthQUNGO1lBQ0QsWUFBWSxFQUFFLGdDQUFnQztZQUM5QyxNQUFNLEVBQUUsZUFBZSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQztnQkFDN0QsSUFBSSx5QkFBZSxDQUFDO29CQUNsQixPQUFPLEVBQUU7d0JBQ1AsOENBQThDO3dCQUM5QyxnREFBZ0Q7d0JBQ2hELDJDQUEyQztxQkFDNUM7b0JBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO29CQUNoQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2lCQUNyQixDQUFDO2FBQ0gsQ0FBQztTQUNILENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLG9CQUFvQixDQUFDLGdCQUF3QjtRQUNuRCxPQUFPLGdCQUFnQjthQUNwQixPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQzthQUM1QixPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0Y7QUE3REQsd0RBNkRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3VzdG9tUmVzb3VyY2VzIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgRGVsZWdhdGVkQWRtaW5pc3RyYXRvclByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9hd3NDdXN0b21SZXNvdXJjZVwiO1xuXG4vKipcbiAqIEFXUyBPcmdhbmlzYXRpb25zIERlbGVnYXRlZCBBZG1pbmlzdHJhdG9yIGNvbnN0cnVjdFxuICovXG5leHBvcnQgY2xhc3MgRGVsZWdhdGVkQWRtaW5pc3RyYXRvciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHJlYWRvbmx5IHNlcnZpY2VQcmluY2lwYWw6IHN0cmluZztcbiAgcmVhZG9ubHkgYWNjb3VudElkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBEZWxlZ2F0ZWRBZG1pbmlzdHJhdG9yUHJvcHNcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuc2VydmljZVByaW5jaXBhbCA9IHByb3BzLnNlcnZpY2VQcmluY2lwYWw7XG4gICAgdGhpcy5hY2NvdW50SWQgPSBwcm9wcy5hY2NvdW50SWQ7XG5cbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHRoaXMubm9ybWFsaXplU2VydmljZU5hbWUocHJvcHMuc2VydmljZVByaW5jaXBhbCk7XG5cbiAgICAvLyBSZWdpc3RlciBkZWxlZ2F0ZWQgYWRtaW5pc3RyYXRvclxuICAgIG5ldyBBd3NDdXN0b21SZXNvdXJjZSh0aGlzLCBcIkRlbGVnYXRlZEFkbWluaXN0cmF0b3JSZXNvdXJjZVwiLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGBkZWxlZ2F0ZUFkbWluJHtzZXJ2aWNlTmFtZX1gLFxuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJvcmdhbml6YXRpb25zXCIsXG4gICAgICAgIGFjdGlvbjogXCJSZWdpc3RlckRlbGVnYXRlZEFkbWluaXN0cmF0b3JDb21tYW5kXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBBY2NvdW50SWQ6IHByb3BzLmFjY291bnRJZCxcbiAgICAgICAgICBTZXJ2aWNlUHJpbmNpcGFsOiBwcm9wcy5zZXJ2aWNlUHJpbmNpcGFsXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBgZGVsZWdhdGUtYWRtaW4tJHtwcm9wcy5zZXJ2aWNlUHJpbmNpcGFsfS0ke3Byb3BzLmFjY291bnRJZH1gXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBvbkRlbGV0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIm9yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgYWN0aW9uOiBcIkRlcmVnaXN0ZXJEZWxlZ2F0ZWRBZG1pbmlzdHJhdG9yQ29tbWFuZFwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgQWNjb3VudElkOiBwcm9wcy5hY2NvdW50SWQsXG4gICAgICAgICAgU2VydmljZVByaW5jaXBhbDogcHJvcHMuc2VydmljZVByaW5jaXBhbFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6RGVsZWdhdGVkQWRtaW5pc3RyYXRvclwiLFxuICAgICAgcG9saWN5OiBjdXN0b21SZXNvdXJjZXMuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVN0YXRlbWVudHMoW1xuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6UmVnaXN0ZXJEZWxlZ2F0ZWRBZG1pbmlzdHJhdG9yXCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6RGVyZWdpc3RlckRlbGVnYXRlZEFkbWluaXN0cmF0b3JcIixcbiAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpMaXN0RGVsZWdhdGVkQWRtaW5pc3RyYXRvcnNcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XXG4gICAgICAgIH0pXG4gICAgICBdKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBub3JtYWxpemUgc2VydmljZSBuYW1lcyBmb3IgY29uc3RydWN0IElEc1xuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVTZXJ2aWNlTmFtZShzZXJ2aWNlUHJpbmNpcGFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZXJ2aWNlUHJpbmNpcGFsXG4gICAgICAucmVwbGFjZSgvW15hLXpBLVowLTldL2csIFwiXCIpXG4gICAgICAucmVwbGFjZSgvXihbYS16XSkvLCAobWF0Y2gpID0+IG1hdGNoLnRvVXBwZXJDYXNlKCkpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { Organisation } from "./organisation.js";
|
|
2
|
+
export { OrganisationalUnit } from "./organisationalUnit.js";
|
|
3
|
+
export { Account } from "./account.js";
|
|
4
|
+
export { Policy } from "./policy.js";
|
|
5
|
+
export { DelegatedAdministrator } from "./delegatedAdministrator.js";
|
|
6
|
+
export { TrustedServiceAccess } from "./trustedServiceAccess.js";
|
|
7
|
+
export { PolicyType, FeatureSet, IamUserAccessToBilling } from "./types.js";
|
|
8
|
+
export type { OrganisationProps, OrganisationalUnitProps, AccountProps, PolicyProps, AccountsConfig } from "./types.js";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IamUserAccessToBilling = exports.FeatureSet = exports.PolicyType = exports.TrustedServiceAccess = exports.DelegatedAdministrator = exports.Policy = exports.Account = exports.OrganisationalUnit = exports.Organisation = void 0;
|
|
4
|
+
// Simple approach (more like pepperize)
|
|
5
|
+
var organisation_js_1 = require("./organisation.js");
|
|
6
|
+
Object.defineProperty(exports, "Organisation", { enumerable: true, get: function () { return organisation_js_1.Organisation; } });
|
|
7
|
+
var organisationalUnit_js_1 = require("./organisationalUnit.js");
|
|
8
|
+
Object.defineProperty(exports, "OrganisationalUnit", { enumerable: true, get: function () { return organisationalUnit_js_1.OrganisationalUnit; } });
|
|
9
|
+
var account_js_1 = require("./account.js");
|
|
10
|
+
Object.defineProperty(exports, "Account", { enumerable: true, get: function () { return account_js_1.Account; } });
|
|
11
|
+
var policy_js_1 = require("./policy.js");
|
|
12
|
+
Object.defineProperty(exports, "Policy", { enumerable: true, get: function () { return policy_js_1.Policy; } });
|
|
13
|
+
var delegatedAdministrator_js_1 = require("./delegatedAdministrator.js");
|
|
14
|
+
Object.defineProperty(exports, "DelegatedAdministrator", { enumerable: true, get: function () { return delegatedAdministrator_js_1.DelegatedAdministrator; } });
|
|
15
|
+
var trustedServiceAccess_js_1 = require("./trustedServiceAccess.js");
|
|
16
|
+
Object.defineProperty(exports, "TrustedServiceAccess", { enumerable: true, get: function () { return trustedServiceAccess_js_1.TrustedServiceAccess; } });
|
|
17
|
+
// Enums and types (commonly used)
|
|
18
|
+
var types_js_1 = require("./types.js");
|
|
19
|
+
Object.defineProperty(exports, "PolicyType", { enumerable: true, get: function () { return types_js_1.PolicyType; } });
|
|
20
|
+
Object.defineProperty(exports, "FeatureSet", { enumerable: true, get: function () { return types_js_1.FeatureSet; } });
|
|
21
|
+
Object.defineProperty(exports, "IamUserAccessToBilling", { enumerable: true, get: function () { return types_js_1.IamUserAccessToBilling; } });
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9vcmdhbmlzYXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHdDQUF3QztBQUN4QyxxREFBaUQ7QUFBeEMsK0dBQUEsWUFBWSxPQUFBO0FBQ3JCLGlFQUE2RDtBQUFwRCwySEFBQSxrQkFBa0IsT0FBQTtBQUMzQiwyQ0FBdUM7QUFBOUIscUdBQUEsT0FBTyxPQUFBO0FBQ2hCLHlDQUFxQztBQUE1QixtR0FBQSxNQUFNLE9BQUE7QUFDZix5RUFBcUU7QUFBNUQsbUlBQUEsc0JBQXNCLE9BQUE7QUFDL0IscUVBQWlFO0FBQXhELCtIQUFBLG9CQUFvQixPQUFBO0FBRTdCLGtDQUFrQztBQUNsQyx1Q0FBNEU7QUFBbkUsc0dBQUEsVUFBVSxPQUFBO0FBQUUsc0dBQUEsVUFBVSxPQUFBO0FBQUUsa0hBQUEsc0JBQXNCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTaW1wbGUgYXBwcm9hY2ggKG1vcmUgbGlrZSBwZXBwZXJpemUpXG5leHBvcnQgeyBPcmdhbmlzYXRpb24gfSBmcm9tIFwiLi9vcmdhbmlzYXRpb24uanNcIjtcbmV4cG9ydCB7IE9yZ2FuaXNhdGlvbmFsVW5pdCB9IGZyb20gXCIuL29yZ2FuaXNhdGlvbmFsVW5pdC5qc1wiO1xuZXhwb3J0IHsgQWNjb3VudCB9IGZyb20gXCIuL2FjY291bnQuanNcIjtcbmV4cG9ydCB7IFBvbGljeSB9IGZyb20gXCIuL3BvbGljeS5qc1wiO1xuZXhwb3J0IHsgRGVsZWdhdGVkQWRtaW5pc3RyYXRvciB9IGZyb20gXCIuL2RlbGVnYXRlZEFkbWluaXN0cmF0b3IuanNcIjtcbmV4cG9ydCB7IFRydXN0ZWRTZXJ2aWNlQWNjZXNzIH0gZnJvbSBcIi4vdHJ1c3RlZFNlcnZpY2VBY2Nlc3MuanNcIjtcblxuLy8gRW51bXMgYW5kIHR5cGVzIChjb21tb25seSB1c2VkKVxuZXhwb3J0IHsgUG9saWN5VHlwZSwgRmVhdHVyZVNldCwgSWFtVXNlckFjY2Vzc1RvQmlsbGluZyB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbi8vIFByb3BzIG9ubHkgKG1vc3QgdXNlcnMgd29uJ3QgbmVlZCBpbnRlcmZhY2VzKVxuZXhwb3J0IHR5cGUge1xuICBPcmdhbmlzYXRpb25Qcm9wcyxcbiAgT3JnYW5pc2F0aW9uYWxVbml0UHJvcHMsXG4gIEFjY291bnRQcm9wcyxcbiAgUG9saWN5UHJvcHMsXG4gIEFjY291bnRzQ29uZmlnXG59IGZyb20gXCIuL3R5cGVzLmpzXCI7XG4iXX0=
|