@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,172 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BackupPlan = void 0;
|
|
4
|
-
const constructs_1 = require("constructs");
|
|
5
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
-
const backup = require("aws-cdk-lib/aws-backup");
|
|
7
|
-
const events = require("aws-cdk-lib/aws-events");
|
|
8
|
-
const iam = require("aws-cdk-lib/aws-iam");
|
|
9
|
-
class BackupPlan extends constructs_1.Construct {
|
|
10
|
-
constructor(scope, id, props) {
|
|
11
|
-
super(scope, id);
|
|
12
|
-
const tagKey = props.tagKey || "fjall:disasterRecovery:tier";
|
|
13
|
-
// Create backup plan with tier-specific rules
|
|
14
|
-
this.plan = new backup.BackupPlan(this, `${id}Plan`, {
|
|
15
|
-
backupPlanName: props.planName,
|
|
16
|
-
backupVault: props.vault.vault,
|
|
17
|
-
backupPlanRules: this.createBackupRules(props)
|
|
18
|
-
});
|
|
19
|
-
// Create tag-based selection
|
|
20
|
-
this.selection = new backup.BackupSelection(this, `${id}Selection`, {
|
|
21
|
-
backupPlan: this.plan,
|
|
22
|
-
resources: [
|
|
23
|
-
backup.BackupResource.fromTag(tagKey, props.tier)
|
|
24
|
-
],
|
|
25
|
-
role: this.createBackupRole(props)
|
|
26
|
-
});
|
|
27
|
-
// Export plan ARN
|
|
28
|
-
this.planArn = new aws_cdk_lib_1.CfnOutput(this, `${id}PlanArn`, {
|
|
29
|
-
key: `${id}PlanArn`,
|
|
30
|
-
value: this.plan.backupPlanArn,
|
|
31
|
-
exportName: `BackupPlanArn-${props.planName}`
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
createBackupRules(props) {
|
|
35
|
-
const rules = [];
|
|
36
|
-
switch (props.tier) {
|
|
37
|
-
case "standard":
|
|
38
|
-
// Daily backups, 90-day retention, no cold storage (not cost effective for short retention)
|
|
39
|
-
rules.push(new backup.BackupPlanRule({
|
|
40
|
-
ruleName: `${props.planName}-daily`,
|
|
41
|
-
scheduleExpression: events.Schedule.cron({ hour: '2', minute: '0' }), // 2 AM daily
|
|
42
|
-
deleteAfter: aws_cdk_lib_1.Duration.days(90),
|
|
43
|
-
startWindow: aws_cdk_lib_1.Duration.minutes(60),
|
|
44
|
-
completionWindow: aws_cdk_lib_1.Duration.hours(12)
|
|
45
|
-
}));
|
|
46
|
-
break;
|
|
47
|
-
case "resilient":
|
|
48
|
-
// Daily backups with continuous backup, 1-year retention, cross-region replication
|
|
49
|
-
rules.push(new backup.BackupPlanRule({
|
|
50
|
-
ruleName: `${props.planName}-daily`,
|
|
51
|
-
scheduleExpression: events.Schedule.cron({ hour: '2', minute: '0' }), // 2 AM daily
|
|
52
|
-
deleteAfter: aws_cdk_lib_1.Duration.days(365),
|
|
53
|
-
moveToColdStorageAfter: aws_cdk_lib_1.Duration.days(90), // Minimum allowed
|
|
54
|
-
enableContinuousBackup: true,
|
|
55
|
-
startWindow: aws_cdk_lib_1.Duration.minutes(60),
|
|
56
|
-
completionWindow: aws_cdk_lib_1.Duration.hours(12),
|
|
57
|
-
copyActions: this.createCopyActions(props, aws_cdk_lib_1.Duration.days(365), aws_cdk_lib_1.Duration.days(90))
|
|
58
|
-
}));
|
|
59
|
-
break;
|
|
60
|
-
case "enterprise":
|
|
61
|
-
// Continuous backup (35-day max PITR window)
|
|
62
|
-
rules.push(new backup.BackupPlanRule({
|
|
63
|
-
ruleName: `${props.planName}-continuous`,
|
|
64
|
-
scheduleExpression: events.Schedule.cron({ hour: '2', minute: '0' }), // Daily for continuous backup
|
|
65
|
-
deleteAfter: aws_cdk_lib_1.Duration.days(35), // AWS max for continuous backup
|
|
66
|
-
enableContinuousBackup: true,
|
|
67
|
-
startWindow: aws_cdk_lib_1.Duration.minutes(60),
|
|
68
|
-
completionWindow: aws_cdk_lib_1.Duration.hours(12),
|
|
69
|
-
copyActions: this.createCopyActions(props, aws_cdk_lib_1.Duration.days(35), undefined)
|
|
70
|
-
}));
|
|
71
|
-
// Hourly snapshots for long-term compliance (7 years)
|
|
72
|
-
rules.push(new backup.BackupPlanRule({
|
|
73
|
-
ruleName: `${props.planName}-hourly-compliance`,
|
|
74
|
-
scheduleExpression: events.Schedule.cron({ minute: '0' }), // Every hour
|
|
75
|
-
deleteAfter: aws_cdk_lib_1.Duration.days(2555), // 7 years
|
|
76
|
-
moveToColdStorageAfter: aws_cdk_lib_1.Duration.days(365), // Move to cold after 1 year
|
|
77
|
-
startWindow: aws_cdk_lib_1.Duration.minutes(60),
|
|
78
|
-
completionWindow: aws_cdk_lib_1.Duration.hours(2),
|
|
79
|
-
copyActions: this.createCopyActions(props, aws_cdk_lib_1.Duration.days(2555), aws_cdk_lib_1.Duration.days(365))
|
|
80
|
-
}));
|
|
81
|
-
break;
|
|
82
|
-
}
|
|
83
|
-
return rules;
|
|
84
|
-
}
|
|
85
|
-
createCopyActions(props, deleteAfter, moveToColdStorageAfter) {
|
|
86
|
-
const actions = [];
|
|
87
|
-
// Cross-region replication (for resilient and enterprise)
|
|
88
|
-
if (props.replicationVaultArn) {
|
|
89
|
-
const actionProps = {
|
|
90
|
-
destinationBackupVault: backup.BackupVault.fromBackupVaultArn(this, `${props.planName}ReplicationVaultRef`, props.replicationVaultArn),
|
|
91
|
-
deleteAfter: deleteAfter,
|
|
92
|
-
// Only add cold storage if specified and >= 90 days
|
|
93
|
-
...(moveToColdStorageAfter && moveToColdStorageAfter.toDays() >= 90
|
|
94
|
-
? { moveToColdStorageAfter: moveToColdStorageAfter }
|
|
95
|
-
: {})
|
|
96
|
-
};
|
|
97
|
-
actions.push(actionProps);
|
|
98
|
-
}
|
|
99
|
-
// Cross-account DR vault (enterprise only)
|
|
100
|
-
if (props.drVaultArn && props.drAccountId) {
|
|
101
|
-
const actionProps = {
|
|
102
|
-
destinationBackupVault: backup.BackupVault.fromBackupVaultArn(this, `${props.planName}DrVaultRef`, props.drVaultArn),
|
|
103
|
-
deleteAfter: deleteAfter,
|
|
104
|
-
// Only add cold storage if specified and >= 90 days
|
|
105
|
-
...(moveToColdStorageAfter && moveToColdStorageAfter.toDays() >= 90
|
|
106
|
-
? { moveToColdStorageAfter: moveToColdStorageAfter }
|
|
107
|
-
: {})
|
|
108
|
-
};
|
|
109
|
-
actions.push(actionProps);
|
|
110
|
-
}
|
|
111
|
-
return actions.length > 0 ? actions : undefined;
|
|
112
|
-
}
|
|
113
|
-
createBackupRole(props) {
|
|
114
|
-
const role = new iam.Role(this, `${props.planName}BackupRole`, {
|
|
115
|
-
assumedBy: new iam.ServicePrincipal("backup.amazonaws.com"),
|
|
116
|
-
description: `Backup role for ${props.planName} (${props.tier} tier)`,
|
|
117
|
-
managedPolicies: [
|
|
118
|
-
// Core backup policies
|
|
119
|
-
iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSBackupServiceRolePolicyForBackup"),
|
|
120
|
-
iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSBackupServiceRolePolicyForRestores"),
|
|
121
|
-
// S3 backup support
|
|
122
|
-
iam.ManagedPolicy.fromAwsManagedPolicyName("AWSBackupServiceRolePolicyForS3Backup"),
|
|
123
|
-
iam.ManagedPolicy.fromAwsManagedPolicyName("AWSBackupServiceRolePolicyForS3Restore")
|
|
124
|
-
]
|
|
125
|
-
});
|
|
126
|
-
// Add RDS continuous backup permissions for resilient/enterprise tiers
|
|
127
|
-
if (props.tier === "resilient" || props.tier === "enterprise") {
|
|
128
|
-
role.addToPolicy(new iam.PolicyStatement({
|
|
129
|
-
effect: iam.Effect.ALLOW,
|
|
130
|
-
actions: [
|
|
131
|
-
"rds:ModifyDBInstance",
|
|
132
|
-
"rds:DescribeDBInstanceAutomatedBackups",
|
|
133
|
-
"rds:RestoreDBInstanceToPointInTime",
|
|
134
|
-
"rds:DescribeDBInstances",
|
|
135
|
-
"rds:DescribeDBClusters",
|
|
136
|
-
"rds:RestoreDBClusterToPointInTime"
|
|
137
|
-
],
|
|
138
|
-
resources: ["*"]
|
|
139
|
-
}));
|
|
140
|
-
}
|
|
141
|
-
// Add cross-account permissions if needed
|
|
142
|
-
if (props.drAccountId) {
|
|
143
|
-
role.addToPolicy(new iam.PolicyStatement({
|
|
144
|
-
effect: iam.Effect.ALLOW,
|
|
145
|
-
actions: [
|
|
146
|
-
"backup:CopyIntoBackupVault",
|
|
147
|
-
"backup:CopyFromBackupVault"
|
|
148
|
-
],
|
|
149
|
-
resources: [`arn:aws:backup:*:${props.drAccountId}:backup-vault:*`]
|
|
150
|
-
}));
|
|
151
|
-
}
|
|
152
|
-
// Add cross-region permissions if needed
|
|
153
|
-
if (props.replicationVaultArn) {
|
|
154
|
-
role.addToPolicy(new iam.PolicyStatement({
|
|
155
|
-
effect: iam.Effect.ALLOW,
|
|
156
|
-
actions: [
|
|
157
|
-
"backup:CopyIntoBackupVault",
|
|
158
|
-
"backup:CopyFromBackupVault"
|
|
159
|
-
],
|
|
160
|
-
resources: [props.replicationVaultArn]
|
|
161
|
-
}));
|
|
162
|
-
}
|
|
163
|
-
return role;
|
|
164
|
-
}
|
|
165
|
-
static build(id, props) {
|
|
166
|
-
return (scope) => {
|
|
167
|
-
return new BackupPlan(scope, id, props);
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
exports.BackupPlan = BackupPlan;
|
|
172
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwUGxhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2JhY2t1cC9iYWNrdXBQbGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyw2Q0FBa0Q7QUFDbEQsaURBQWlEO0FBQ2pELGlEQUFpRDtBQUNqRCwyQ0FBMkM7QUFlM0MsTUFBYSxVQUFXLFNBQVEsc0JBQVM7SUFLdkMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksNkJBQTZCLENBQUM7UUFFN0QsOENBQThDO1FBQzlDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFO1lBQ25ELGNBQWMsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUM5QixXQUFXLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLO1lBQzlCLGVBQWUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1NBQy9DLENBQUMsQ0FBQztRQUVILDZCQUE2QjtRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRTtZQUNsRSxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDckIsU0FBUyxFQUFFO2dCQUNULE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ2xEO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsa0JBQWtCO1FBQ2xCLElBQUksQ0FB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NEI7b0JBQzVCLDRCQUE0QjtpQkFDN0I7Z0JBQ0QsU0FBUyxFQUFFLENBQUMsb0JBQW9CLEtBQUssQ0FBQyxXQUFXLGlCQUFpQixDQUFDO2FBQ3BFLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztRQUVELHlDQUF5QztRQUN6QyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO2dCQUN2QyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO2dCQUN4QixPQUFPLEVBQUU7b0JBQ1AsNEJBQTRCO29CQUM1Qiw0QkFBNEI7aUJBQzdCO2dCQUNELFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQzthQUN2QyxDQUFDLENBQUMsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQVUsRUFBRSxLQUFzQjtRQUM3QyxPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFFO1lBQzFCLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUEvTUQsZ0NBK01DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IER1cmF0aW9uLCBDZm5PdXRwdXQgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGJhY2t1cCBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWJhY2t1cFwiO1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEJhY2t1cFZhdWx0IH0gZnJvbSBcIi4vYmFja3VwVmF1bHRcIjtcblxuZXhwb3J0IHR5cGUgQmFja3VwVGllciA9IFwic3RhbmRhcmRcIiB8IFwicmVzaWxpZW50XCIgfCBcImVudGVycHJpc2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCYWNrdXBQbGFuUHJvcHMge1xuICBwbGFuTmFtZTogc3RyaW5nO1xuICB0aWVyOiBCYWNrdXBUaWVyO1xuICB2YXVsdDogQmFja3VwVmF1bHQ7XG4gIHJlcGxpY2F0aW9uVmF1bHRBcm4/OiBzdHJpbmc7ICAvLyBBUk4gb2YgdmF1bHQgaW4gZGlmZmVyZW50IHJlZ2lvblxuICBkclZhdWx0QXJuPzogc3RyaW5nOyAgICAgICAgICAgLy8gQVJOIG9mIHZhdWx0IGluIERSIGFjY291bnRcbiAgZHJBY2NvdW50SWQ/OiBzdHJpbmc7ICAgICAgICAgIC8vIERSIGFjY291bnQgSUQgZm9yIHBlcm1pc3Npb25zXG4gIHRhZ0tleT86IHN0cmluZzsgICAgICAgICAgICAgICAvLyBEZWZhdWx0OiBcImZqYWxsOmRpc2FzdGVyUmVjb3Zlcnk6dGllclwiXG59XG5cbmV4cG9ydCBjbGFzcyBCYWNrdXBQbGFuIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHBsYW46IGJhY2t1cC5CYWNrdXBQbGFuO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0aW9uOiBiYWNrdXAuQmFja3VwU2VsZWN0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgcGxhbkFybjogQ2ZuT3V0cHV0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCYWNrdXBQbGFuUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgdGFnS2V5ID0gcHJvcHMudGFnS2V5IHx8IFwiZmphbGw6ZGlzYXN0ZXJSZWNvdmVyeTp0aWVyXCI7XG5cbiAgICAvLyBDcmVhdGUgYmFja3VwIHBsYW4gd2l0aCB0aWVyLXNwZWNpZmljIHJ1bGVzXG4gICAgdGhpcy5wbGFuID0gbmV3IGJhY2t1cC5CYWNrdXBQbGFuKHRoaXMsIGAke2lkfVBsYW5gLCB7XG4gICAgICBiYWNrdXBQbGFuTmFtZTogcHJvcHMucGxhbk5hbWUsXG4gICAgICBiYWNrdXBWYXVsdDogcHJvcHMudmF1bHQudmF1bHQsXG4gICAgICBiYWNrdXBQbGFuUnVsZXM6IHRoaXMuY3JlYXRlQmFja3VwUnVsZXMocHJvcHMpXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgdGFnLWJhc2VkIHNlbGVjdGlvblxuICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IGJhY2t1cC5CYWNrdXBTZWxlY3Rpb24odGhpcywgYCR7aWR9U2VsZWN0aW9uYCwge1xuICAgICAgYmFja3VwUGxhbjogdGhpcy5wbGFuLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIGJhY2t1cC5CYWNrdXBSZXNvdXJjZS5mcm9tVGFnKHRhZ0tleSwgcHJvcHMudGllcilcbiAgICAgIF0sXG4gICAgICByb2xlOiB0aGlzLmNyZWF0ZUJhY2t1cFJvbGUocHJvcHMpXG4gICAgfSk7XG5cbiAgICAvLyBFeHBvcnQgcGxhbiBBUk5cbiAgICB0aGlzLnBsYW5Bcm4gPSBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfVBsYW5Bcm5gLCB7XG4gICAgICBrZXk6IGAke2lkfVBsYW5Bcm5gLFxuICAgICAgdmFsdWU6IHRoaXMucGxhbi5iYWNrdXBQbGFuQXJuLFxuICAgICAgZXhwb3J0TmFtZTogYEJhY2t1cFBsYW5Bcm4tJHtwcm9wcy5wbGFuTmFtZX1gXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJhY2t1cFJ1bGVzKHByb3BzOiBCYWNrdXBQbGFuUHJvcHMpOiBiYWNrdXAuQmFja3VwUGxhblJ1bGVbXSB7XG4gICAgY29uc3QgcnVsZXM6IGJhY2t1cC5CYWNrdXBQbGFuUnVsZVtdID0gW107XG5cbiAgICBzd2l0Y2ggKHByb3BzLnRpZXIpIHtcbiAgICAgIGNhc2UgXCJzdGFuZGFyZFwiOlxuICAgICAgICAvLyBEYWlseSBiYWNrdXBzLCA5MC1kYXkgcmV0ZW50aW9uLCBubyBjb2xkIHN0b3JhZ2UgKG5vdCBjb3N0IGVmZmVjdGl2ZSBmb3Igc2hvcnQgcmV0ZW50aW9uKVxuICAgICAgICBydWxlcy5wdXNoKFxuICAgICAgICAgIG5ldyBiYWNrdXAuQmFja3VwUGxhblJ1bGUoe1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3Byb3BzLnBsYW5OYW1lfS1kYWlseWAsXG4gICAgICAgICAgICBzY2hlZHVsZUV4cHJlc3Npb246IGV2ZW50cy5TY2hlZHVsZS5jcm9uKHsgaG91cjogJzInLCBtaW51dGU6ICcwJyB9KSwgLy8gMiBBTSBkYWlseVxuICAgICAgICAgICAgZGVsZXRlQWZ0ZXI6IER1cmF0aW9uLmRheXMoOTApLFxuICAgICAgICAgICAgc3RhcnRXaW5kb3c6IER1cmF0aW9uLm1pbnV0ZXMoNjApLFxuICAgICAgICAgICAgY29tcGxldGlvbldpbmRvdzogRHVyYXRpb24uaG91cnMoMTIpXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJyZXNpbGllbnRcIjpcbiAgICAgICAgLy8gRGFpbHkgYmFja3VwcyB3aXRoIGNvbnRpbnVvdXMgYmFja3VwLCAxLXllYXIgcmV0ZW50aW9uLCBjcm9zcy1yZWdpb24gcmVwbGljYXRpb25cbiAgICAgICAgcnVsZXMucHVzaChcbiAgICAgICAgICBuZXcgYmFja3VwLkJhY2t1cFBsYW5SdWxlKHtcbiAgICAgICAgICAgIHJ1bGVOYW1lOiBgJHtwcm9wcy5wbGFuTmFtZX0tZGFpbHlgLFxuICAgICAgICAgICAgc2NoZWR1bGVFeHByZXNzaW9uOiBldmVudHMuU2NoZWR1bGUuY3Jvbih7IGhvdXI6ICcyJywgbWludXRlOiAnMCcgfSksIC8vIDIgQU0gZGFpbHlcbiAgICAgICAgICAgIGRlbGV0ZUFmdGVyOiBEdXJhdGlvbi5kYXlzKDM2NSksXG4gICAgICAgICAgICBtb3ZlVG9Db2xkU3RvcmFnZUFmdGVyOiBEdXJhdGlvbi5kYXlzKDkwKSwgLy8gTWluaW11bSBhbGxvd2VkXG4gICAgICAgICAgICBlbmFibGVDb250aW51b3VzQmFja3VwOiB0cnVlLFxuICAgICAgICAgICAgc3RhcnRXaW5kb3c6IER1cmF0aW9uLm1pbnV0ZXMoNjApLFxuICAgICAgICAgICAgY29tcGxldGlvbldpbmRvdzogRHVyYXRpb24uaG91cnMoMTIpLFxuICAgICAgICAgICAgY29weUFjdGlvbnM6IHRoaXMuY3JlYXRlQ29weUFjdGlvbnMocHJvcHMsIER1cmF0aW9uLmRheXMoMzY1KSwgRHVyYXRpb24uZGF5cyg5MCkpXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJlbnRlcnByaXNlXCI6XG4gICAgICAgIC8vIENvbnRpbnVvdXMgYmFja3VwICgzNS1kYXkgbWF4IFBJVFIgd2luZG93KVxuICAgICAgICBydWxlcy5wdXNoKFxuICAgICAgICAgIG5ldyBiYWNrdXAuQmFja3VwUGxhblJ1bGUoe1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3Byb3BzLnBsYW5OYW1lfS1jb250aW51b3VzYCxcbiAgICAgICAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbjogZXZlbnRzLlNjaGVkdWxlLmNyb24oeyBob3VyOiAnMicsIG1pbnV0ZTogJzAnIH0pLCAvLyBEYWlseSBmb3IgY29udGludW91cyBiYWNrdXBcbiAgICAgICAgICAgIGRlbGV0ZUFmdGVyOiBEdXJhdGlvbi5kYXlzKDM1KSwgLy8gQVdTIG1heCBmb3IgY29udGludW91cyBiYWNrdXBcbiAgICAgICAgICAgIGVuYWJsZUNvbnRpbnVvdXNCYWNrdXA6IHRydWUsXG4gICAgICAgICAgICBzdGFydFdpbmRvdzogRHVyYXRpb24ubWludXRlcyg2MCksXG4gICAgICAgICAgICBjb21wbGV0aW9uV2luZG93OiBEdXJhdGlvbi5ob3VycygxMiksXG4gICAgICAgICAgICBjb3B5QWN0aW9uczogdGhpcy5jcmVhdGVDb3B5QWN0aW9ucyhwcm9wcywgRHVyYXRpb24uZGF5cygzNSksIHVuZGVmaW5lZClcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEhvdXJseSBzbmFwc2hvdHMgZm9yIGxvbmctdGVybSBjb21wbGlhbmNlICg3IHllYXJzKVxuICAgICAgICBydWxlcy5wdXNoKFxuICAgICAgICAgIG5ldyBiYWNrdXAuQmFja3VwUGxhblJ1bGUoe1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3Byb3BzLnBsYW5OYW1lfS1ob3VybHktY29tcGxpYW5jZWAsXG4gICAgICAgICAgICBzY2hlZHVsZUV4cHJlc3Npb246IGV2ZW50cy5TY2hlZHVsZS5jcm9uKHsgbWludXRlOiAnMCcgfSksIC8vIEV2ZXJ5IGhvdXJcbiAgICAgICAgICAgIGRlbGV0ZUFmdGVyOiBEdXJhdGlvbi5kYXlzKDI1NTUpLCAvLyA3IHllYXJzXG4gICAgICAgICAgICBtb3ZlVG9Db2xkU3RvcmFnZUFmdGVyOiBEdXJhdGlvbi5kYXlzKDM2NSksIC8vIE1vdmUgdG8gY29sZCBhZnRlciAxIHllYXJcbiAgICAgICAgICAgIHN0YXJ0V2luZG93OiBEdXJhdGlvbi5taW51dGVzKDYwKSxcbiAgICAgICAgICAgIGNvbXBsZXRpb25XaW5kb3c6IER1cmF0aW9uLmhvdXJzKDIpLFxuICAgICAgICAgICAgY29weUFjdGlvbnM6IHRoaXMuY3JlYXRlQ29weUFjdGlvbnMocHJvcHMsIER1cmF0aW9uLmRheXMoMjU1NSksIER1cmF0aW9uLmRheXMoMzY1KSlcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gcnVsZXM7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvcHlBY3Rpb25zKFxuICAgIHByb3BzOiBCYWNrdXBQbGFuUHJvcHMsXG4gICAgZGVsZXRlQWZ0ZXI6IER1cmF0aW9uLFxuICAgIG1vdmVUb0NvbGRTdG9yYWdlQWZ0ZXI/OiBEdXJhdGlvblxuICApOiBiYWNrdXAuQmFja3VwUGxhbkNvcHlBY3Rpb25Qcm9wc1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhY3Rpb25zOiBiYWNrdXAuQmFja3VwUGxhbkNvcHlBY3Rpb25Qcm9wc1tdID0gW107XG5cbiAgICAvLyBDcm9zcy1yZWdpb24gcmVwbGljYXRpb24gKGZvciByZXNpbGllbnQgYW5kIGVudGVycHJpc2UpXG4gICAgaWYgKHByb3BzLnJlcGxpY2F0aW9uVmF1bHRBcm4pIHtcbiAgICAgIGNvbnN0IGFjdGlvblByb3BzOiBiYWNrdXAuQmFja3VwUGxhbkNvcHlBY3Rpb25Qcm9wcyA9IHtcbiAgICAgICAgZGVzdGluYXRpb25CYWNrdXBWYXVsdDogYmFja3VwLkJhY2t1cFZhdWx0LmZyb21CYWNrdXBWYXVsdEFybihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke3Byb3BzLnBsYW5OYW1lfVJlcGxpY2F0aW9uVmF1bHRSZWZgLFxuICAgICAgICAgIHByb3BzLnJlcGxpY2F0aW9uVmF1bHRBcm5cbiAgICAgICAgKSxcbiAgICAgICAgZGVsZXRlQWZ0ZXI6IGRlbGV0ZUFmdGVyLFxuICAgICAgICAvLyBPbmx5IGFkZCBjb2xkIHN0b3JhZ2UgaWYgc3BlY2lmaWVkIGFuZCA+PSA5MCBkYXlzXG4gICAgICAgIC4uLihtb3ZlVG9Db2xkU3RvcmFnZUFmdGVyICYmIG1vdmVUb0NvbGRTdG9yYWdlQWZ0ZXIudG9EYXlzKCkgPj0gOTBcbiAgICAgICAgICA/IHsgbW92ZVRvQ29sZFN0b3JhZ2VBZnRlcjogbW92ZVRvQ29sZFN0b3JhZ2VBZnRlciB9XG4gICAgICAgICAgOiB7fSlcbiAgICAgIH07XG5cbiAgICAgIGFjdGlvbnMucHVzaChhY3Rpb25Qcm9wcyk7XG4gICAgfVxuXG4gICAgLy8gQ3Jvc3MtYWNjb3VudCBEUiB2YXVsdCAoZW50ZXJwcmlzZSBvbmx5KVxuICAgIGlmIChwcm9wcy5kclZhdWx0QXJuICYmIHByb3BzLmRyQWNjb3VudElkKSB7XG4gICAgICBjb25zdCBhY3Rpb25Qcm9wczogYmFja3VwLkJhY2t1cFBsYW5Db3B5QWN0aW9uUHJvcHMgPSB7XG4gICAgICAgIGRlc3RpbmF0aW9uQmFja3VwVmF1bHQ6IGJhY2t1cC5CYWNrdXBWYXVsdC5mcm9tQmFja3VwVmF1bHRBcm4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBgJHtwcm9wcy5wbGFuTmFtZX1EclZhdWx0UmVmYCxcbiAgICAgICAgICBwcm9wcy5kclZhdWx0QXJuXG4gICAgICAgICksXG4gICAgICAgIGRlbGV0ZUFmdGVyOiBkZWxldGVBZnRlcixcbiAgICAgICAgLy8gT25seSBhZGQgY29sZCBzdG9yYWdlIGlmIHNwZWNpZmllZCBhbmQgPj0gOTAgZGF5c1xuICAgICAgICAuLi4obW92ZVRvQ29sZFN0b3JhZ2VBZnRlciAmJiBtb3ZlVG9Db2xkU3RvcmFnZUFmdGVyLnRvRGF5cygpID49IDkwXG4gICAgICAgICAgPyB7IG1vdmVUb0NvbGRTdG9yYWdlQWZ0ZXI6IG1vdmVUb0NvbGRTdG9yYWdlQWZ0ZXIgfVxuICAgICAgICAgIDoge30pXG4gICAgICB9O1xuXG4gICAgICBhY3Rpb25zLnB1c2goYWN0aW9uUHJvcHMpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25zLmxlbmd0aCA+IDAgPyBhY3Rpb25zIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCYWNrdXBSb2xlKHByb3BzOiBCYWNrdXBQbGFuUHJvcHMpOiBpYW0uUm9sZSB7XG4gICAgY29uc3Qgcm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCBgJHtwcm9wcy5wbGFuTmFtZX1CYWNrdXBSb2xlYCwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJiYWNrdXAuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgQmFja3VwIHJvbGUgZm9yICR7cHJvcHMucGxhbk5hbWV9ICgke3Byb3BzLnRpZXJ9IHRpZXIpYCxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICAvLyBDb3JlIGJhY2t1cCBwb2xpY2llc1xuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXCJzZXJ2aWNlLXJvbGUvQVdTQmFja3VwU2VydmljZVJvbGVQb2xpY3lGb3JCYWNrdXBcIiksXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcInNlcnZpY2Utcm9sZS9BV1NCYWNrdXBTZXJ2aWNlUm9sZVBvbGljeUZvclJlc3RvcmVzXCIpLFxuICAgICAgICAvLyBTMyBiYWNrdXAgc3VwcG9ydFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXCJBV1NCYWNrdXBTZXJ2aWNlUm9sZVBvbGljeUZvclMzQmFja3VwXCIpLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXCJBV1NCYWNrdXBTZXJ2aWNlUm9sZVBvbGljeUZvclMzUmVzdG9yZVwiKVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgLy8gQWRkIFJEUyBjb250aW51b3VzIGJhY2t1cCBwZXJtaXNzaW9ucyBmb3IgcmVzaWxpZW50L2VudGVycHJpc2UgdGllcnNcbiAgICBpZiAocHJvcHMudGllciA9PT0gXCJyZXNpbGllbnRcIiB8fCBwcm9wcy50aWVyID09PSBcImVudGVycHJpc2VcIikge1xuICAgICAgcm9sZS5hZGRUb1BvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIFwicmRzOk1vZGlmeURCSW5zdGFuY2VcIixcbiAgICAgICAgICBcInJkczpEZXNjcmliZURCSW5zdGFuY2VBdXRvbWF0ZWRCYWNrdXBzXCIsXG4gICAgICAgICAgXCJyZHM6UmVzdG9yZURCSW5zdGFuY2VUb1BvaW50SW5UaW1lXCIsXG4gICAgICAgICAgXCJyZHM6RGVzY3JpYmVEQkluc3RhbmNlc1wiLFxuICAgICAgICAgIFwicmRzOkRlc2NyaWJlREJDbHVzdGVyc1wiLFxuICAgICAgICAgIFwicmRzOlJlc3RvcmVEQkNsdXN0ZXJUb1BvaW50SW5UaW1lXCJcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNyb3NzLWFjY291bnQgcGVybWlzc2lvbnMgaWYgbmVlZGVkXG4gICAgaWYgKHByb3BzLmRyQWNjb3VudElkKSB7XG4gICAgICByb2xlLmFkZFRvUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgXCJiYWNrdXA6Q29weUludG9CYWNrdXBWYXVsdFwiLFxuICAgICAgICAgIFwiYmFja3VwOkNvcHlGcm9tQmFja3VwVmF1bHRcIlxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czpiYWNrdXA6Kjoke3Byb3BzLmRyQWNjb3VudElkfTpiYWNrdXAtdmF1bHQ6KmBdXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNyb3NzLXJlZ2lvbiBwZXJtaXNzaW9ucyBpZiBuZWVkZWRcbiAgICBpZiAocHJvcHMucmVwbGljYXRpb25WYXVsdEFybikge1xuICAgICAgcm9sZS5hZGRUb1BvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIFwiYmFja3VwOkNvcHlJbnRvQmFja3VwVmF1bHRcIixcbiAgICAgICAgICBcImJhY2t1cDpDb3B5RnJvbUJhY2t1cFZhdWx0XCJcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMucmVwbGljYXRpb25WYXVsdEFybl1cbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm9sZTtcbiAgfVxuXG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogQmFja3VwUGxhblByb3BzKSB7XG4gICAgcmV0dXJuIChzY29wZTogQ29uc3RydWN0KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEJhY2t1cFBsYW4oc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Construct } from "constructs";
|
|
2
|
-
import { CfnOutput, RemovalPolicy } from "aws-cdk-lib";
|
|
3
|
-
import * as backup from "aws-cdk-lib/aws-backup";
|
|
4
|
-
import * as iam from "aws-cdk-lib/aws-iam";
|
|
5
|
-
import { CustomerManagedKey } from "../secrets/kms";
|
|
6
|
-
export interface BackupVaultProps {
|
|
7
|
-
vaultName: string;
|
|
8
|
-
encryptionKey?: CustomerManagedKey;
|
|
9
|
-
accessPolicy?: iam.PolicyDocument;
|
|
10
|
-
lockConfiguration?: backup.LockConfiguration;
|
|
11
|
-
removalPolicy?: RemovalPolicy;
|
|
12
|
-
}
|
|
13
|
-
export declare class BackupVault extends Construct {
|
|
14
|
-
readonly vault: backup.BackupVault;
|
|
15
|
-
readonly vaultArn: CfnOutput;
|
|
16
|
-
readonly vaultName: CfnOutput;
|
|
17
|
-
constructor(scope: Construct, id: string, props: BackupVaultProps);
|
|
18
|
-
static build(id: string, props: BackupVaultProps): (scope: Construct) => BackupVault;
|
|
19
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BackupVault = void 0;
|
|
4
|
-
const constructs_1 = require("constructs");
|
|
5
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
-
const backup = require("aws-cdk-lib/aws-backup");
|
|
7
|
-
const kms_1 = require("../secrets/kms");
|
|
8
|
-
class BackupVault extends constructs_1.Construct {
|
|
9
|
-
constructor(scope, id, props) {
|
|
10
|
-
super(scope, id);
|
|
11
|
-
// Create or use existing KMS key following existing pattern
|
|
12
|
-
const encryptionKey = props.encryptionKey || new kms_1.CustomerManagedKey(this, `${id}Key`, {
|
|
13
|
-
description: `Encryption key for backup vault ${props.vaultName}`,
|
|
14
|
-
aliasName: `alias/${props.vaultName}-key`
|
|
15
|
-
});
|
|
16
|
-
// Create backup vault with CDK L2 construct
|
|
17
|
-
this.vault = new backup.BackupVault(this, `${id}Vault`, {
|
|
18
|
-
backupVaultName: props.vaultName,
|
|
19
|
-
encryptionKey: encryptionKey.key,
|
|
20
|
-
accessPolicy: props.accessPolicy,
|
|
21
|
-
lockConfiguration: props.lockConfiguration,
|
|
22
|
-
removalPolicy: props.removalPolicy || aws_cdk_lib_1.RemovalPolicy.RETAIN
|
|
23
|
-
});
|
|
24
|
-
// Export vault details following existing CfnOutput pattern
|
|
25
|
-
this.vaultArn = new aws_cdk_lib_1.CfnOutput(this, `${id}VaultArn`, {
|
|
26
|
-
key: `${id}VaultArn`,
|
|
27
|
-
value: this.vault.backupVaultArn,
|
|
28
|
-
exportName: `BackupVaultArn-${props.vaultName}`
|
|
29
|
-
});
|
|
30
|
-
this.vaultName = new aws_cdk_lib_1.CfnOutput(this, `${id}VaultName`, {
|
|
31
|
-
key: `${id}VaultName`,
|
|
32
|
-
value: this.vault.backupVaultName,
|
|
33
|
-
exportName: `BackupVaultName-${props.vaultName}`
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
// Factory method following existing patterns
|
|
37
|
-
static build(id, props) {
|
|
38
|
-
return (scope) => {
|
|
39
|
-
return new BackupVault(scope, id, props);
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
exports.BackupVault = BackupVault;
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwVmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9iYWNrdXAvYmFja3VwVmF1bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBQ3ZDLDZDQUF1RDtBQUN2RCxpREFBaUQ7QUFFakQsd0NBQW9EO0FBVXBELE1BQWEsV0FBWSxTQUFRLHNCQUFTO0lBS3hDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUI7UUFDL0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQiw0REFBNEQ7UUFDNUQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLHdCQUFrQixDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO1lBQ3BGLFdBQVcsRUFBRSxtQ0FBbUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtZQUNqRSxTQUFTLEVBQUUsU0FBUyxLQUFLLENBQUMsU0FBUyxNQUFNO1NBQzFDLENBQUMsQ0FBQztRQUVILDRDQUE0QztRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRTtZQUN0RCxlQUFlLEVBQUUsS0FBSyxDQUFDLFNBQVM7WUFDaEMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxHQUFHO1lBQ2hDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCO1lBQzFDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxJQUFJLDJCQUFhLENBQUMsTUFBTTtTQUMzRCxDQUFDLENBQUM7UUFFSCw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUU7WUFDbkQsR0FBRyxFQUFFLEdBQUcsRUFBRSxVQUFVO1lBQ3BCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWM7WUFDaEMsVUFBVSxFQUFFLGtCQUFrQixLQUFLLENBQUMsU0FBUyxFQUFFO1NBQ2hELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFO1lBQ3JELEdBQUcsRUFBRSxHQUFHLEVBQUUsV0FBVztZQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlO1lBQ2pDLFVBQVUsRUFBRSxtQkFBbUIsS0FBSyxDQUFDLFNBQVMsRUFBRTtTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBVSxFQUFFLEtBQXVCO1FBQzlDLE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQUU7WUFDMUIsT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTNDRCxrQ0EyQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ2ZuT3V0cHV0LCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBiYWNrdXAgZnJvbSBcImF3cy1jZGstbGliL2F3cy1iYWNrdXBcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgQ3VzdG9tZXJNYW5hZ2VkS2V5IH0gZnJvbSBcIi4uL3NlY3JldHMva21zXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFja3VwVmF1bHRQcm9wcyB7XG4gIHZhdWx0TmFtZTogc3RyaW5nO1xuICBlbmNyeXB0aW9uS2V5PzogQ3VzdG9tZXJNYW5hZ2VkS2V5O1xuICBhY2Nlc3NQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG4gIGxvY2tDb25maWd1cmF0aW9uPzogYmFja3VwLkxvY2tDb25maWd1cmF0aW9uO1xuICByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuZXhwb3J0IGNsYXNzIEJhY2t1cFZhdWx0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHZhdWx0OiBiYWNrdXAuQmFja3VwVmF1bHQ7XG4gIHB1YmxpYyByZWFkb25seSB2YXVsdEFybjogQ2ZuT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgdmF1bHROYW1lOiBDZm5PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJhY2t1cFZhdWx0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gQ3JlYXRlIG9yIHVzZSBleGlzdGluZyBLTVMga2V5IGZvbGxvd2luZyBleGlzdGluZyBwYXR0ZXJuXG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHByb3BzLmVuY3J5cHRpb25LZXkgfHwgbmV3IEN1c3RvbWVyTWFuYWdlZEtleSh0aGlzLCBgJHtpZH1LZXlgLCB7XG4gICAgICBkZXNjcmlwdGlvbjogYEVuY3J5cHRpb24ga2V5IGZvciBiYWNrdXAgdmF1bHQgJHtwcm9wcy52YXVsdE5hbWV9YCxcbiAgICAgIGFsaWFzTmFtZTogYGFsaWFzLyR7cHJvcHMudmF1bHROYW1lfS1rZXlgXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgYmFja3VwIHZhdWx0IHdpdGggQ0RLIEwyIGNvbnN0cnVjdFxuICAgIHRoaXMudmF1bHQgPSBuZXcgYmFja3VwLkJhY2t1cFZhdWx0KHRoaXMsIGAke2lkfVZhdWx0YCwge1xuICAgICAgYmFja3VwVmF1bHROYW1lOiBwcm9wcy52YXVsdE5hbWUsXG4gICAgICBlbmNyeXB0aW9uS2V5OiBlbmNyeXB0aW9uS2V5LmtleSxcbiAgICAgIGFjY2Vzc1BvbGljeTogcHJvcHMuYWNjZXNzUG9saWN5LFxuICAgICAgbG9ja0NvbmZpZ3VyYXRpb246IHByb3BzLmxvY2tDb25maWd1cmF0aW9uLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgIH0pO1xuXG4gICAgLy8gRXhwb3J0IHZhdWx0IGRldGFpbHMgZm9sbG93aW5nIGV4aXN0aW5nIENmbk91dHB1dCBwYXR0ZXJuXG4gICAgdGhpcy52YXVsdEFybiA9IG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9VmF1bHRBcm5gLCB7XG4gICAgICBrZXk6IGAke2lkfVZhdWx0QXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLnZhdWx0LmJhY2t1cFZhdWx0QXJuLFxuICAgICAgZXhwb3J0TmFtZTogYEJhY2t1cFZhdWx0QXJuLSR7cHJvcHMudmF1bHROYW1lfWBcbiAgICB9KTtcblxuICAgIHRoaXMudmF1bHROYW1lID0gbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1WYXVsdE5hbWVgLCB7XG4gICAgICBrZXk6IGAke2lkfVZhdWx0TmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy52YXVsdC5iYWNrdXBWYXVsdE5hbWUsXG4gICAgICBleHBvcnROYW1lOiBgQmFja3VwVmF1bHROYW1lLSR7cHJvcHMudmF1bHROYW1lfWBcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEZhY3RvcnkgbWV0aG9kIGZvbGxvd2luZyBleGlzdGluZyBwYXR0ZXJuc1xuICBzdGF0aWMgYnVpbGQoaWQ6IHN0cmluZywgcHJvcHM6IEJhY2t1cFZhdWx0UHJvcHMpIHtcbiAgICByZXR1cm4gKHNjb3BlOiBDb25zdHJ1Y3QpID0+IHtcbiAgICAgIHJldHVybiBuZXcgQmFja3VwVmF1bHQoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./backupVault"), exports);
|
|
18
|
-
__exportStar(require("./backupPlan"), exports);
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9iYWNrdXAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUE4QjtBQUM5QiwrQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9iYWNrdXBWYXVsdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYmFja3VwUGxhblwiO1xuIl19
|
|
@@ -1,37 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,220 +0,0 @@
|
|
|
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=
|
|
@@ -1,14 +0,0 @@
|
|
|
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
|
-
}
|