@fjall/components-infrastructure 0.73.16 → 0.73.17
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/patterns/aws/ec2.d.ts +43 -0
- package/dist/lib/patterns/aws/ec2.js +123 -0
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +3 -3
- package/dist/lib/utils/getCidr.d.ts +8 -0
- package/dist/lib/utils/getCidr.js +40 -0
- package/package.json +3 -3
- package/dist/lib/__tests__/patterns/__snapshots__/compute.test.js.snap +0 -433
- package/dist/lib/__tests__/patterns/compute.test.d.ts +0 -1
- package/dist/lib/__tests__/patterns/compute.test.js +0 -137
- package/dist/lib/__tests__/simple.test.d.ts +0 -0
- package/dist/lib/__tests__/simple.test.js +0 -12
- package/dist/lib/resources/aws/backup/backupPlan.d.ts +0 -24
- package/dist/lib/resources/aws/backup/backupPlan.js +0 -172
- package/dist/lib/resources/aws/backup/backupVault.d.ts +0 -19
- package/dist/lib/resources/aws/backup/backupVault.js +0 -44
- package/dist/lib/resources/aws/backup/index.d.ts +0 -2
- package/dist/lib/resources/aws/backup/index.js +0 -19
- package/dist/lib/resources/aws/organisations/account.d.ts +0 -37
- package/dist/lib/resources/aws/organisations/account.js +0 -220
- package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +0 -14
- package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +0 -61
- package/dist/lib/resources/aws/organisations/index.d.ts +0 -8
- package/dist/lib/resources/aws/organisations/index.js +0 -22
- package/dist/lib/resources/aws/organisations/interfaces.d.ts +0 -105
- package/dist/lib/resources/aws/organisations/interfaces.js +0 -3
- package/dist/lib/resources/aws/organisations/organisation.d.ts +0 -47
- package/dist/lib/resources/aws/organisations/organisation.js +0 -263
- package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +0 -28
- package/dist/lib/resources/aws/organisations/organisationalUnit.js +0 -170
- package/dist/lib/resources/aws/organisations/policy.d.ts +0 -17
- package/dist/lib/resources/aws/organisations/policy.js +0 -93
- package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +0 -13
- package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +0 -58
- package/dist/lib/resources/aws/organisations/types.d.ts +0 -165
- package/dist/lib/resources/aws/organisations/types.js +0 -36
- package/dist/lib/utils/directTagging.d.ts +0 -31
- package/dist/lib/utils/directTagging.js +0 -86
- package/dist/lib/utils/fjallConstruct.d.ts +0 -8
- package/dist/lib/utils/fjallConstruct.js +0 -18
- package/dist/lib/utils/fjallStackSynthesizer.d.ts +0 -9
- package/dist/lib/utils/fjallStackSynthesizer.js +0 -22
- package/dist/lib/utils/tagContext.d.ts +0 -28
- package/dist/lib/utils/tagContext.js +0 -53
- package/dist/lib/utils/tagSynthesizer.d.ts +0 -13
- package/dist/lib/utils/tagSynthesizer.js +0 -55
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OrganisationalUnit = 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 awsCustomResource_1 = require("../utilities/awsCustomResource");
|
|
9
|
-
/**
|
|
10
|
-
* AWS Organisational Unit construct for managing OUs
|
|
11
|
-
*/
|
|
12
|
-
class OrganisationalUnit extends constructs_1.Construct {
|
|
13
|
-
constructor(scope, id, props) {
|
|
14
|
-
super(scope, id);
|
|
15
|
-
this.organisationalUnitName = props.organisationalUnitName;
|
|
16
|
-
const importOnDuplicate = props.importOnDuplicate ?? true;
|
|
17
|
-
const removalPolicy = props.removalPolicy ?? aws_cdk_lib_1.RemovalPolicy.RETAIN;
|
|
18
|
-
// Create organisational unit
|
|
19
|
-
const ouResource = new awsCustomResource_1.AwsCustomResource(this, "OrganisationalUnitResource", {
|
|
20
|
-
functionName: `manageOU${this.normalizeOUName(props.organisationalUnitName)}`,
|
|
21
|
-
onCreate: {
|
|
22
|
-
service: "organizations",
|
|
23
|
-
action: "CreateOrganizationalUnitCommand",
|
|
24
|
-
parameters: {
|
|
25
|
-
ParentId: props.parent.organisationalUnitId,
|
|
26
|
-
Name: props.organisationalUnitName
|
|
27
|
-
},
|
|
28
|
-
physicalResourceId: customResources.PhysicalResourceId.of(`ou-${props.organisationalUnitName}-${props.parent.organisationalUnitId}`),
|
|
29
|
-
ignoreErrorCodesMatching: importOnDuplicate
|
|
30
|
-
? "DuplicateOrganizationalUnitException"
|
|
31
|
-
: undefined
|
|
32
|
-
},
|
|
33
|
-
onUpdate: {
|
|
34
|
-
service: "organizations",
|
|
35
|
-
action: "DescribeOrganizationalUnitCommand",
|
|
36
|
-
parameters: {
|
|
37
|
-
OrganizationalUnitId: this.organisationalUnitId
|
|
38
|
-
},
|
|
39
|
-
physicalResourceId: customResources.PhysicalResourceId.of(`ou-${props.organisationalUnitName}-${props.parent.organisationalUnitId}`)
|
|
40
|
-
},
|
|
41
|
-
onDelete: removalPolicy === aws_cdk_lib_1.RemovalPolicy.DESTROY
|
|
42
|
-
? {
|
|
43
|
-
service: "organizations",
|
|
44
|
-
action: "DeleteOrganizationalUnitCommand",
|
|
45
|
-
parameters: {
|
|
46
|
-
OrganizationalUnitId: this.organisationalUnitId
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
: undefined,
|
|
50
|
-
resourceType: "Custom::OrganisationalUnit",
|
|
51
|
-
policy: customResources.AwsCustomResourcePolicy.fromStatements([
|
|
52
|
-
new aws_iam_1.PolicyStatement({
|
|
53
|
-
actions: [
|
|
54
|
-
"organizations:CreateOrganizationalUnit",
|
|
55
|
-
"organizations:DescribeOrganizationalUnit",
|
|
56
|
-
"organizations:DeleteOrganizationalUnit",
|
|
57
|
-
"organizations:ListOrganizationalUnitsForParent",
|
|
58
|
-
"organizations:UpdateOrganizationalUnit"
|
|
59
|
-
],
|
|
60
|
-
resources: ["*"],
|
|
61
|
-
effect: aws_iam_1.Effect.ALLOW
|
|
62
|
-
})
|
|
63
|
-
])
|
|
64
|
-
});
|
|
65
|
-
// Handle import case - if OU already exists, get its details
|
|
66
|
-
if (importOnDuplicate) {
|
|
67
|
-
const existingOUResource = new awsCustomResource_1.AwsCustomResource(this, "FindExistingOU", {
|
|
68
|
-
functionName: `findOU${this.normalizeOUName(props.organisationalUnitName)}`,
|
|
69
|
-
onCreate: {
|
|
70
|
-
service: "organizations",
|
|
71
|
-
action: "ListOrganizationalUnitsForParentCommand",
|
|
72
|
-
parameters: {
|
|
73
|
-
ParentId: props.parent.organisationalUnitId
|
|
74
|
-
},
|
|
75
|
-
physicalResourceId: customResources.PhysicalResourceId.of(`find-ou-${props.organisationalUnitName}-${props.parent.organisationalUnitId}`)
|
|
76
|
-
},
|
|
77
|
-
resourceType: "Custom::FindExistingOU",
|
|
78
|
-
policy: customResources.AwsCustomResourcePolicy.fromStatements([
|
|
79
|
-
new aws_iam_1.PolicyStatement({
|
|
80
|
-
actions: ["organizations:ListOrganizationalUnitsForParent"],
|
|
81
|
-
resources: ["*"],
|
|
82
|
-
effect: aws_iam_1.Effect.ALLOW
|
|
83
|
-
})
|
|
84
|
-
])
|
|
85
|
-
});
|
|
86
|
-
// Use a custom function to extract the OU ID from the list
|
|
87
|
-
this.organisationalUnitId =
|
|
88
|
-
this.extractOUIdFromList(existingOUResource.getResponseField("OrganizationalUnits"), props.organisationalUnitName) || ouResource.getResponseField("OrganizationalUnit.Id");
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
this.organisationalUnitId = ouResource.getResponseField("OrganizationalUnit.Id");
|
|
92
|
-
}
|
|
93
|
-
this.organisationalUnitArn = ouResource.getResponseField("OrganizationalUnit.Arn");
|
|
94
|
-
// Export OU details
|
|
95
|
-
new aws_cdk_lib_1.CfnOutput(this, "OrganisationalUnitId", {
|
|
96
|
-
key: `${id}Id`,
|
|
97
|
-
value: this.organisationalUnitId,
|
|
98
|
-
exportName: `${id}Id`
|
|
99
|
-
});
|
|
100
|
-
new aws_cdk_lib_1.CfnOutput(this, "OrganisationalUnitArn", {
|
|
101
|
-
key: `${id}Arn`,
|
|
102
|
-
value: this.organisationalUnitArn,
|
|
103
|
-
exportName: `${id}Arn`
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Attach policy to this organisational unit
|
|
108
|
-
*/
|
|
109
|
-
attachPolicy(policy) {
|
|
110
|
-
const policyName = this.normalizePolicyName(policy.policyName);
|
|
111
|
-
new awsCustomResource_1.AwsCustomResource(this, `AttachPolicy${policyName}`, {
|
|
112
|
-
functionName: `attachPolicyToOU${policyName}${this.normalizeOUName(this.organisationalUnitName)}`,
|
|
113
|
-
onCreate: {
|
|
114
|
-
service: "organizations",
|
|
115
|
-
action: "AttachPolicyCommand",
|
|
116
|
-
parameters: {
|
|
117
|
-
PolicyId: policy.policyId,
|
|
118
|
-
TargetId: this.organisationalUnitId
|
|
119
|
-
},
|
|
120
|
-
physicalResourceId: customResources.PhysicalResourceId.of(`attach-policy-${policy.policyId}-to-${this.organisationalUnitId}`)
|
|
121
|
-
},
|
|
122
|
-
onDelete: {
|
|
123
|
-
service: "organizations",
|
|
124
|
-
action: "DetachPolicyCommand",
|
|
125
|
-
parameters: {
|
|
126
|
-
PolicyId: policy.policyId,
|
|
127
|
-
TargetId: this.organisationalUnitId
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
resourceType: "Custom::AttachPolicyToOU",
|
|
131
|
-
policy: customResources.AwsCustomResourcePolicy.fromStatements([
|
|
132
|
-
new aws_iam_1.PolicyStatement({
|
|
133
|
-
actions: [
|
|
134
|
-
"organizations:AttachPolicy",
|
|
135
|
-
"organizations:DetachPolicy",
|
|
136
|
-
"organizations:ListPoliciesForTarget"
|
|
137
|
-
],
|
|
138
|
-
resources: ["*"],
|
|
139
|
-
effect: aws_iam_1.Effect.ALLOW
|
|
140
|
-
})
|
|
141
|
-
])
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Helper to normalize OU names for construct IDs
|
|
146
|
-
*/
|
|
147
|
-
normalizeOUName(ouName) {
|
|
148
|
-
return ouName
|
|
149
|
-
.replace(/[^a-zA-Z0-9]/g, "")
|
|
150
|
-
.replace(/^([a-z])/, (match) => match.toUpperCase());
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Helper to normalize policy names for construct IDs
|
|
154
|
-
*/
|
|
155
|
-
normalizePolicyName(policyName) {
|
|
156
|
-
return policyName
|
|
157
|
-
.replace(/[^a-zA-Z0-9]/g, "")
|
|
158
|
-
.replace(/^([a-z])/, (match) => match.toUpperCase());
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Extract OU ID from list response (this would need custom logic in the Lambda)
|
|
162
|
-
*/
|
|
163
|
-
extractOUIdFromList(organisationalUnits, name) {
|
|
164
|
-
// This is a placeholder - in reality, you'd need custom Lambda logic to parse the list
|
|
165
|
-
// For now, we'll rely on the create operation with ignoreErrorCodesMatching
|
|
166
|
-
return undefined;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
exports.OrganisationalUnit = OrganisationalUnit;
|
|
170
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pc2F0aW9uYWxVbml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3Mvb3JnYW5pc2F0aW9ucy9vcmdhbmlzYXRpb25hbFVuaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXVEO0FBQ3ZELGdFQUFnRTtBQUNoRSxpREFBOEQ7QUFDOUQsMkNBQXVDO0FBR3ZDLHNFQUFtRTtBQUVuRTs7R0FFRztBQUNILE1BQWEsa0JBQ1gsU0FBUSxzQkFBUztJQU9qQixZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztRQUMzRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUM7UUFDMUQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSwyQkFBYSxDQUFDLE1BQU0sQ0FBQztRQUVsRSw2QkFBNkI7UUFDN0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxxQ0FBaUIsQ0FDdEMsSUFBSSxFQUNKLDRCQUE0QixFQUM1QjtZQUNFLFlBQVksRUFBRSxXQUFXLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLEVBQUU7WUFDN0UsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixNQUFNLEVBQUUsaUNBQWlDO2dCQUN6QyxVQUFVLEVBQUU7b0JBQ1YsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsb0JBQW9CO29CQUMzQyxJQUFJLEVBQUUsS0FBSyxDQUFDLHNCQUFzQjtpQkFDbkM7Z0JBQ0Qsa0JBQWtCLEVBQUUsZUFBZSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FDdkQsTUFBTSxLQUFLLENBQUMsc0JBQXNCLElBQUks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cm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGN1c3RvbVJlc291cmNlcyBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElPcmdhbmlzYXRpb25hbFVuaXQsIElQb2xpY3kgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBPcmdhbmlzYXRpb25hbFVuaXRQcm9wcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcblxuLyoqXG4gKiBBV1MgT3JnYW5pc2F0aW9uYWwgVW5pdCBjb25zdHJ1Y3QgZm9yIG1hbmFnaW5nIE9Vc1xuICovXG5leHBvcnQgY2xhc3MgT3JnYW5pc2F0aW9uYWxVbml0XG4gIGV4dGVuZHMgQ29uc3RydWN0XG4gIGltcGxlbWVudHMgSU9yZ2FuaXNhdGlvbmFsVW5pdFxue1xuICByZWFkb25seSBvcmdhbmlzYXRpb25hbFVuaXRJZDogc3RyaW5nO1xuICByZWFkb25seSBvcmdhbmlzYXRpb25hbFVuaXRBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgb3JnYW5pc2F0aW9uYWxVbml0TmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBPcmdhbmlzYXRpb25hbFVuaXRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLm9yZ2FuaXNhdGlvbmFsVW5pdE5hbWUgPSBwcm9wcy5vcmdhbmlzYXRpb25hbFVuaXROYW1lO1xuICAgIGNvbnN0IGltcG9ydE9uRHVwbGljYXRlID0gcHJvcHMuaW1wb3J0T25EdXBsaWNhdGUgPz8gdHJ1ZTtcbiAgICBjb25zdCByZW1vdmFsUG9saWN5ID0gcHJvcHMucmVtb3ZhbFBvbGljeSA/PyBSZW1vdmFsUG9saWN5LlJFVEFJTjtcblxuICAgIC8vIENyZWF0ZSBvcmdhbmlzYXRpb25hbCB1bml0XG4gICAgY29uc3Qgb3VSZXNvdXJjZSA9IG5ldyBBd3NDdXN0b21SZXNvdXJjZShcbiAgICAgIHRoaXMsXG4gICAgICBcIk9yZ2FuaXNhdGlvbmFsVW5pdFJlc291cmNlXCIsXG4gICAgICB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogYG1hbmFnZU9VJHt0aGlzLm5vcm1hbGl6ZU9VTmFtZShwcm9wcy5vcmdhbmlzYXRpb25hbFVuaXROYW1lKX1gLFxuICAgICAgICBvbkNyZWF0ZToge1xuICAgICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICAgIGFjdGlvbjogXCJDcmVhdGVPcmdhbml6YXRpb25hbFVuaXRDb21tYW5kXCIsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgUGFyZW50SWQ6IHByb3BzLnBhcmVudC5vcmdhbmlzYXRpb25hbFVuaXRJZCxcbiAgICAgICAgICAgIE5hbWU6IHByb3BzLm9yZ2FuaXNhdGlvbmFsVW5pdE5hbWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICAgIGBvdS0ke3Byb3BzLm9yZ2FuaXNhdGlvbmFsVW5pdE5hbWV9LSR7cHJvcHMucGFyZW50Lm9yZ2FuaXNhdGlvbmFsVW5pdElkfWBcbiAgICAgICAgICApLFxuICAgICAgICAgIGlnbm9yZUVycm9yQ29kZXNNYXRjaGluZzogaW1wb3J0T25EdXBsaWNhdGVcbiAgICAgICAgICAgID8gXCJEdXBsaWNhdGVPcmdhbml6YXRpb25hbFVuaXRFeGNlcHRpb25cIlxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgfSxcbiAgICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgICBzZXJ2aWNlOiBcIm9yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgICBhY3Rpb246IFwiRGVzY3JpYmVPcmdhbml6YXRpb25hbFVuaXRDb21tYW5kXCIsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgT3JnYW5pemF0aW9uYWxVbml0SWQ6IHRoaXMub3JnYW5pc2F0aW9uYWxVbml0SWRcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICAgIGBvdS0ke3Byb3BzLm9yZ2FuaXNhdGlvbmFsVW5pdE5hbWV9LSR7cHJvcHMucGFyZW50Lm9yZ2FuaXNhdGlvbmFsVW5pdElkfWBcbiAgICAgICAgICApXG4gICAgICAgIH0sXG4gICAgICAgIG9uRGVsZXRlOlxuICAgICAgICAgIHJlbW92YWxQb2xpY3kgPT09IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgc2VydmljZTogXCJvcmdhbml6YXRpb25zXCIsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcIkRlbGV0ZU9yZ2FuaXphdGlvbmFsVW5pdENvbW1hbmRcIixcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICBPcmdhbml6YXRpb25hbFVuaXRJZDogdGhpcy5vcmdhbmlzYXRpb25hbFVuaXRJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206Ok9yZ2FuaXNhdGlvbmFsVW5pdFwiLFxuICAgICAgICBwb2xpY3k6IGN1c3RvbVJlc291cmNlcy5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU3RhdGVtZW50cyhbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpDcmVhdGVPcmdhbml6YXRpb25hbFVuaXRcIixcbiAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb25zOkRlc2NyaWJlT3JnYW5pemF0aW9uYWxVbml0XCIsXG4gICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpEZWxldGVPcmdhbml6YXRpb25hbFVuaXRcIixcbiAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb25zOkxpc3RPcmdhbml6YXRpb25hbFVuaXRzRm9yUGFyZW50XCIsXG4gICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpVcGRhdGVPcmdhbml6YXRpb25hbFVuaXRcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XXG4gICAgICAgICAgfSlcbiAgICAgICAgXSlcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gSGFuZGxlIGltcG9ydCBjYXNlIC0gaWYgT1UgYWxyZWFkeSBleGlzdHMsIGdldCBpdHMgZGV0YWlsc1xuICAgIGlmIChpbXBvcnRPbkR1cGxpY2F0ZSkge1xuICAgICAgY29uc3QgZXhpc3RpbmdPVVJlc291cmNlID0gbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiRmluZEV4aXN0aW5nT1VcIiwge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGBmaW5kT1Uke3RoaXMubm9ybWFsaXplT1VOYW1lKHByb3BzLm9yZ2FuaXNhdGlvbmFsVW5pdE5hbWUpfWAsXG4gICAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgICAgc2VydmljZTogXCJvcmdhbml6YXRpb25zXCIsXG4gICAgICAgICAgYWN0aW9uOiBcIkxpc3RPcmdhbml6YXRpb25hbFVuaXRzRm9yUGFyZW50Q29tbWFuZFwiLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIFBhcmVudElkOiBwcm9wcy5wYXJlbnQub3JnYW5pc2F0aW9uYWxVbml0SWRcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICAgIGBmaW5kLW91LSR7cHJvcHMub3JnYW5pc2F0aW9uYWxVbml0TmFtZX0tJHtwcm9wcy5wYXJlbnQub3JnYW5pc2F0aW9uYWxVbml0SWR9YFxuICAgICAgICAgIClcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6RmluZEV4aXN0aW5nT1VcIixcbiAgICAgICAgcG9saWN5OiBjdXN0b21SZXNvdXJjZXMuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVN0YXRlbWVudHMoW1xuICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgYWN0aW9uczogW1wib3JnYW5pemF0aW9uczpMaXN0T3JnYW5pemF0aW9uYWxVbml0c0ZvclBhcmVudFwiXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XXG4gICAgICAgICAgfSlcbiAgICAgICAgXSlcbiAgICAgIH0pO1xuXG4gICAgICAvLyBVc2UgYSBjdXN0b20gZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUgT1UgSUQgZnJvbSB0aGUgbGlzdFxuICAgICAgdGhpcy5vcmdhbmlzYXRpb25hbFVuaXRJZCA9XG4gICAgICAgIHRoaXMuZXh0cmFjdE9VSWRGcm9tTGlzdChcbiAgICAgICAgICBleGlzdGluZ09VUmVzb3VyY2UuZ2V0UmVzcG9uc2VGaWVsZChcIk9yZ2FuaXphdGlvbmFsVW5pdHNcIiksXG4gICAgICAgICAgcHJvcHMub3JnYW5pc2F0aW9uYWxVbml0TmFtZVxuICAgICAgICApIHx8IG91UmVzb3VyY2UuZ2V0UmVzcG9uc2VGaWVsZChcIk9yZ2FuaXphdGlvbmFsVW5pdC5JZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcmdhbmlzYXRpb25hbFVuaXRJZCA9IG91UmVzb3VyY2UuZ2V0UmVzcG9uc2VGaWVsZChcbiAgICAgICAgXCJPcmdhbml6YXRpb25hbFVuaXQuSWRcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLm9yZ2FuaXNhdGlvbmFsVW5pdEFybiA9IG91UmVzb3VyY2UuZ2V0UmVzcG9uc2VGaWVsZChcbiAgICAgIFwiT3JnYW5pemF0aW9uYWxVbml0LkFyblwiXG4gICAgKTtcblxuICAgIC8vIEV4cG9ydCBPVSBkZXRhaWxzXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBcIk9yZ2FuaXNhdGlvbmFsVW5pdElkXCIsIHtcbiAgICAgIGtleTogYCR7aWR9SWRgLFxuICAgICAgdmFsdWU6IHRoaXMub3JnYW5pc2F0aW9uYWxVbml0SWQsXG4gICAgICBleHBvcnROYW1lOiBgJHtpZH1JZGBcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgXCJPcmdhbmlzYXRpb25hbFVuaXRBcm5cIiwge1xuICAgICAga2V5OiBgJHtpZH1Bcm5gLFxuICAgICAgdmFsdWU6IHRoaXMub3JnYW5pc2F0aW9uYWxVbml0QXJuLFxuICAgICAgZXhwb3J0TmFtZTogYCR7aWR9QXJuYFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBwb2xpY3kgdG8gdGhpcyBvcmdhbmlzYXRpb25hbCB1bml0XG4gICAqL1xuICBhdHRhY2hQb2xpY3kocG9saWN5OiBJUG9saWN5KTogdm9pZCB7XG4gICAgY29uc3QgcG9saWN5TmFtZSA9IHRoaXMubm9ybWFsaXplUG9saWN5TmFtZShwb2xpY3kucG9saWN5TmFtZSk7XG5cbiAgICBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgYEF0dGFjaFBvbGljeSR7cG9saWN5TmFtZX1gLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGBhdHRhY2hQb2xpY3lUb09VJHtwb2xpY3lOYW1lfSR7dGhpcy5ub3JtYWxpemVPVU5hbWUodGhpcy5vcmdhbmlzYXRpb25hbFVuaXROYW1lKX1gLFxuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJvcmdhbml6YXRpb25zXCIsXG4gICAgICAgIGFjdGlvbjogXCJBdHRhY2hQb2xpY3lDb21tYW5kXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBQb2xpY3lJZDogcG9saWN5LnBvbGljeUlkLFxuICAgICAgICAgIFRhcmdldElkOiB0aGlzLm9yZ2FuaXNhdGlvbmFsVW5pdElkXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBgYXR0YWNoLXBvbGljeS0ke3BvbGljeS5wb2xpY3lJZH0tdG8tJHt0aGlzLm9yZ2FuaXNhdGlvbmFsVW5pdElkfWBcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG9uRGVsZXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICBhY3Rpb246IFwiRGV0YWNoUG9saWN5Q29tbWFuZFwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgUG9saWN5SWQ6IHBvbGljeS5wb2xpY3lJZCxcbiAgICAgICAgICBUYXJnZXRJZDogdGhpcy5vcmdhbmlzYXRpb25hbFVuaXRJZFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6QXR0YWNoUG9saWN5VG9PVVwiLFxuICAgICAgcG9saWN5OiBjdXN0b21SZXNvdXJjZXMuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVN0YXRlbWVudHMoW1xuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6QXR0YWNoUG9saWN5XCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6RGV0YWNoUG9saWN5XCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6TGlzdFBvbGljaWVzRm9yVGFyZ2V0XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPV1xuICAgICAgICB9KVxuICAgICAgXSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gbm9ybWFsaXplIE9VIG5hbWVzIGZvciBjb25zdHJ1Y3QgSURzXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZU9VTmFtZShvdU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG91TmFtZVxuICAgICAgLnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoL14oW2Etel0pLywgKG1hdGNoKSA9PiBtYXRjaC50b1VwcGVyQ2FzZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gbm9ybWFsaXplIHBvbGljeSBuYW1lcyBmb3IgY29uc3RydWN0IElEc1xuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVQb2xpY3lOYW1lKHBvbGljeU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBvbGljeU5hbWVcbiAgICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9eKFthLXpdKS8sIChtYXRjaCkgPT4gbWF0Y2gudG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBPVSBJRCBmcm9tIGxpc3QgcmVzcG9uc2UgKHRoaXMgd291bGQgbmVlZCBjdXN0b20gbG9naWMgaW4gdGhlIExhbWJkYSlcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdE9VSWRGcm9tTGlzdChcbiAgICBvcmdhbmlzYXRpb25hbFVuaXRzOiBhbnksXG4gICAgbmFtZTogc3RyaW5nXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhpcyBpcyBhIHBsYWNlaG9sZGVyIC0gaW4gcmVhbGl0eSwgeW91J2QgbmVlZCBjdXN0b20gTGFtYmRhIGxvZ2ljIHRvIHBhcnNlIHRoZSBsaXN0XG4gICAgLy8gRm9yIG5vdywgd2UnbGwgcmVseSBvbiB0aGUgY3JlYXRlIG9wZXJhdGlvbiB3aXRoIGlnbm9yZUVycm9yQ29kZXNNYXRjaGluZ1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Construct } from "constructs";
|
|
2
|
-
import { IPolicy } from "./interfaces";
|
|
3
|
-
import { PolicyProps, PolicyType } from "./types";
|
|
4
|
-
/**
|
|
5
|
-
* AWS Organisations Policy construct for managing policies
|
|
6
|
-
*/
|
|
7
|
-
export declare class Policy extends Construct implements IPolicy {
|
|
8
|
-
readonly policyId: string;
|
|
9
|
-
readonly policyArn: string;
|
|
10
|
-
readonly policyName: string;
|
|
11
|
-
readonly policyType: PolicyType;
|
|
12
|
-
constructor(scope: Construct, id: string, props: PolicyProps);
|
|
13
|
-
/**
|
|
14
|
-
* Helper to normalize policy names for construct IDs
|
|
15
|
-
*/
|
|
16
|
-
private normalizePolicyName;
|
|
17
|
-
}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Policy = 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 awsCustomResource_1 = require("../utilities/awsCustomResource");
|
|
9
|
-
/**
|
|
10
|
-
* AWS Organisations Policy construct for managing policies
|
|
11
|
-
*/
|
|
12
|
-
class Policy extends constructs_1.Construct {
|
|
13
|
-
constructor(scope, id, props) {
|
|
14
|
-
super(scope, id);
|
|
15
|
-
this.policyName = props.policyName;
|
|
16
|
-
this.policyType = props.policyType;
|
|
17
|
-
const importOnDuplicate = props.importOnDuplicate ?? true;
|
|
18
|
-
// Create policy
|
|
19
|
-
const policyResource = new awsCustomResource_1.AwsCustomResource(this, "PolicyResource", {
|
|
20
|
-
functionName: `managePolicy${this.normalizePolicyName(props.policyName)}`,
|
|
21
|
-
onCreate: {
|
|
22
|
-
service: "organizations",
|
|
23
|
-
action: "CreatePolicyCommand",
|
|
24
|
-
parameters: {
|
|
25
|
-
Name: props.policyName,
|
|
26
|
-
Description: props.description,
|
|
27
|
-
Content: props.content,
|
|
28
|
-
Type: props.policyType
|
|
29
|
-
},
|
|
30
|
-
physicalResourceId: customResources.PhysicalResourceId.of(`policy-${props.policyName}-${props.policyType}`),
|
|
31
|
-
ignoreErrorCodesMatching: importOnDuplicate
|
|
32
|
-
? "DuplicatePolicyException"
|
|
33
|
-
: undefined
|
|
34
|
-
},
|
|
35
|
-
onUpdate: {
|
|
36
|
-
service: "organizations",
|
|
37
|
-
action: "UpdatePolicyCommand",
|
|
38
|
-
parameters: {
|
|
39
|
-
PolicyId: this.policyId,
|
|
40
|
-
Name: props.policyName,
|
|
41
|
-
Description: props.description,
|
|
42
|
-
Content: props.content
|
|
43
|
-
},
|
|
44
|
-
physicalResourceId: customResources.PhysicalResourceId.of(`policy-${props.policyName}-${props.policyType}`)
|
|
45
|
-
},
|
|
46
|
-
onDelete: {
|
|
47
|
-
service: "organizations",
|
|
48
|
-
action: "DeletePolicyCommand",
|
|
49
|
-
parameters: {
|
|
50
|
-
PolicyId: this.policyId
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
resourceType: "Custom::Policy",
|
|
54
|
-
policy: customResources.AwsCustomResourcePolicy.fromStatements([
|
|
55
|
-
new aws_iam_1.PolicyStatement({
|
|
56
|
-
actions: [
|
|
57
|
-
"organizations:CreatePolicy",
|
|
58
|
-
"organizations:UpdatePolicy",
|
|
59
|
-
"organizations:DeletePolicy",
|
|
60
|
-
"organizations:DescribePolicy",
|
|
61
|
-
"organizations:ListPolicies"
|
|
62
|
-
],
|
|
63
|
-
resources: ["*"],
|
|
64
|
-
effect: aws_iam_1.Effect.ALLOW
|
|
65
|
-
})
|
|
66
|
-
])
|
|
67
|
-
});
|
|
68
|
-
// Get policy details from the create operation
|
|
69
|
-
this.policyId = policyResource.getResponseField("Policy.PolicySummary.Id");
|
|
70
|
-
this.policyArn = policyResource.getResponseField("Policy.PolicySummary.Arn");
|
|
71
|
-
// Export policy details
|
|
72
|
-
new aws_cdk_lib_1.CfnOutput(this, "PolicyId", {
|
|
73
|
-
key: `${id}Id`,
|
|
74
|
-
value: this.policyId,
|
|
75
|
-
exportName: `${id}Id`
|
|
76
|
-
});
|
|
77
|
-
new aws_cdk_lib_1.CfnOutput(this, "PolicyArn", {
|
|
78
|
-
key: `${id}Arn`,
|
|
79
|
-
value: this.policyArn,
|
|
80
|
-
exportName: `${id}Arn`
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Helper to normalize policy names for construct IDs
|
|
85
|
-
*/
|
|
86
|
-
normalizePolicyName(policyName) {
|
|
87
|
-
return policyName
|
|
88
|
-
.replace(/[^a-zA-Z0-9]/g, "")
|
|
89
|
-
.replace(/^([a-z])/, (match) => match.toUpperCase());
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
exports.Policy = Policy;
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3Mvb3JnYW5pc2F0aW9ucy9wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXVEO0FBQ3ZELGdFQUFnRTtBQUNoRSxpREFBOEQ7QUFDOUQsMkNBQXVDO0FBR3ZDLHNFQUFtRTtBQUVuRTs7R0FFRztBQUNILE1BQWEsTUFBTyxTQUFRLHNCQUFTO0lBTW5DLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0I7UUFDMUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ25DLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQztRQUUxRCxnQkFBZ0I7UUFDaEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxxQ0FBaUIsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDbkUsWUFBWSxFQUFFLGVBQWUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN6RSxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLE1BQU0sRUFBRSxxQkFBcUI7Z0JBQzdCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsS0FBSyxDQUFDLFVBQVU7b0JBQ3RCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztvQkFDOUIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO29CQUN0QixJQUFJLEVBQUUsS0FBSyxDQUFDLFVBQVU7aUJBQ3ZCO2dCQUNELGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQ3ZELFVBQVUsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQ2pEO2dCQUNELHdCQUF3QixFQUFFLGlCQUFpQjtvQkFDekMsQ0FBQyxDQUFDLDBCQUEwQjtvQkFDNUIsQ0FBQyxDQUFDLFNBQVM7YUFDZDtZQUNELFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsTUFBTSxFQUFFLHFCQUFxQjtnQkFDN0IsVUFBVSxFQUFFO29CQUNWLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDdkIsSUFBSSxFQUFFLEtBQUssQ0FBQyxVQUFVO29CQUN0QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQzlCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztpQkFDdkI7Z0JBQ0Qsa0JBQWtCLEVBQUUsZUFBZSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FDdkQsVUFBVSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FDakQ7YUFDRjtZQUNELFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsTUFBTSxFQUFFLHFCQUFxQjtnQkFDN0IsVUFBVSxFQUFFO29CQUNWLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtpQkFDeEI7YUFDRjtZQUNELFlBQVksRUFBRSxnQkFBZ0I7WUFDOUIsTUFBTSxFQUFFLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUM7Z0JBQzdELElBQUkseUJBQWUsQ0FBQztvQkFDbEIsT0FBTyxFQUFFO3dCQUNQLDRCQUE0Qjt3QkFDNUIsNEJBQTRCO3dCQUM1Qiw0QkFBNEI7d0JBQzVCLDhCQUE4Qjt3QkFDOUIsNEJBQTRCO3FCQUM3QjtvQkFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7b0JBQ2hCLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7aUJBQ3JCLENBQUM7YUFDSCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsZ0JBQWdCLENBQzlDLDBCQUEwQixDQUMzQixDQUFDO1FBRUYsd0JBQXdCO1FBQ3hCLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQzlCLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSTtZQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNwQixVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUk7U0FDdEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUU7WUFDL0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLO1lBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3JCLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSztTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUIsQ0FBQyxVQUFrQjtRQUM1QyxPQUFPLFVBQVU7YUFDZCxPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQzthQUM1QixPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0Y7QUFoR0Qsd0JBZ0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBjdXN0b21SZXNvdXJjZXMgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IEVmZmVjdCwgUG9saWN5U3RhdGVtZW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBJUG9saWN5IH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgUG9saWN5UHJvcHMsIFBvbGljeVR5cGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQXdzQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2F3c0N1c3RvbVJlc291cmNlXCI7XG5cbi8qKlxuICogQVdTIE9yZ2FuaXNhdGlvbnMgUG9saWN5IGNvbnN0cnVjdCBmb3IgbWFuYWdpbmcgcG9saWNpZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFBvbGljeSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElQb2xpY3kge1xuICByZWFkb25seSBwb2xpY3lJZDogc3RyaW5nO1xuICByZWFkb25seSBwb2xpY3lBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgcG9saWN5TmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwb2xpY3lUeXBlOiBQb2xpY3lUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQb2xpY3lQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnBvbGljeU5hbWUgPSBwcm9wcy5wb2xpY3lOYW1lO1xuICAgIHRoaXMucG9saWN5VHlwZSA9IHByb3BzLnBvbGljeVR5cGU7XG4gICAgY29uc3QgaW1wb3J0T25EdXBsaWNhdGUgPSBwcm9wcy5pbXBvcnRPbkR1cGxpY2F0ZSA/PyB0cnVlO1xuXG4gICAgLy8gQ3JlYXRlIHBvbGljeVxuICAgIGNvbnN0IHBvbGljeVJlc291cmNlID0gbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiUG9saWN5UmVzb3VyY2VcIiwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBgbWFuYWdlUG9saWN5JHt0aGlzLm5vcm1hbGl6ZVBvbGljeU5hbWUocHJvcHMucG9saWN5TmFtZSl9YCxcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICBhY3Rpb246IFwiQ3JlYXRlUG9saWN5Q29tbWFuZFwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgTmFtZTogcHJvcHMucG9saWN5TmFtZSxcbiAgICAgICAgICBEZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgQ29udGVudDogcHJvcHMuY29udGVudCxcbiAgICAgICAgICBUeXBlOiBwcm9wcy5wb2xpY3lUeXBlXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBgcG9saWN5LSR7cHJvcHMucG9saWN5TmFtZX0tJHtwcm9wcy5wb2xpY3lUeXBlfWBcbiAgICAgICAgKSxcbiAgICAgICAgaWdub3JlRXJyb3JDb2Rlc01hdGNoaW5nOiBpbXBvcnRPbkR1cGxpY2F0ZVxuICAgICAgICAgID8gXCJEdXBsaWNhdGVQb2xpY3lFeGNlcHRpb25cIlxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJvcmdhbml6YXRpb25zXCIsXG4gICAgICAgIGFjdGlvbjogXCJVcGRhdGVQb2xpY3lDb21tYW5kXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBQb2xpY3lJZDogdGhpcy5wb2xpY3lJZCxcbiAgICAgICAgICBOYW1lOiBwcm9wcy5wb2xpY3lOYW1lLFxuICAgICAgICAgIERlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICBDb250ZW50OiBwcm9wcy5jb250ZW50XG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBgcG9saWN5LSR7cHJvcHMucG9saWN5TmFtZX0tJHtwcm9wcy5wb2xpY3lUeXBlfWBcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG9uRGVsZXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICBhY3Rpb246IFwiRGVsZXRlUG9saWN5Q29tbWFuZFwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgUG9saWN5SWQ6IHRoaXMucG9saWN5SWRcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OlBvbGljeVwiLFxuICAgICAgcG9saWN5OiBjdXN0b21SZXNvdXJjZXMuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVN0YXRlbWVudHMoW1xuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6Q3JlYXRlUG9saWN5XCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6VXBkYXRlUG9saWN5XCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6RGVsZXRlUG9saWN5XCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6RGVzY3JpYmVQb2xpY3lcIixcbiAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpMaXN0UG9saWNpZXNcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XXG4gICAgICAgIH0pXG4gICAgICBdKVxuICAgIH0pO1xuXG4gICAgLy8gR2V0IHBvbGljeSBkZXRhaWxzIGZyb20gdGhlIGNyZWF0ZSBvcGVyYXRpb25cbiAgICB0aGlzLnBvbGljeUlkID0gcG9saWN5UmVzb3VyY2UuZ2V0UmVzcG9uc2VGaWVsZChcIlBvbGljeS5Qb2xpY3lTdW1tYXJ5LklkXCIpO1xuICAgIHRoaXMucG9saWN5QXJuID0gcG9saWN5UmVzb3VyY2UuZ2V0UmVzcG9uc2VGaWVsZChcbiAgICAgIFwiUG9saWN5LlBvbGljeVN1bW1hcnkuQXJuXCJcbiAgICApO1xuXG4gICAgLy8gRXhwb3J0IHBvbGljeSBkZXRhaWxzXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBcIlBvbGljeUlkXCIsIHtcbiAgICAgIGtleTogYCR7aWR9SWRgLFxuICAgICAgdmFsdWU6IHRoaXMucG9saWN5SWQsXG4gICAgICBleHBvcnROYW1lOiBgJHtpZH1JZGBcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgXCJQb2xpY3lBcm5cIiwge1xuICAgICAga2V5OiBgJHtpZH1Bcm5gLFxuICAgICAgdmFsdWU6IHRoaXMucG9saWN5QXJuLFxuICAgICAgZXhwb3J0TmFtZTogYCR7aWR9QXJuYFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBub3JtYWxpemUgcG9saWN5IG5hbWVzIGZvciBjb25zdHJ1Y3QgSURzXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVBvbGljeU5hbWUocG9saWN5TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcG9saWN5TmFtZVxuICAgICAgLnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoL14oW2Etel0pLywgKG1hdGNoKSA9PiBtYXRjaC50b1VwcGVyQ2FzZSgpKTtcbiAgfVxufVxuIl19
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { Construct } from "constructs";
|
|
2
|
-
import { TrustedServiceAccessProps } from "./types";
|
|
3
|
-
/**
|
|
4
|
-
* AWS Organisations Trusted Service Access construct
|
|
5
|
-
*/
|
|
6
|
-
export declare class TrustedServiceAccess extends Construct {
|
|
7
|
-
readonly servicePrincipal: string;
|
|
8
|
-
constructor(scope: Construct, id: string, props: TrustedServiceAccessProps);
|
|
9
|
-
/**
|
|
10
|
-
* Helper to normalize service names for construct IDs
|
|
11
|
-
*/
|
|
12
|
-
private normalizeServiceName;
|
|
13
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TrustedServiceAccess = 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 Trusted Service Access construct
|
|
10
|
-
*/
|
|
11
|
-
class TrustedServiceAccess extends constructs_1.Construct {
|
|
12
|
-
constructor(scope, id, props) {
|
|
13
|
-
super(scope, id);
|
|
14
|
-
this.servicePrincipal = props.servicePrincipal;
|
|
15
|
-
const serviceName = this.normalizeServiceName(props.servicePrincipal);
|
|
16
|
-
// Enable trusted service access
|
|
17
|
-
new awsCustomResource_1.AwsCustomResource(this, "TrustedServiceAccessResource", {
|
|
18
|
-
functionName: `enableTrustedService${serviceName}`,
|
|
19
|
-
onCreate: {
|
|
20
|
-
service: "organizations",
|
|
21
|
-
action: "EnableAWSServiceAccessCommand",
|
|
22
|
-
parameters: {
|
|
23
|
-
ServicePrincipal: props.servicePrincipal
|
|
24
|
-
},
|
|
25
|
-
physicalResourceId: customResources.PhysicalResourceId.of(`trusted-service-${props.servicePrincipal}`)
|
|
26
|
-
},
|
|
27
|
-
onDelete: {
|
|
28
|
-
service: "organizations",
|
|
29
|
-
action: "DisableAWSServiceAccessCommand",
|
|
30
|
-
parameters: {
|
|
31
|
-
ServicePrincipal: props.servicePrincipal
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
resourceType: "Custom::TrustedServiceAccess",
|
|
35
|
-
policy: customResources.AwsCustomResourcePolicy.fromStatements([
|
|
36
|
-
new aws_iam_1.PolicyStatement({
|
|
37
|
-
actions: [
|
|
38
|
-
"organizations:EnableAWSServiceAccess",
|
|
39
|
-
"organizations:DisableAWSServiceAccess",
|
|
40
|
-
"organizations:ListAWSServiceAccessForOrganization"
|
|
41
|
-
],
|
|
42
|
-
resources: ["*"],
|
|
43
|
-
effect: aws_iam_1.Effect.ALLOW
|
|
44
|
-
})
|
|
45
|
-
])
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Helper to normalize service names for construct IDs
|
|
50
|
-
*/
|
|
51
|
-
normalizeServiceName(servicePrincipal) {
|
|
52
|
-
return servicePrincipal
|
|
53
|
-
.replace(/[^a-zA-Z0-9]/g, "")
|
|
54
|
-
.replace(/^([a-z])/, (match) => match.toUpperCase());
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
exports.TrustedServiceAccess = TrustedServiceAccess;
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZFNlcnZpY2VBY2Nlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9vcmdhbmlzYXRpb25zL3RydXN0ZWRTZXJ2aWNlQWNjZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdFQUFnRTtBQUNoRSxpREFBOEQ7QUFDOUQsMkNBQXVDO0FBRXZDLHNFQUFtRTtBQUVuRTs7R0FFRztBQUNILE1BQWEsb0JBQXFCLFNBQVEsc0JBQVM7SUFHakQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQztRQUN4RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7UUFFL0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXRFLGdDQUFnQztRQUNoQyxJQUFJLHFDQUFpQixDQUFDLElBQUksRUFBRSw4QkFBOEIsRUFBRTtZQUMxRCxZQUFZLEVBQUUsdUJBQXVCLFdBQVcsRUFBRTtZQUNsRCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLE1BQU0sRUFBRSwrQkFBK0I7Z0JBQ3ZDLFVBQVUsRUFBRTtvQkFDVixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO2lCQUN6QztnQkFDRCxrQkFBa0IsRUFBRSxlQUFlLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUN2RCxtQkFBbUIsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQzVDO2FBQ0Y7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLE1BQU0sRUFBRSxnQ0FBZ0M7Z0JBQ3hDLFVBQVUsRUFBRTtvQkFDVixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO2lCQUN6QzthQUNGO1lBQ0QsWUFBWSxFQUFFLDhCQUE4QjtZQUM1QyxNQUFNLEVBQUUsZUFBZSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQztnQkFDN0QsSUFBSSx5QkFBZSxDQUFDO29CQUNsQixPQUFPLEVBQUU7d0JBQ1Asc0NBQXNDO3dCQUN0Qyx1Q0FBdUM7d0JBQ3ZDLG1EQUFtRDtxQkFDcEQ7b0JBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO29CQUNoQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2lCQUNyQixDQUFDO2FBQ0gsQ0FBQztTQUNILENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLG9CQUFvQixDQUFDLGdCQUF3QjtRQUNuRCxPQUFPLGdCQUFnQjthQUNwQixPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQzthQUM1QixPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0Y7QUFyREQsb0RBcURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3VzdG9tUmVzb3VyY2VzIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVHJ1c3RlZFNlcnZpY2VBY2Nlc3NQcm9wcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcblxuLyoqXG4gKiBBV1MgT3JnYW5pc2F0aW9ucyBUcnVzdGVkIFNlcnZpY2UgQWNjZXNzIGNvbnN0cnVjdFxuICovXG5leHBvcnQgY2xhc3MgVHJ1c3RlZFNlcnZpY2VBY2Nlc3MgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICByZWFkb25seSBzZXJ2aWNlUHJpbmNpcGFsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFRydXN0ZWRTZXJ2aWNlQWNjZXNzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5zZXJ2aWNlUHJpbmNpcGFsID0gcHJvcHMuc2VydmljZVByaW5jaXBhbDtcblxuICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gdGhpcy5ub3JtYWxpemVTZXJ2aWNlTmFtZShwcm9wcy5zZXJ2aWNlUHJpbmNpcGFsKTtcblxuICAgIC8vIEVuYWJsZSB0cnVzdGVkIHNlcnZpY2UgYWNjZXNzXG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiVHJ1c3RlZFNlcnZpY2VBY2Nlc3NSZXNvdXJjZVwiLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGBlbmFibGVUcnVzdGVkU2VydmljZSR7c2VydmljZU5hbWV9YCxcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICBhY3Rpb246IFwiRW5hYmxlQVdTU2VydmljZUFjY2Vzc0NvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIFNlcnZpY2VQcmluY2lwYWw6IHByb3BzLnNlcnZpY2VQcmluY2lwYWxcbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjdXN0b21SZXNvdXJjZXMuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgIGB0cnVzdGVkLXNlcnZpY2UtJHtwcm9wcy5zZXJ2aWNlUHJpbmNpcGFsfWBcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG9uRGVsZXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICBhY3Rpb246IFwiRGlzYWJsZUFXU1NlcnZpY2VBY2Nlc3NDb21tYW5kXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBTZXJ2aWNlUHJpbmNpcGFsOiBwcm9wcy5zZXJ2aWNlUHJpbmNpcGFsXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpUcnVzdGVkU2VydmljZUFjY2Vzc1wiLFxuICAgICAgcG9saWN5OiBjdXN0b21SZXNvdXJjZXMuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVN0YXRlbWVudHMoW1xuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6RW5hYmxlQVdTU2VydmljZUFjY2Vzc1wiLFxuICAgICAgICAgICAgXCJvcmdhbml6YXRpb25zOkRpc2FibGVBV1NTZXJ2aWNlQWNjZXNzXCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6TGlzdEFXU1NlcnZpY2VBY2Nlc3NGb3JPcmdhbml6YXRpb25cIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XXG4gICAgICAgIH0pXG4gICAgICBdKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBub3JtYWxpemUgc2VydmljZSBuYW1lcyBmb3IgY29uc3RydWN0IElEc1xuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVTZXJ2aWNlTmFtZShzZXJ2aWNlUHJpbmNpcGFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZXJ2aWNlUHJpbmNpcGFsXG4gICAgICAucmVwbGFjZSgvW15hLXpBLVowLTldL2csIFwiXCIpXG4gICAgICAucmVwbGFjZSgvXihbYS16XSkvLCAobWF0Y2gpID0+IG1hdGNoLnRvVXBwZXJDYXNlKCkpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { RemovalPolicy } from "aws-cdk-lib";
|
|
2
|
-
/**
|
|
3
|
-
* Feature set for AWS Organisations
|
|
4
|
-
*/
|
|
5
|
-
export declare enum FeatureSet {
|
|
6
|
-
/**
|
|
7
|
-
* Consolidated Billing features only
|
|
8
|
-
*/
|
|
9
|
-
CONSOLIDATED_BILLING = "CONSOLIDATED_BILLING",
|
|
10
|
-
/**
|
|
11
|
-
* All features including SCPs, delegated administrators, etc.
|
|
12
|
-
*/
|
|
13
|
-
ALL = "ALL"
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* AWS Organisations policy types
|
|
17
|
-
*/
|
|
18
|
-
export declare enum PolicyType {
|
|
19
|
-
SERVICE_CONTROL_POLICY = "SERVICE_CONTROL_POLICY",
|
|
20
|
-
TAG_POLICY = "TAG_POLICY",
|
|
21
|
-
BACKUP_POLICY = "BACKUP_POLICY",
|
|
22
|
-
AISERVICES_OPT_OUT_POLICY = "AISERVICES_OPT_OUT_POLICY"
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* IAM user access to billing information
|
|
26
|
-
*/
|
|
27
|
-
export declare enum IamUserAccessToBilling {
|
|
28
|
-
ALLOW = "ALLOW",
|
|
29
|
-
DENY = "DENY"
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Basic organisational unit interface for type references
|
|
33
|
-
*/
|
|
34
|
-
export interface IOrganisationalUnitBasic {
|
|
35
|
-
readonly organisationalUnitId: string;
|
|
36
|
-
readonly organisationalUnitArn: string;
|
|
37
|
-
readonly organisationalUnitName: string;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Properties for creating an Organisation
|
|
41
|
-
*/
|
|
42
|
-
export interface OrganisationProps {
|
|
43
|
-
/**
|
|
44
|
-
* Feature set for the organisation
|
|
45
|
-
* @default FeatureSet.ALL
|
|
46
|
-
*/
|
|
47
|
-
readonly featureSet?: FeatureSet;
|
|
48
|
-
/**
|
|
49
|
-
* Whether to import existing organisation if found
|
|
50
|
-
* @default true
|
|
51
|
-
*/
|
|
52
|
-
readonly importOnDuplicate?: boolean;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Properties for creating an Organisational Unit
|
|
56
|
-
*/
|
|
57
|
-
export interface OrganisationalUnitProps {
|
|
58
|
-
/**
|
|
59
|
-
* Name of the organisational unit
|
|
60
|
-
*/
|
|
61
|
-
readonly organisationalUnitName: string;
|
|
62
|
-
/**
|
|
63
|
-
* Parent organisation or organisational unit
|
|
64
|
-
*/
|
|
65
|
-
readonly parent: IOrganisationalUnitBasic;
|
|
66
|
-
/**
|
|
67
|
-
* Whether to import existing OU if found
|
|
68
|
-
* @default true
|
|
69
|
-
*/
|
|
70
|
-
readonly importOnDuplicate?: boolean;
|
|
71
|
-
/**
|
|
72
|
-
* Removal policy for this resource
|
|
73
|
-
* @default RemovalPolicy.RETAIN
|
|
74
|
-
*/
|
|
75
|
-
readonly removalPolicy?: RemovalPolicy;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Properties for creating an Account
|
|
79
|
-
*/
|
|
80
|
-
export interface AccountProps {
|
|
81
|
-
/**
|
|
82
|
-
* Name of the account
|
|
83
|
-
*/
|
|
84
|
-
readonly accountName: string;
|
|
85
|
-
/**
|
|
86
|
-
* Email address for the account
|
|
87
|
-
*/
|
|
88
|
-
readonly email: string;
|
|
89
|
-
/**
|
|
90
|
-
* Parent organisation or organisational unit
|
|
91
|
-
*/
|
|
92
|
-
readonly parent: IOrganisationalUnitBasic;
|
|
93
|
-
/**
|
|
94
|
-
* Whether to import existing account if found
|
|
95
|
-
* @default true
|
|
96
|
-
*/
|
|
97
|
-
readonly importOnDuplicate?: boolean;
|
|
98
|
-
/**
|
|
99
|
-
* Removal policy for this resource
|
|
100
|
-
* @default RemovalPolicy.RETAIN
|
|
101
|
-
*/
|
|
102
|
-
readonly removalPolicy?: RemovalPolicy;
|
|
103
|
-
/**
|
|
104
|
-
* IAM user access to billing
|
|
105
|
-
* @default IamUserAccessToBilling.ALLOW
|
|
106
|
-
*/
|
|
107
|
-
readonly iamUserAccessToBilling?: IamUserAccessToBilling;
|
|
108
|
-
/**
|
|
109
|
-
* Cross-account role name for management access
|
|
110
|
-
* @default "OrganisationAccountAccessRole"
|
|
111
|
-
*/
|
|
112
|
-
readonly roleName?: string;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Properties for creating a Policy
|
|
116
|
-
*/
|
|
117
|
-
export interface PolicyProps {
|
|
118
|
-
/**
|
|
119
|
-
* Name of the policy
|
|
120
|
-
*/
|
|
121
|
-
readonly policyName: string;
|
|
122
|
-
/**
|
|
123
|
-
* Description of the policy
|
|
124
|
-
*/
|
|
125
|
-
readonly description: string;
|
|
126
|
-
/**
|
|
127
|
-
* Policy content as JSON string
|
|
128
|
-
*/
|
|
129
|
-
readonly content: string;
|
|
130
|
-
/**
|
|
131
|
-
* Type of policy
|
|
132
|
-
*/
|
|
133
|
-
readonly policyType: PolicyType;
|
|
134
|
-
/**
|
|
135
|
-
* Whether to import existing policy if found
|
|
136
|
-
* @default true
|
|
137
|
-
*/
|
|
138
|
-
readonly importOnDuplicate?: boolean;
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Properties for delegated administrator
|
|
142
|
-
*/
|
|
143
|
-
export interface DelegatedAdministratorProps {
|
|
144
|
-
/**
|
|
145
|
-
* AWS service principal (e.g., "stacksets.amazonaws.com")
|
|
146
|
-
*/
|
|
147
|
-
readonly servicePrincipal: string;
|
|
148
|
-
/**
|
|
149
|
-
* Account ID to delegate administrator privileges to
|
|
150
|
-
*/
|
|
151
|
-
readonly accountId: string;
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Properties for trusted service access
|
|
155
|
-
*/
|
|
156
|
-
export interface TrustedServiceAccessProps {
|
|
157
|
-
/**
|
|
158
|
-
* AWS service principal (e.g., "sso.amazonaws.com")
|
|
159
|
-
*/
|
|
160
|
-
readonly servicePrincipal: string;
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Account configuration for multi-environment setups
|
|
164
|
-
*/
|
|
165
|
-
export type AccountsConfig = Record<string, string | string[]>;
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.IamUserAccessToBilling = exports.PolicyType = exports.FeatureSet = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Feature set for AWS Organisations
|
|
6
|
-
*/
|
|
7
|
-
var FeatureSet;
|
|
8
|
-
(function (FeatureSet) {
|
|
9
|
-
/**
|
|
10
|
-
* Consolidated Billing features only
|
|
11
|
-
*/
|
|
12
|
-
FeatureSet["CONSOLIDATED_BILLING"] = "CONSOLIDATED_BILLING";
|
|
13
|
-
/**
|
|
14
|
-
* All features including SCPs, delegated administrators, etc.
|
|
15
|
-
*/
|
|
16
|
-
FeatureSet["ALL"] = "ALL";
|
|
17
|
-
})(FeatureSet || (exports.FeatureSet = FeatureSet = {}));
|
|
18
|
-
/**
|
|
19
|
-
* AWS Organisations policy types
|
|
20
|
-
*/
|
|
21
|
-
var PolicyType;
|
|
22
|
-
(function (PolicyType) {
|
|
23
|
-
PolicyType["SERVICE_CONTROL_POLICY"] = "SERVICE_CONTROL_POLICY";
|
|
24
|
-
PolicyType["TAG_POLICY"] = "TAG_POLICY";
|
|
25
|
-
PolicyType["BACKUP_POLICY"] = "BACKUP_POLICY";
|
|
26
|
-
PolicyType["AISERVICES_OPT_OUT_POLICY"] = "AISERVICES_OPT_OUT_POLICY";
|
|
27
|
-
})(PolicyType || (exports.PolicyType = PolicyType = {}));
|
|
28
|
-
/**
|
|
29
|
-
* IAM user access to billing information
|
|
30
|
-
*/
|
|
31
|
-
var IamUserAccessToBilling;
|
|
32
|
-
(function (IamUserAccessToBilling) {
|
|
33
|
-
IamUserAccessToBilling["ALLOW"] = "ALLOW";
|
|
34
|
-
IamUserAccessToBilling["DENY"] = "DENY";
|
|
35
|
-
})(IamUserAccessToBilling || (exports.IamUserAccessToBilling = IamUserAccessToBilling = {}));
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9vcmdhbmlzYXRpb25zL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBOztHQUVHO0FBQ0gsSUFBWSxVQVVYO0FBVkQsV0FBWSxVQUFVO0lBQ3BCOztPQUVHO0lBQ0gsMkRBQTZDLENBQUE7SUFFN0M7O09BRUc7SUFDSCx5QkFBVyxDQUFBO0FBQ2IsQ0FBQyxFQVZXLFVBQVUsMEJBQVYsVUFBVSxRQVVyQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxVQUtYO0FBTEQsV0FBWSxVQUFVO0lBQ3BCLCtEQUFpRCxDQUFBO0lBQ2pELHVDQUF5QixDQUFBO0lBQ3pCLDZDQUErQixDQUFBO0lBQy9CLHFFQUF1RCxDQUFBO0FBQ3pELENBQUMsRUFMVyxVQUFVLDBCQUFWLFVBQVUsUUFLckI7QUFFRDs7R0FFRztBQUNILElBQVksc0JBR1g7QUFIRCxXQUFZLHNCQUFzQjtJQUNoQyx5Q0FBZSxDQUFBO0lBQ2YsdUNBQWEsQ0FBQTtBQUNmLENBQUMsRUFIVyxzQkFBc0Isc0NBQXRCLHNCQUFzQixRQUdqQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlbW92YWxQb2xpY3ksIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBGZWF0dXJlIHNldCBmb3IgQVdTIE9yZ2FuaXNhdGlvbnNcbiAqL1xuZXhwb3J0IGVudW0gRmVhdHVyZVNldCB7XG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZWQgQmlsbGluZyBmZWF0dXJlcyBvbmx5XG4gICAqL1xuICBDT05TT0xJREFURURfQklMTElORyA9IFwiQ09OU09MSURBVEVEX0JJTExJTkdcIixcblxuICAvKipcbiAgICogQWxsIGZlYXR1cmVzIGluY2x1ZGluZyBTQ1BzLCBkZWxlZ2F0ZWQgYWRtaW5pc3RyYXRvcnMsIGV0Yy5cbiAgICovXG4gIEFMTCA9IFwiQUxMXCJcbn1cblxuLyoqXG4gKiBBV1MgT3JnYW5pc2F0aW9ucyBwb2xpY3kgdHlwZXNcbiAqL1xuZXhwb3J0IGVudW0gUG9saWN5VHlwZSB7XG4gIFNFUlZJQ0VfQ09OVFJPTF9QT0xJQ1kgPSBcIlNFUlZJQ0VfQ09OVFJPTF9QT0xJQ1lcIixcbiAgVEFHX1BPTElDWSA9IFwiVEFHX1BPTElDWVwiLFxuICBCQUNLVVBfUE9MSUNZID0gXCJCQUNLVVBfUE9MSUNZXCIsXG4gIEFJU0VSVklDRVNfT1BUX09VVF9QT0xJQ1kgPSBcIkFJU0VSVklDRVNfT1BUX09VVF9QT0xJQ1lcIlxufVxuXG4vKipcbiAqIElBTSB1c2VyIGFjY2VzcyB0byBiaWxsaW5nIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIElhbVVzZXJBY2Nlc3NUb0JpbGxpbmcge1xuICBBTExPVyA9IFwiQUxMT1dcIixcbiAgREVOWSA9IFwiREVOWVwiXG59XG5cbi8qKlxuICogQmFzaWMgb3JnYW5pc2F0aW9uYWwgdW5pdCBpbnRlcmZhY2UgZm9yIHR5cGUgcmVmZXJlbmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElPcmdhbmlzYXRpb25hbFVuaXRCYXNpYyB7XG4gIHJlYWRvbmx5IG9yZ2FuaXNhdGlvbmFsVW5pdElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9yZ2FuaXNhdGlvbmFsVW5pdEFybjogc3RyaW5nO1xuICByZWFkb25seSBvcmdhbmlzYXRpb25hbFVuaXROYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYW4gT3JnYW5pc2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pc2F0aW9uUHJvcHMge1xuICAvKipcbiAgICogRmVhdHVyZSBzZXQgZm9yIHRoZSBvcmdhbmlzYXRpb25cbiAgICogQGRlZmF1bHQgRmVhdHVyZVNldC5BTExcbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVTZXQ/OiBGZWF0dXJlU2V0O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGltcG9ydCBleGlzdGluZyBvcmdhbmlzYXRpb24gaWYgZm91bmRcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0T25EdXBsaWNhdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGFuIE9yZ2FuaXNhdGlvbmFsIFVuaXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdhbmlzYXRpb25hbFVuaXRQcm9wcyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBvcmdhbmlzYXRpb25hbCB1bml0XG4gICAqL1xuICByZWFkb25seSBvcmdhbmlzYXRpb25hbFVuaXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhcmVudCBvcmdhbmlzYXRpb24gb3Igb3JnYW5pc2F0aW9uYWwgdW5pdFxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50OiBJT3JnYW5pc2F0aW9uYWxVbml0QmFzaWM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW1wb3J0IGV4aXN0aW5nIE9VIGlmIGZvdW5kXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydE9uRHVwbGljYXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVtb3ZhbCBwb2xpY3kgZm9yIHRoaXMgcmVzb3VyY2VcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5SRVRBSU5cbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGFuIEFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50UHJvcHMge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgYWNjb3VudFxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogRW1haWwgYWRkcmVzcyBmb3IgdGhlIGFjY291bnRcbiAgICovXG4gIHJlYWRvbmx5IGVtYWlsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhcmVudCBvcmdhbmlzYXRpb24gb3Igb3JnYW5pc2F0aW9uYWwgdW5pdFxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50OiBJT3JnYW5pc2F0aW9uYWxVbml0QmFzaWM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW1wb3J0IGV4aXN0aW5nIGFjY291bnQgaWYgZm91bmRcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0T25EdXBsaWNhdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgdGhpcyByZXNvdXJjZVxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIElBTSB1c2VyIGFjY2VzcyB0byBiaWxsaW5nXG4gICAqIEBkZWZhdWx0IElhbVVzZXJBY2Nlc3NUb0JpbGxpbmcuQUxMT1dcbiAgICovXG4gIHJlYWRvbmx5IGlhbVVzZXJBY2Nlc3NUb0JpbGxpbmc/OiBJYW1Vc2VyQWNjZXNzVG9CaWxsaW5nO1xuXG4gIC8qKlxuICAgKiBDcm9zcy1hY2NvdW50IHJvbGUgbmFtZSBmb3IgbWFuYWdlbWVudCBhY2Nlc3NcbiAgICogQGRlZmF1bHQgXCJPcmdhbmlzYXRpb25BY2NvdW50QWNjZXNzUm9sZVwiXG4gICAqL1xuICByZWFkb25seSByb2xlTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIFBvbGljeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvbGljeVByb3BzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBvbGljeVxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgcG9saWN5XG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQb2xpY3kgY29udGVudCBhcyBKU09OIHN0cmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUeXBlIG9mIHBvbGljeVxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5VHlwZTogUG9saWN5VHlwZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbXBvcnQgZXhpc3RpbmcgcG9saWN5IGlmIGZvdW5kXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydE9uRHVwbGljYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBkZWxlZ2F0ZWQgYWRtaW5pc3RyYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbGVnYXRlZEFkbWluaXN0cmF0b3JQcm9wcyB7XG4gIC8qKlxuICAgKiBBV1Mgc2VydmljZSBwcmluY2lwYWwgKGUuZy4sIFwic3RhY2tzZXRzLmFtYXpvbmF3cy5jb21cIilcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VQcmluY2lwYWw6IHN0cmluZztcblxuICAvKipcbiAgICogQWNjb3VudCBJRCB0byBkZWxlZ2F0ZSBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMgdG9cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRydXN0ZWQgc2VydmljZSBhY2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcnVzdGVkU2VydmljZUFjY2Vzc1Byb3BzIHtcbiAgLyoqXG4gICAqIEFXUyBzZXJ2aWNlIHByaW5jaXBhbCAoZS5nLiwgXCJzc28uYW1hem9uYXdzLmNvbVwiKVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZVByaW5jaXBhbDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFjY291bnQgY29uZmlndXJhdGlvbiBmb3IgbXVsdGktZW52aXJvbm1lbnQgc2V0dXBzXG4gKi9cbmV4cG9ydCB0eXBlIEFjY291bnRzQ29uZmlnID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuIl19
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { Stack, CfnResource } from "aws-cdk-lib";
|
|
2
|
-
import { IConstruct } from "constructs";
|
|
3
|
-
/**
|
|
4
|
-
* DirectTagging provides a way to apply tags to resources without using aspects.
|
|
5
|
-
* This approach works by directly manipulating CloudFormation resources during
|
|
6
|
-
* stack initialization, avoiding the infinite loop issue in CDK v2.206.0+
|
|
7
|
-
*/
|
|
8
|
-
export declare class DirectTagging {
|
|
9
|
-
private static globalTags;
|
|
10
|
-
private static stackTags;
|
|
11
|
-
/**
|
|
12
|
-
* Set global tags that will be applied to all resources
|
|
13
|
-
*/
|
|
14
|
-
static setGlobalTags(tags: {
|
|
15
|
-
[key: string]: string;
|
|
16
|
-
}): void;
|
|
17
|
-
/**
|
|
18
|
-
* Set tags for a specific stack
|
|
19
|
-
*/
|
|
20
|
-
static setStackTags(stack: Stack, tags: {
|
|
21
|
-
[key: string]: string;
|
|
22
|
-
}): void;
|
|
23
|
-
/**
|
|
24
|
-
* Apply tags to a CloudFormation resource directly
|
|
25
|
-
*/
|
|
26
|
-
static tagCfnResource(resource: CfnResource): void;
|
|
27
|
-
/**
|
|
28
|
-
* Process a construct tree and tag all CloudFormation resources
|
|
29
|
-
*/
|
|
30
|
-
static processConstructTree(root: IConstruct): void;
|
|
31
|
-
}
|