truemark-cdk-lib 1.25.0 → 1.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/aws-directory-service/index.d.ts +1 -0
  2. package/dist/aws-directory-service/index.js +18 -0
  3. package/dist/aws-directory-service/lib/directory-group.d.ts +63 -0
  4. package/dist/aws-directory-service/lib/directory-group.js +98 -0
  5. package/dist/aws-directory-service/lib/index.d.ts +3 -0
  6. package/dist/aws-directory-service/lib/index.js +20 -0
  7. package/dist/aws-directory-service/lib/managed-ad.d.ts +229 -0
  8. package/dist/aws-directory-service/lib/managed-ad.js +269 -0
  9. package/dist/aws-directory-service/lib/simple-ad.d.ts +74 -0
  10. package/dist/aws-directory-service/lib/simple-ad.js +40 -0
  11. package/dist/aws-patterns-workspaces/index.d.ts +1 -0
  12. package/dist/aws-patterns-workspaces/index.js +18 -0
  13. package/dist/aws-patterns-workspaces/lib/index.d.ts +3 -0
  14. package/dist/aws-patterns-workspaces/lib/index.js +20 -0
  15. package/dist/aws-patterns-workspaces/lib/workspaces-foundation-stack.d.ts +93 -0
  16. package/dist/aws-patterns-workspaces/lib/workspaces-foundation-stack.js +100 -0
  17. package/dist/aws-patterns-workspaces/lib/workspaces-user-stack.d.ts +92 -0
  18. package/dist/aws-patterns-workspaces/lib/workspaces-user-stack.js +54 -0
  19. package/dist/aws-ssm-activation/index.d.ts +1 -0
  20. package/dist/aws-ssm-activation/index.js +18 -0
  21. package/dist/aws-ssm-activation/lib/index.d.ts +1 -0
  22. package/dist/aws-ssm-activation/lib/index.js +18 -0
  23. package/dist/aws-ssm-activation/lib/ssm-hybrid-activation.d.ts +75 -0
  24. package/dist/aws-ssm-activation/lib/ssm-hybrid-activation.js +206 -0
  25. package/dist/aws-ssm-patch/index.d.ts +1 -0
  26. package/dist/aws-ssm-patch/index.js +18 -0
  27. package/dist/aws-ssm-patch/lib/index.d.ts +2 -0
  28. package/dist/aws-ssm-patch/lib/index.js +19 -0
  29. package/dist/aws-ssm-patch/lib/ssm-patch-baseline.d.ts +85 -0
  30. package/dist/aws-ssm-patch/lib/ssm-patch-baseline.js +61 -0
  31. package/dist/aws-ssm-patch/lib/ssm-run-shell-script-association.d.ts +84 -0
  32. package/dist/aws-ssm-patch/lib/ssm-run-shell-script-association.js +52 -0
  33. package/dist/aws-workspaces/index.d.ts +1 -0
  34. package/dist/aws-workspaces/index.js +18 -0
  35. package/dist/aws-workspaces/lib/aws-workspaces-certificate-based-auth-construct.d.ts +37 -0
  36. package/dist/aws-workspaces/lib/aws-workspaces-certificate-based-auth-construct.js +103 -0
  37. package/dist/aws-workspaces/lib/aws-workspaces-construct.d.ts +405 -0
  38. package/dist/aws-workspaces/lib/aws-workspaces-construct.js +512 -0
  39. package/dist/aws-workspaces/lib/aws-workspaces-directory-registration-construct.d.ts +46 -0
  40. package/dist/aws-workspaces/lib/aws-workspaces-directory-registration-construct.js +113 -0
  41. package/dist/aws-workspaces/lib/aws-workspaces-saml-auth-construct.d.ts +50 -0
  42. package/dist/aws-workspaces/lib/aws-workspaces-saml-auth-construct.js +104 -0
  43. package/dist/aws-workspaces/lib/aws-workspaces-user-construct.d.ts +91 -0
  44. package/dist/aws-workspaces/lib/aws-workspaces-user-construct.js +234 -0
  45. package/dist/aws-workspaces/lib/index.d.ts +5 -0
  46. package/dist/aws-workspaces/lib/index.js +22 -0
  47. package/dist/index.d.ts +5 -0
  48. package/dist/index.js +7 -2
  49. package/package.json +20 -2
@@ -0,0 +1 @@
1
+ export * from './lib/index';
@@ -0,0 +1,18 @@
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("./lib/index"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXdzLWRpcmVjdG9yeS1zZXJ2aWNlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4Q0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,63 @@
1
+ import type { Construct } from 'constructs';
2
+ import { ExtendedConstruct, type ExtendedConstructProps } from '../../aws-cdk';
3
+ /**
4
+ * Active Directory group scope.
5
+ */
6
+ export type DirectoryGroupScope = 'DomainLocal' | 'Global' | 'Universal' | 'BuiltinLocal';
7
+ /**
8
+ * Active Directory group type.
9
+ */
10
+ export type DirectoryGroupType = 'Distribution' | 'Security';
11
+ /**
12
+ * Properties for DirectoryGroup.
13
+ */
14
+ export interface DirectoryGroupProps extends ExtendedConstructProps {
15
+ /**
16
+ * ID of the AWS Managed Microsoft AD directory the group is created in.
17
+ * Pattern: `d-[0-9a-f]{10}`.
18
+ */
19
+ readonly directoryId: string;
20
+ /**
21
+ * The group's SAMAccountName. Must be unique within the directory and at most
22
+ * 20 characters.
23
+ */
24
+ readonly groupName: string;
25
+ /**
26
+ * Scope of the group.
27
+ *
28
+ * @default - the directory default ('Global')
29
+ */
30
+ readonly groupScope?: DirectoryGroupScope;
31
+ /**
32
+ * Type of the group.
33
+ *
34
+ * @default - the directory default ('Security')
35
+ */
36
+ readonly groupType?: DirectoryGroupType;
37
+ /**
38
+ * SAMAccountNames of users, groups, or computers to add as members of the group.
39
+ * Members must already exist in the directory; this construct does not create them.
40
+ *
41
+ * @default - no members are added
42
+ */
43
+ readonly members?: string[];
44
+ }
45
+ /**
46
+ * Manages an Active Directory group and its memberships in an AWS Managed
47
+ * Microsoft AD directory using the AWS Directory Service Data API.
48
+ *
49
+ * The Directory Service Data API has no native CloudFormation support, so the
50
+ * group and each membership are managed with custom resources.
51
+ *
52
+ * Note: the custom resource Lambda must have the `DirectoryServiceData` client
53
+ * available in its runtime AWS SDK (Node.js 20+). Directory Service Data write
54
+ * operations are scoped to your organizational unit (OU), Managed Microsoft AD
55
+ * only, and available in the directory's primary Region only.
56
+ */
57
+ export declare class DirectoryGroup extends ExtendedConstruct {
58
+ /**
59
+ * The SAMAccountName of the managed group.
60
+ */
61
+ readonly groupName: string;
62
+ constructor(scope: Construct, id: string, props: DirectoryGroupProps);
63
+ }
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DirectoryGroup = void 0;
4
+ const iam = require("aws-cdk-lib/aws-iam");
5
+ const cr = require("aws-cdk-lib/custom-resources");
6
+ const aws_cdk_1 = require("../../aws-cdk");
7
+ const truemark_1 = require("../../truemark");
8
+ /**
9
+ * Manages an Active Directory group and its memberships in an AWS Managed
10
+ * Microsoft AD directory using the AWS Directory Service Data API.
11
+ *
12
+ * The Directory Service Data API has no native CloudFormation support, so the
13
+ * group and each membership are managed with custom resources.
14
+ *
15
+ * Note: the custom resource Lambda must have the `DirectoryServiceData` client
16
+ * available in its runtime AWS SDK (Node.js 20+). Directory Service Data write
17
+ * operations are scoped to your organizational unit (OU), Managed Microsoft AD
18
+ * only, and available in the directory's primary Region only.
19
+ */
20
+ class DirectoryGroup extends aws_cdk_1.ExtendedConstruct {
21
+ constructor(scope, id, props) {
22
+ var _a;
23
+ super(scope, id, {
24
+ standardTags: aws_cdk_1.StandardTags.merge(props.standardTags, truemark_1.LibStandardTags),
25
+ });
26
+ this.groupName = props.groupName;
27
+ const group = new cr.AwsCustomResource(this, 'Group', {
28
+ onCreate: {
29
+ service: 'DirectoryServiceData',
30
+ action: 'CreateGroup',
31
+ parameters: {
32
+ DirectoryId: props.directoryId,
33
+ SAMAccountName: props.groupName,
34
+ ...(props.groupScope ? { GroupScope: props.groupScope } : {}),
35
+ ...(props.groupType ? { GroupType: props.groupType } : {}),
36
+ },
37
+ physicalResourceId: cr.PhysicalResourceId.of(`${props.directoryId}/${props.groupName}`),
38
+ // ConflictException: the group already exists — treat as a no-op.
39
+ ignoreErrorCodesMatching: 'ConflictException',
40
+ },
41
+ onDelete: {
42
+ service: 'DirectoryServiceData',
43
+ action: 'DeleteGroup',
44
+ parameters: {
45
+ DirectoryId: props.directoryId,
46
+ SAMAccountName: props.groupName,
47
+ },
48
+ // ResourceNotFoundException / AccessDeniedException: group already gone or
49
+ // outside our OU — safe to ignore so stack teardown is not blocked.
50
+ ignoreErrorCodesMatching: 'ResourceNotFoundException|AccessDeniedException',
51
+ },
52
+ policy: cr.AwsCustomResourcePolicy.fromStatements([
53
+ new iam.PolicyStatement({
54
+ effect: iam.Effect.ALLOW,
55
+ actions: ['ds-data:CreateGroup', 'ds-data:DeleteGroup'],
56
+ resources: ['*'],
57
+ }),
58
+ ]),
59
+ });
60
+ for (const member of (_a = props.members) !== null && _a !== void 0 ? _a : []) {
61
+ const membership = new cr.AwsCustomResource(this, `Member${member}`, {
62
+ onCreate: {
63
+ service: 'DirectoryServiceData',
64
+ action: 'AddGroupMember',
65
+ parameters: {
66
+ DirectoryId: props.directoryId,
67
+ GroupName: props.groupName,
68
+ MemberName: member,
69
+ },
70
+ physicalResourceId: cr.PhysicalResourceId.of(`${props.directoryId}/${props.groupName}/${member}`),
71
+ // ConflictException: member already in the group — treat as a no-op.
72
+ ignoreErrorCodesMatching: 'ConflictException',
73
+ },
74
+ onDelete: {
75
+ service: 'DirectoryServiceData',
76
+ action: 'RemoveGroupMember',
77
+ parameters: {
78
+ DirectoryId: props.directoryId,
79
+ GroupName: props.groupName,
80
+ MemberName: member,
81
+ },
82
+ ignoreErrorCodesMatching: 'ResourceNotFoundException|AccessDeniedException',
83
+ },
84
+ policy: cr.AwsCustomResourcePolicy.fromStatements([
85
+ new iam.PolicyStatement({
86
+ effect: iam.Effect.ALLOW,
87
+ actions: ['ds-data:AddGroupMember', 'ds-data:RemoveGroupMember'],
88
+ resources: ['*'],
89
+ }),
90
+ ]),
91
+ });
92
+ // The group must exist before members can be added.
93
+ membership.node.addDependency(group);
94
+ }
95
+ }
96
+ }
97
+ exports.DirectoryGroup = DirectoryGroup;
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0b3J5LWdyb3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy1kaXJlY3Rvcnktc2VydmljZS9saWIvZGlyZWN0b3J5LWdyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUEyQztBQUMzQyxtREFBbUQ7QUFFbkQsMkNBSXVCO0FBQ3ZCLDZDQUErQztBQXVEL0M7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFhLGNBQWUsU0FBUSwyQkFBaUI7SUFNbkQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjs7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsc0JBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSwwQkFBZSxDQUFDO1NBQ3RFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUVqQyxNQUFNLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO1lBQ3BELFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsc0JBQXNCO2dCQUMvQixNQUFNLEVBQUUsYUFBYTtnQkFDckIsVUFBVSxFQUFFO29CQUNWLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztvQkFDOUIsY0FBYyxFQUFFLEtBQUssQ0FBQyxTQUFTO29CQUMvQixHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzNELEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDekQ7Z0JBQ0Qsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FDMUMsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FDMUM7Z0JBQ0Qsa0VBQWtFO2dCQUNsRSx3QkFBd0IsRUFBRSxtQkFBbUI7YUFDOUM7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLHNCQUFzQjtnQkFDL0IsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLFVBQVUsRUFBRTtvQkFDVixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQzlCLGNBQWMsRUFBRSxLQUFLLENBQUMsU0FBUztpQkFDaEM7Z0JBQ0QsMkVBQTJFO2dCQUMzRSxvRUFBb0U7Z0JBQ3BFLHdCQUF3QixFQUN0QixpREFBaUQ7YUFDcEQ7WUFDRCxNQUFNLEVBQUUsRUFBRSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQztnQkFDaEQsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO29CQUN0QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO29CQUN4QixPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxxQkFBcUIsQ0FBQztvQkFDdkQsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO2lCQUNqQixDQUFDO2FBQ0gsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILEtBQUssTUFBTSxNQUFNLElBQUksTUFBQSxLQUFLLENBQUMsT0FBTyxtQ0FBSSxFQUFFLEVBQUUsQ0FBQztZQUN6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxNQUFNLEVBQUUsRUFBRTtnQkFDbkUsUUFBUSxFQUFFO29CQUNSLE9BQU8sRUFBRSxzQkFBc0I7b0JBQy9CLE1BQU0sRUFBRSxnQkFBZ0I7b0JBQ3hCLFVBQVUsRUFBRTt3QkFDVixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7d0JBQzlCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUzt3QkFDMUIsVUFBVSxFQUFFLE1BQU07cUJBQ25CO29CQUNELGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQzFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLE1BQU0sRUFBRSxDQUNwRDtvQkFDRCxxRUFBcUU7b0JBQ3JFLHdCQUF3QixFQUFFLG1CQUFtQjtpQkFDOUM7Z0JBQ0QsUUFBUSxFQUFFO29CQUNSLE9BQU8sRUFBRSxzQkFBc0I7b0JBQy9CLE1BQU0sRUFBRSxtQkFBbUI7b0JBQzNCLFVBQVUsRUFBRTt3QkFDVixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7d0JBQzlCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUzt3QkFDMUIsVUFBVSxFQUFFLE1BQU07cUJBQ25CO29CQUNELHdCQUF3QixFQUN0QixpREFBaUQ7aUJBQ3BEO2dCQUNELE1BQU0sRUFBRSxFQUFFLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDO29CQUNoRCxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7d0JBQ3RCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7d0JBQ3hCLE9BQU8sRUFBRSxDQUFDLHdCQUF3QixFQUFFLDJCQUEyQixDQUFDO3dCQUNoRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7cUJBQ2pCLENBQUM7aUJBQ0gsQ0FBQzthQUNILENBQUMsQ0FBQztZQUNILG9EQUFvRDtZQUNwRCxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBekZELHdDQXlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGNyIGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xuaW1wb3J0IHR5cGUge0NvbnN0cnVjdH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBFeHRlbmRlZENvbnN0cnVjdCxcbiAgdHlwZSBFeHRlbmRlZENvbnN0cnVjdFByb3BzLFxuICBTdGFuZGFyZFRhZ3MsXG59IGZyb20gJy4uLy4uL2F3cy1jZGsnO1xuaW1wb3J0IHtMaWJTdGFuZGFyZFRhZ3N9IGZyb20gJy4uLy4uL3RydWVtYXJrJztcblxuLyoqXG4gKiBBY3RpdmUgRGlyZWN0b3J5IGdyb3VwIHNjb3BlLlxuICovXG5leHBvcnQgdHlwZSBEaXJlY3RvcnlHcm91cFNjb3BlID1cbiAgfCAnRG9tYWluTG9jYWwnXG4gIHwgJ0dsb2JhbCdcbiAgfCAnVW5pdmVyc2FsJ1xuICB8ICdCdWlsdGluTG9jYWwnO1xuXG4vKipcbiAqIEFjdGl2ZSBEaXJlY3RvcnkgZ3JvdXAgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgRGlyZWN0b3J5R3JvdXBUeXBlID0gJ0Rpc3RyaWJ1dGlvbicgfCAnU2VjdXJpdHknO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIERpcmVjdG9yeUdyb3VwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdG9yeUdyb3VwUHJvcHMgZXh0ZW5kcyBFeHRlbmRlZENvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIElEIG9mIHRoZSBBV1MgTWFuYWdlZCBNaWNyb3NvZnQgQUQgZGlyZWN0b3J5IHRoZSBncm91cCBpcyBjcmVhdGVkIGluLlxuICAgKiBQYXR0ZXJuOiBgZC1bMC05YS1mXXsxMH1gLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlyZWN0b3J5SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdyb3VwJ3MgU0FNQWNjb3VudE5hbWUuIE11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZGlyZWN0b3J5IGFuZCBhdCBtb3N0XG4gICAqIDIwIGNoYXJhY3RlcnMuXG4gICAqL1xuICByZWFkb25seSBncm91cE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogU2NvcGUgb2YgdGhlIGdyb3VwLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBkaXJlY3RvcnkgZGVmYXVsdCAoJ0dsb2JhbCcpXG4gICAqL1xuICByZWFkb25seSBncm91cFNjb3BlPzogRGlyZWN0b3J5R3JvdXBTY29wZTtcblxuICAvKipcbiAgICogVHlwZSBvZiB0aGUgZ3JvdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGRpcmVjdG9yeSBkZWZhdWx0ICgnU2VjdXJpdHknKVxuICAgKi9cbiAgcmVhZG9ubHkgZ3JvdXBUeXBlPzogRGlyZWN0b3J5R3JvdXBUeXBlO1xuXG4gIC8qKlxuICAgKiBTQU1BY2NvdW50TmFtZXMgb2YgdXNlcnMsIGdyb3Vwcywgb3IgY29tcHV0ZXJzIHRvIGFkZCBhcyBtZW1iZXJzIG9mIHRoZSBncm91cC5cbiAgICogTWVtYmVycyBtdXN0IGFscmVhZHkgZXhpc3QgaW4gdGhlIGRpcmVjdG9yeTsgdGhpcyBjb25zdHJ1Y3QgZG9lcyBub3QgY3JlYXRlIHRoZW0uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbWVtYmVycyBhcmUgYWRkZWRcbiAgICovXG4gIHJlYWRvbmx5IG1lbWJlcnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIGFuIEFjdGl2ZSBEaXJlY3RvcnkgZ3JvdXAgYW5kIGl0cyBtZW1iZXJzaGlwcyBpbiBhbiBBV1MgTWFuYWdlZFxuICogTWljcm9zb2Z0IEFEIGRpcmVjdG9yeSB1c2luZyB0aGUgQVdTIERpcmVjdG9yeSBTZXJ2aWNlIERhdGEgQVBJLlxuICpcbiAqIFRoZSBEaXJlY3RvcnkgU2VydmljZSBEYXRhIEFQSSBoYXMgbm8gbmF0aXZlIENsb3VkRm9ybWF0aW9uIHN1cHBvcnQsIHNvIHRoZVxuICogZ3JvdXAgYW5kIGVhY2ggbWVtYmVyc2hpcCBhcmUgbWFuYWdlZCB3aXRoIGN1c3RvbSByZXNvdXJjZXMuXG4gKlxuICogTm90ZTogdGhlIGN1c3RvbSByZXNvdXJjZSBMYW1iZGEgbXVzdCBoYXZlIHRoZSBgRGlyZWN0b3J5U2VydmljZURhdGFgIGNsaWVudFxuICogYXZhaWxhYmxlIGluIGl0cyBydW50aW1lIEFXUyBTREsgKE5vZGUuanMgMjArKS4gRGlyZWN0b3J5IFNlcnZpY2UgRGF0YSB3cml0ZVxuICogb3BlcmF0aW9ucyBhcmUgc2NvcGVkIHRvIHlvdXIgb3JnYW5pemF0aW9uYWwgdW5pdCAoT1UpLCBNYW5hZ2VkIE1pY3Jvc29mdCBBRFxuICogb25seSwgYW5kIGF2YWlsYWJsZSBpbiB0aGUgZGlyZWN0b3J5J3MgcHJpbWFyeSBSZWdpb24gb25seS5cbiAqL1xuZXhwb3J0IGNsYXNzIERpcmVjdG9yeUdyb3VwIGV4dGVuZHMgRXh0ZW5kZWRDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIFNBTUFjY291bnROYW1lIG9mIHRoZSBtYW5hZ2VkIGdyb3VwLlxuICAgKi9cbiAgcmVhZG9ubHkgZ3JvdXBOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERpcmVjdG9yeUdyb3VwUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHN0YW5kYXJkVGFnczogU3RhbmRhcmRUYWdzLm1lcmdlKHByb3BzLnN0YW5kYXJkVGFncywgTGliU3RhbmRhcmRUYWdzKSxcbiAgICB9KTtcblxuICAgIHRoaXMuZ3JvdXBOYW1lID0gcHJvcHMuZ3JvdXBOYW1lO1xuXG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgY3IuQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgJ0dyb3VwJywge1xuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogJ0RpcmVjdG9yeVNlcnZpY2VEYXRhJyxcbiAgICAgICAgYWN0aW9uOiAnQ3JlYXRlR3JvdXAnLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgRGlyZWN0b3J5SWQ6IHByb3BzLmRpcmVjdG9yeUlkLFxuICAgICAgICAgIFNBTUFjY291bnROYW1lOiBwcm9wcy5ncm91cE5hbWUsXG4gICAgICAgICAgLi4uKHByb3BzLmdyb3VwU2NvcGUgPyB7R3JvdXBTY29wZTogcHJvcHMuZ3JvdXBTY29wZX0gOiB7fSksXG4gICAgICAgICAgLi4uKHByb3BzLmdyb3VwVHlwZSA/IHtHcm91cFR5cGU6IHByb3BzLmdyb3VwVHlwZX0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgIGAke3Byb3BzLmRpcmVjdG9yeUlkfS8ke3Byb3BzLmdyb3VwTmFtZX1gLFxuICAgICAgICApLFxuICAgICAgICAvLyBDb25mbGljdEV4Y2VwdGlvbjogdGhlIGdyb3VwIGFscmVhZHkgZXhpc3RzIOKAlCB0cmVhdCBhcyBhIG5vLW9wLlxuICAgICAgICBpZ25vcmVFcnJvckNvZGVzTWF0Y2hpbmc6ICdDb25mbGljdEV4Y2VwdGlvbicsXG4gICAgICB9LFxuICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgc2VydmljZTogJ0RpcmVjdG9yeVNlcnZpY2VEYXRhJyxcbiAgICAgICAgYWN0aW9uOiAnRGVsZXRlR3JvdXAnLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgRGlyZWN0b3J5SWQ6IHByb3BzLmRpcmVjdG9yeUlkLFxuICAgICAgICAgIFNBTUFjY291bnROYW1lOiBwcm9wcy5ncm91cE5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gLyBBY2Nlc3NEZW5pZWRFeGNlcHRpb246IGdyb3VwIGFscmVhZHkgZ29uZSBvclxuICAgICAgICAvLyBvdXRzaWRlIG91ciBPVSDigJQgc2FmZSB0byBpZ25vcmUgc28gc3RhY2sgdGVhcmRvd24gaXMgbm90IGJsb2NrZWQuXG4gICAgICAgIGlnbm9yZUVycm9yQ29kZXNNYXRjaGluZzpcbiAgICAgICAgICAnUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbnxBY2Nlc3NEZW5pZWRFeGNlcHRpb24nLFxuICAgICAgfSxcbiAgICAgIHBvbGljeTogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVN0YXRlbWVudHMoW1xuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFsnZHMtZGF0YTpDcmVhdGVHcm91cCcsICdkcy1kYXRhOkRlbGV0ZUdyb3VwJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgfSksXG4gICAgICBdKSxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIHByb3BzLm1lbWJlcnMgPz8gW10pIHtcbiAgICAgIGNvbnN0IG1lbWJlcnNoaXAgPSBuZXcgY3IuQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgYE1lbWJlciR7bWVtYmVyfWAsIHtcbiAgICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgICBzZXJ2aWNlOiAnRGlyZWN0b3J5U2VydmljZURhdGEnLFxuICAgICAgICAgIGFjdGlvbjogJ0FkZEdyb3VwTWVtYmVyJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBEaXJlY3RvcnlJZDogcHJvcHMuZGlyZWN0b3J5SWQsXG4gICAgICAgICAgICBHcm91cE5hbWU6IHByb3BzLmdyb3VwTmFtZSxcbiAgICAgICAgICAgIE1lbWJlck5hbWU6IG1lbWJlcixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgICAgYCR7cHJvcHMuZGlyZWN0b3J5SWR9LyR7cHJvcHMuZ3JvdXBOYW1lfS8ke21lbWJlcn1gLFxuICAgICAgICAgICksXG4gICAgICAgICAgLy8gQ29uZmxpY3RFeGNlcHRpb246IG1lbWJlciBhbHJlYWR5IGluIHRoZSBncm91cCDigJQgdHJlYXQgYXMgYSBuby1vcC5cbiAgICAgICAgICBpZ25vcmVFcnJvckNvZGVzTWF0Y2hpbmc6ICdDb25mbGljdEV4Y2VwdGlvbicsXG4gICAgICAgIH0sXG4gICAgICAgIG9uRGVsZXRlOiB7XG4gICAgICAgICAgc2VydmljZTogJ0RpcmVjdG9yeVNlcnZpY2VEYXRhJyxcbiAgICAgICAgICBhY3Rpb246ICdSZW1vdmVHcm91cE1lbWJlcicsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgRGlyZWN0b3J5SWQ6IHByb3BzLmRpcmVjdG9yeUlkLFxuICAgICAgICAgICAgR3JvdXBOYW1lOiBwcm9wcy5ncm91cE5hbWUsXG4gICAgICAgICAgICBNZW1iZXJOYW1lOiBtZW1iZXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpZ25vcmVFcnJvckNvZGVzTWF0Y2hpbmc6XG4gICAgICAgICAgICAnUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbnxBY2Nlc3NEZW5pZWRFeGNlcHRpb24nLFxuICAgICAgICB9LFxuICAgICAgICBwb2xpY3k6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TdGF0ZW1lbnRzKFtcbiAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICBhY3Rpb25zOiBbJ2RzLWRhdGE6QWRkR3JvdXBNZW1iZXInLCAnZHMtZGF0YTpSZW1vdmVHcm91cE1lbWJlciddLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSksXG4gICAgICB9KTtcbiAgICAgIC8vIFRoZSBncm91cCBtdXN0IGV4aXN0IGJlZm9yZSBtZW1iZXJzIGNhbiBiZSBhZGRlZC5cbiAgICAgIG1lbWJlcnNoaXAubm9kZS5hZGREZXBlbmRlbmN5KGdyb3VwKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './directory-group';
2
+ export * from './managed-ad';
3
+ export * from './simple-ad';
@@ -0,0 +1,20 @@
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("./directory-group"), exports);
18
+ __exportStar(require("./managed-ad"), exports);
19
+ __exportStar(require("./simple-ad"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzLWRpcmVjdG9yeS1zZXJ2aWNlL2xpYi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQWtDO0FBQ2xDLCtDQUE2QjtBQUM3Qiw4Q0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2RpcmVjdG9yeS1ncm91cCc7XG5leHBvcnQgKiBmcm9tICcuL21hbmFnZWQtYWQnO1xuZXhwb3J0ICogZnJvbSAnLi9zaW1wbGUtYWQnO1xuIl19
@@ -0,0 +1,229 @@
1
+ import type { SecretValue } from 'aws-cdk-lib';
2
+ import { RemovalPolicy } from 'aws-cdk-lib';
3
+ import * as directoryservice from 'aws-cdk-lib/aws-directoryservice';
4
+ import type * as ec2 from 'aws-cdk-lib/aws-ec2';
5
+ import * as logs from 'aws-cdk-lib/aws-logs';
6
+ import type { Construct } from 'constructs';
7
+ import { ExtendedConstruct, type ExtendedConstructProps } from '../../aws-cdk';
8
+ /**
9
+ * Edition of an AWS Managed Microsoft AD directory.
10
+ */
11
+ export type ManagedAdEdition = 'Standard' | 'Enterprise';
12
+ /**
13
+ * RADIUS-based MFA configuration for a Managed Microsoft AD directory.
14
+ * Requires a RADIUS server reachable from the directory's VPC.
15
+ */
16
+ export interface ManagedAdRadiusProps {
17
+ /**
18
+ * IP addresses or DNS names of the RADIUS server(s).
19
+ * Provide two entries for redundancy.
20
+ */
21
+ readonly radiusServers: string[];
22
+ /**
23
+ * Shared secret between the directory and the RADIUS server.
24
+ * Use SecretValue.secretsManager() or SecretValue.ssmSecure() — do not use unsafePlainText.
25
+ */
26
+ readonly sharedSecret: SecretValue;
27
+ /**
28
+ * UDP port for RADIUS authentication requests.
29
+ *
30
+ * @default 1812
31
+ */
32
+ readonly radiusPort?: number;
33
+ /**
34
+ * Timeout in seconds for each RADIUS request. Must be between 1 and 20.
35
+ *
36
+ * @default 20
37
+ */
38
+ readonly radiusTimeout?: number;
39
+ /**
40
+ * Number of times a RADIUS request is retried after a timeout. Must be between 0 and 10.
41
+ *
42
+ * @default 0
43
+ */
44
+ readonly radiusRetries?: number;
45
+ /**
46
+ * RADIUS authentication protocol.
47
+ *
48
+ * @default 'MS-CHAPv2'
49
+ */
50
+ readonly authenticationProtocol?: 'PAP' | 'CHAP' | 'MS-CHAPv1' | 'MS-CHAPv2';
51
+ /**
52
+ * Text label shown to users when prompted for their MFA token.
53
+ *
54
+ * @default 'MFA'
55
+ */
56
+ readonly displayLabel?: string;
57
+ /**
58
+ * Whether to pass the same username to the RADIUS server as used for directory authentication.
59
+ * Set to false when the RADIUS server expects a different username format.
60
+ *
61
+ * @default false
62
+ */
63
+ readonly useSameUsername?: boolean;
64
+ }
65
+ /**
66
+ * Single sign-on configuration for a Managed Microsoft AD directory.
67
+ * Enabling SSO allows users to access AWS applications and the directory access
68
+ * URL without re-entering their credentials.
69
+ */
70
+ export interface ManagedAdSsoProps {
71
+ /**
72
+ * Alias for the directory access URL — produces `https://<alias>.awsapps.com`.
73
+ * Aliases are permanent: once created they cannot be changed or removed for the
74
+ * lifetime of the directory.
75
+ *
76
+ * @default - no alias is created and SSO uses the directory ID URL
77
+ */
78
+ readonly alias?: string;
79
+ }
80
+ /**
81
+ * CloudWatch Logs forwarding configuration for a Managed Microsoft AD directory.
82
+ * Forwards the directory's security event logs to a CloudWatch log group.
83
+ */
84
+ export interface ManagedAdLogForwardingProps {
85
+ /**
86
+ * Name of the CloudWatch log group that receives directory security logs.
87
+ *
88
+ * @default - an auto-generated name is used
89
+ */
90
+ readonly logGroupName?: string;
91
+ /**
92
+ * Retention period for the directory log group.
93
+ *
94
+ * @default logs.RetentionDays.ONE_YEAR
95
+ */
96
+ readonly retention?: logs.RetentionDays;
97
+ /**
98
+ * Removal policy for the log group when the directory is removed.
99
+ *
100
+ * @default RemovalPolicy.RETAIN
101
+ */
102
+ readonly removalPolicy?: RemovalPolicy;
103
+ }
104
+ /**
105
+ * Cross-account sharing configuration for a Managed Microsoft AD directory.
106
+ * Shares the directory with other AWS accounts so they can launch directory-aware
107
+ * resources (e.g. WorkSpaces) against it.
108
+ */
109
+ export interface ManagedAdSharingProps {
110
+ /**
111
+ * AWS account IDs the directory is shared with.
112
+ */
113
+ readonly targetAccountIds: string[];
114
+ /**
115
+ * Sharing method. Use ORGANIZATIONS to share within an AWS Organization without
116
+ * a handshake, or HANDSHAKE to send a sharing request the target must accept.
117
+ *
118
+ * @default 'HANDSHAKE'
119
+ */
120
+ readonly shareMethod?: 'ORGANIZATIONS' | 'HANDSHAKE';
121
+ /**
122
+ * A directory share message sent to the target accounts (HANDSHAKE only).
123
+ *
124
+ * @default - no message
125
+ */
126
+ readonly shareNotes?: string;
127
+ }
128
+ /**
129
+ * Properties for ManagedAd.
130
+ */
131
+ export interface ManagedAdProps extends ExtendedConstructProps {
132
+ /**
133
+ * Fully qualified domain name for the directory. Example: 'corp.example.com'.
134
+ */
135
+ readonly domainName: string;
136
+ /**
137
+ * Admin password for the directory. Should come from Secrets Manager.
138
+ * Use SecretValue.secretsManager() — do not use unsafePlainText in production.
139
+ */
140
+ readonly password: SecretValue;
141
+ /**
142
+ * VPC the directory controllers are deployed into.
143
+ */
144
+ readonly vpc: ec2.IVpc;
145
+ /**
146
+ * Subnets the directory controllers are placed in. At least two subnets in
147
+ * different Availability Zones are required; only the first two are used.
148
+ */
149
+ readonly subnets: ec2.ISubnet[];
150
+ /**
151
+ * Short NetBIOS name for the directory. Example: 'CORP'.
152
+ *
153
+ * @default - derived by AWS from the domain name
154
+ */
155
+ readonly shortName?: string;
156
+ /**
157
+ * Edition of the Managed Microsoft AD.
158
+ *
159
+ * @default 'Standard'
160
+ */
161
+ readonly edition?: ManagedAdEdition;
162
+ /**
163
+ * RADIUS-based multi-factor authentication configuration.
164
+ *
165
+ * @default - RADIUS MFA is not enabled
166
+ */
167
+ readonly radius?: ManagedAdRadiusProps;
168
+ /**
169
+ * Single sign-on configuration.
170
+ *
171
+ * @default - SSO is not enabled
172
+ */
173
+ readonly sso?: ManagedAdSsoProps;
174
+ /**
175
+ * CloudWatch Logs forwarding configuration.
176
+ *
177
+ * @default - directory logs are not forwarded
178
+ */
179
+ readonly logForwarding?: ManagedAdLogForwardingProps;
180
+ /**
181
+ * Cross-account sharing configuration.
182
+ *
183
+ * @default - the directory is not shared
184
+ */
185
+ readonly sharing?: ManagedAdSharingProps;
186
+ }
187
+ /**
188
+ * Creates an AWS Managed Microsoft AD directory.
189
+ *
190
+ * Wraps the L1 {@link directoryservice.CfnMicrosoftAD} with TrueMark standard
191
+ * tagging and validation, and layers on optional RADIUS MFA, single sign-on,
192
+ * CloudWatch log forwarding, and cross-account sharing — each implemented with
193
+ * custom resources because they have no native CloudFormation support.
194
+ *
195
+ * The resulting {@link directoryId} can be consumed by directory-aware constructs
196
+ * such as Amazon WorkSpaces.
197
+ */
198
+ export declare class ManagedAd extends ExtendedConstruct {
199
+ /**
200
+ * The underlying CloudFormation Managed Microsoft AD resource.
201
+ */
202
+ readonly microsoftAd: directoryservice.CfnMicrosoftAD;
203
+ /**
204
+ * The directory ID, e.g. 'd-xxxxxxxxxx'.
205
+ */
206
+ readonly directoryId: string;
207
+ /**
208
+ * The CloudWatch log group receiving directory security logs.
209
+ * Only set when logForwarding is configured.
210
+ */
211
+ readonly logGroup?: logs.ILogGroup;
212
+ constructor(scope: Construct, id: string, props: ManagedAdProps);
213
+ /**
214
+ * Enables RADIUS MFA on the directory via the Directory Service API.
215
+ */
216
+ private enableRadius;
217
+ /**
218
+ * Enables single sign-on and, if requested, creates the directory access URL alias.
219
+ */
220
+ private enableSso;
221
+ /**
222
+ * Creates a CloudWatch log group and subscribes the directory's security logs to it.
223
+ */
224
+ private enableLogForwarding;
225
+ /**
226
+ * Shares the directory with the configured target accounts.
227
+ */
228
+ private enableSharing;
229
+ }