@fjall/components-infrastructure 2.30.0 → 2.30.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/lib/__tests__/setup.d.ts +48 -0
  2. package/dist/lib/__tests__/setup.js +1 -0
  3. package/dist/lib/config/aws/accountId.d.ts +6 -0
  4. package/dist/lib/config/aws/accountId.js +33 -0
  5. package/dist/lib/config/aws/backupGlobalSettings.d.ts +29 -0
  6. package/dist/lib/config/aws/backupGlobalSettings.js +51 -0
  7. package/dist/lib/config/aws/costAllocationTags.d.ts +12 -0
  8. package/dist/lib/config/aws/costAllocationTags.js +48 -0
  9. package/dist/lib/config/aws/eventBus.d.ts +7 -0
  10. package/dist/lib/config/aws/eventBus.js +24 -0
  11. package/dist/lib/config/aws/identityCenterGroupMembership.d.ts +10 -0
  12. package/dist/lib/config/aws/identityCenterGroupMembership.js +115 -0
  13. package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +8 -0
  14. package/dist/lib/config/aws/ipamDelegateAdmin.js +58 -0
  15. package/dist/lib/config/aws/ipamPoolId.d.ts +10 -0
  16. package/dist/lib/config/aws/ipamPoolId.js +39 -0
  17. package/dist/lib/config/aws/organisation.d.ts +30 -0
  18. package/dist/lib/config/aws/organisation.js +95 -0
  19. package/dist/lib/config/aws/organisationId.d.ts +7 -0
  20. package/dist/lib/config/aws/organisationId.js +46 -0
  21. package/dist/lib/config/aws/organisationsAccess.d.ts +10 -0
  22. package/dist/lib/config/aws/organisationsAccess.js +50 -0
  23. package/dist/lib/config/aws/ramSharing.d.ts +4 -0
  24. package/dist/lib/config/aws/ramSharing.js +35 -0
  25. package/dist/lib/config/monitoring.d.ts +18 -0
  26. package/dist/lib/config/monitoring.js +22 -0
  27. package/dist/lib/patterns/aws/cicdRole.d.ts +67 -0
  28. package/dist/lib/patterns/aws/cicdRole.js +68 -0
  29. package/dist/lib/patterns/aws/compute.js +9 -0
  30. package/dist/lib/patterns/aws/computeLambda.d.ts +38 -3
  31. package/dist/lib/patterns/aws/computeLambda.js +29 -2
  32. package/dist/lib/patterns/aws/hostedZone.d.ts +28 -0
  33. package/dist/lib/patterns/aws/hostedZone.js +150 -0
  34. package/dist/lib/patterns/aws/managedAccount.d.ts +9 -0
  35. package/dist/lib/patterns/aws/managedAccount.js +55 -0
  36. package/dist/lib/patterns/aws/managedIdentityCenter.d.ts +4 -0
  37. package/dist/lib/patterns/aws/managedIdentityCenter.js +24 -0
  38. package/dist/lib/patterns/aws/managedOrganisation.d.ts +36 -0
  39. package/dist/lib/patterns/aws/managedOrganisation.js +97 -0
  40. package/dist/lib/patterns/aws/managedPlatform.d.ts +12 -0
  41. package/dist/lib/patterns/aws/managedPlatform.js +29 -0
  42. package/dist/lib/patterns/aws/subdomainHostedZone.d.ts +9 -0
  43. package/dist/lib/patterns/aws/subdomainHostedZone.js +39 -0
  44. package/dist/lib/resources/aws/cicd/cicdRole.d.ts +65 -0
  45. package/dist/lib/resources/aws/cicd/cicdRole.js +191 -0
  46. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +75 -0
  47. package/dist/lib/resources/aws/compute/ecsFreeTier.js +1 -0
  48. package/dist/lib/resources/aws/compute/ecsImages.js +3 -25
  49. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +75 -0
  50. package/dist/lib/resources/aws/compute/ecsSpot.js +1 -0
  51. package/dist/lib/resources/aws/compute/imageTagParameter.d.ts +12 -0
  52. package/dist/lib/resources/aws/compute/imageTagParameter.js +32 -0
  53. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +20 -0
  54. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +1 -0
  55. package/dist/lib/resources/aws/database/database.d.ts +14 -0
  56. package/dist/lib/resources/aws/database/database.js +28 -0
  57. package/dist/lib/resources/aws/database/databaseInstance.d.ts +15 -0
  58. package/dist/lib/resources/aws/database/databaseInstance.js +30 -0
  59. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +13 -0
  60. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +52 -0
  61. package/dist/lib/resources/aws/iam/securityGroup.d.ts +5 -0
  62. package/dist/lib/resources/aws/iam/securityGroup.js +14 -0
  63. package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +28 -0
  64. package/dist/lib/resources/aws/monitoring/monitoringRole.js +125 -0
  65. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +5 -0
  66. package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -0
  67. package/dist/lib/utils/addSuffixToEmail.js +5 -1
  68. package/dist/lib/utils/capitalizeString.d.ts +1 -0
  69. package/dist/lib/utils/capitalizeString.js +7 -0
  70. package/package.json +4 -4
  71. package/dist/lib/config/aws/identityCenterMembership.d.ts +0 -11
  72. package/dist/lib/config/aws/identityCenterMembership.js +0 -61
@@ -0,0 +1,14 @@
1
+ import { type Connections, type IConnectable, type Vpc } from "aws-cdk-lib/aws-ec2";
2
+ import { Construct } from "constructs";
3
+ import { type StackBuilder } from "../base/awsStack";
4
+ interface DatabaseProps {
5
+ vpc: Vpc;
6
+ }
7
+ export default class Database extends Construct implements IConnectable {
8
+ private readonly resource;
9
+ connections: Connections;
10
+ databaseSecretName: string;
11
+ constructor(scope: Construct, id: string, props: DatabaseProps);
12
+ static build(id: string, props?: Partial<DatabaseProps>): (sb: StackBuilder) => Construct;
13
+ }
14
+ export {};
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constructs_1 = require("constructs");
4
+ const _1 = require("./");
5
+ class Database extends constructs_1.Construct {
6
+ constructor(scope, id, props) {
7
+ super(scope, id);
8
+ this.resource = new _1.RdsAurora(scope, `${id}Rds`, {
9
+ vpc: props.vpc,
10
+ databaseName: id.replace("Database", "")
11
+ });
12
+ this.connections = this.resource.connections;
13
+ }
14
+ //todo: move to generic 'resource' class
15
+ static build(id, props) {
16
+ return (sb) => {
17
+ const newProps = {
18
+ ...props,
19
+ ...{
20
+ vpc: sb.getNetwork() || props?.vpc
21
+ }
22
+ };
23
+ return new this(sb.getStack(), id, newProps);
24
+ };
25
+ }
26
+ }
27
+ exports.default = Database;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9kYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUtBLDJDQUF1QztBQUd2Qyx5QkFBK0I7QUFNL0IsTUFBcUIsUUFBUyxTQUFRLHNCQUFTO0lBSzdDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0I7UUFDNUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksWUFBUyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO1lBQy9DLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLFlBQVksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7U0FDekMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUMvQyxDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQ1YsRUFBVSxFQUNWLEtBQThCO1FBRTlCLE9BQU8sQ0FBQyxFQUFnQixFQUFFLEVBQUU7WUFDMUIsTUFBTSxRQUFRLEdBQWtCO2dCQUM5QixHQUFHLEtBQUs7Z0JBQ1IsR0FBRztvQkFDRCxHQUFHLEVBQUcsRUFBRSxDQUFDLFVBQVUsRUFBVSxJQUFJLEtBQUssRUFBRSxHQUFHO2lCQUM1QzthQUNGLENBQUM7WUFFRixPQUFPLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBaENELDJCQWdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIFZwY1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuaW1wb3J0IHsgdHlwZSBTdGFja0J1aWxkZXIgfSBmcm9tIFwiLi4vYmFzZS9hd3NTdGFja1wiO1xuaW1wb3J0IHsgUmRzQXVyb3JhIH0gZnJvbSBcIi4vXCI7XG5cbmludGVyZmFjZSBEYXRhYmFzZVByb3BzIHtcbiAgdnBjOiBWcGM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGFiYXNlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZTogUmRzQXVyb3JhO1xuICBwdWJsaWMgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuICBwdWJsaWMgZGF0YWJhc2VTZWNyZXROYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERhdGFiYXNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBSZHNBdXJvcmEoc2NvcGUsIGAke2lkfVJkc2AsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgZGF0YWJhc2VOYW1lOiBpZC5yZXBsYWNlKFwiRGF0YWJhc2VcIiwgXCJcIilcbiAgICB9KTtcblxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLnJlc291cmNlLmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgLy90b2RvOiBtb3ZlIHRvIGdlbmVyaWMgJ3Jlc291cmNlJyBjbGFzc1xuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wcz86IFBhcnRpYWw8RGF0YWJhc2VQcm9wcz5cbiAgKTogKHNiOiBTdGFja0J1aWxkZXIpID0+IENvbnN0cnVjdCB7XG4gICAgcmV0dXJuIChzYjogU3RhY2tCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBuZXdQcm9wczogRGF0YWJhc2VQcm9wcyA9IHtcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIC4uLntcbiAgICAgICAgICB2cGM6IChzYi5nZXROZXR3b3JrKCkgYXMgVnBjKSB8fCBwcm9wcz8udnBjXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBuZXcgdGhpcyhzYi5nZXRTdGFjaygpLCBpZCwgbmV3UHJvcHMpO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,15 @@
1
+ import { type Connections, type IConnectable, type SecurityGroup, type Vpc } from "aws-cdk-lib/aws-ec2";
2
+ import { Construct } from "constructs";
3
+ import { type StackBuilder } from "../base/awsStack";
4
+ interface DatabaseProps {
5
+ vpc: Vpc;
6
+ }
7
+ export default class Database extends Construct implements IConnectable {
8
+ private readonly resource;
9
+ connections: Connections;
10
+ databaseSecurityGroup: SecurityGroup;
11
+ databaseSecretName: string;
12
+ constructor(scope: Construct, id: string, props: DatabaseProps);
13
+ static build(id: string, props?: Partial<DatabaseProps>): (sb: StackBuilder) => Construct;
14
+ }
15
+ export {};
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constructs_1 = require("constructs");
4
+ const _1 = require("./");
5
+ class Database extends constructs_1.Construct {
6
+ constructor(scope, id, props) {
7
+ super(scope, id);
8
+ this.resource = new _1.RdsInstance(scope, `${id}Rds`, {
9
+ vpc: props.vpc,
10
+ databaseName: id.replace("Database", ""),
11
+ readReplica: {}
12
+ });
13
+ this.connections = this.resource.connections;
14
+ this.databaseSecurityGroup = this.resource.databaseSecurityGroup;
15
+ }
16
+ //todo: move to generic 'resource' class
17
+ static build(id, props) {
18
+ return (sb) => {
19
+ const newProps = {
20
+ ...props,
21
+ ...{
22
+ vpc: sb.getNetwork() || props?.vpc
23
+ }
24
+ };
25
+ return new this(sb.getStack(), id, newProps);
26
+ };
27
+ }
28
+ }
29
+ exports.default = Database;
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2VJbnN0YW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2RhdGFiYXNlL2RhdGFiYXNlSW5zdGFuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSwyQ0FBdUM7QUFHdkMseUJBQWlDO0FBTWpDLE1BQXFCLFFBQVMsU0FBUSxzQkFBUztJQU03QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW9CO1FBQzVELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGNBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNqRCxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7WUFDZCxZQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLFdBQVcsRUFBRSxFQUFFO1NBQ2hCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDN0MsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7SUFDbkUsQ0FBQztJQUVELHdDQUF3QztJQUN4QyxNQUFNLENBQUMsS0FBSyxDQUNWLEVBQVUsRUFDVixLQUE4QjtRQUU5QixPQUFPLENBQUMsRUFBZ0IsRUFBRSxFQUFFO1lBQzFCLE1BQU0sUUFBUSxHQUFrQjtnQkFDOUIsR0FBRyxLQUFLO2dCQUNSLEdBQUc7b0JBQ0QsR0FBRyxFQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQVUsSUFBSSxLQUFLLEVBQUUsR0FBRztpQkFDNUM7YUFDRixDQUFDO1lBRUYsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQW5DRCwyQkFtQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIENvbm5lY3Rpb25zLFxuICB0eXBlIElDb25uZWN0YWJsZSxcbiAgdHlwZSBTZWN1cml0eUdyb3VwLFxuICB0eXBlIFZwY1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuaW1wb3J0IHsgdHlwZSBTdGFja0J1aWxkZXIgfSBmcm9tIFwiLi4vYmFzZS9hd3NTdGFja1wiO1xuaW1wb3J0IHsgUmRzSW5zdGFuY2UgfSBmcm9tIFwiLi9cIjtcblxuaW50ZXJmYWNlIERhdGFiYXNlUHJvcHMge1xuICB2cGM6IFZwYztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0YWJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBSZHNJbnN0YW5jZTtcbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcbiAgcHVibGljIGRhdGFiYXNlU2VjdXJpdHlHcm91cDogU2VjdXJpdHlHcm91cDtcbiAgcHVibGljIGRhdGFiYXNlU2VjcmV0TmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhYmFzZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgUmRzSW5zdGFuY2Uoc2NvcGUsIGAke2lkfVJkc2AsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgZGF0YWJhc2VOYW1lOiBpZC5yZXBsYWNlKFwiRGF0YWJhc2VcIiwgXCJcIiksXG4gICAgICByZWFkUmVwbGljYToge31cbiAgICB9KTtcblxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLnJlc291cmNlLmNvbm5lY3Rpb25zO1xuICAgIHRoaXMuZGF0YWJhc2VTZWN1cml0eUdyb3VwID0gdGhpcy5yZXNvdXJjZS5kYXRhYmFzZVNlY3VyaXR5R3JvdXA7XG4gIH1cblxuICAvL3RvZG86IG1vdmUgdG8gZ2VuZXJpYyAncmVzb3VyY2UnIGNsYXNzXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzPzogUGFydGlhbDxEYXRhYmFzZVByb3BzPlxuICApOiAoc2I6IFN0YWNrQnVpbGRlcikgPT4gQ29uc3RydWN0IHtcbiAgICByZXR1cm4gKHNiOiBTdGFja0J1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IG5ld1Byb3BzOiBEYXRhYmFzZVByb3BzID0ge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgLi4ue1xuICAgICAgICAgIHZwYzogKHNiLmdldE5ldHdvcmsoKSBhcyBWcGMpIHx8IHByb3BzPy52cGNcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIG5ldyB0aGlzKHNiLmdldFN0YWNrKCksIGlkLCBuZXdQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,13 @@
1
+ import { Construct } from "constructs";
2
+ import { type Role } from "..";
3
+ interface AttachManagedPolicyProps {
4
+ instanceArn: string;
5
+ permissionSet: string;
6
+ permissionSetArn: string;
7
+ managedPolicyArn: string;
8
+ role: Role;
9
+ }
10
+ export declare class AttachManagedPolicy extends Construct {
11
+ constructor(scope: Construct, id: string, props: AttachManagedPolicyProps);
12
+ }
13
+ export {};
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AttachManagedPolicy = void 0;
4
+ const constructs_1 = require("constructs");
5
+ const customResources = require("aws-cdk-lib/custom-resources");
6
+ const awsCustomResource_1 = require("../../utilities/awsCustomResource");
7
+ class AttachManagedPolicy extends constructs_1.Construct {
8
+ constructor(scope, id, props) {
9
+ super(scope, id);
10
+ new awsCustomResource_1.AwsCustomResource(this, "attachManagedPolicy", {
11
+ functionName: `attachPolicyToPermissionSet${props.permissionSet}`,
12
+ onCreate: {
13
+ service: "sso-admin",
14
+ action: "AttachManagedPolicyToPermissionSet", // https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sso-admin/command/AttachManagedPolicyToPermissionSetCommand
15
+ parameters: {
16
+ InstanceArn: props.instanceArn,
17
+ PermissionSetArn: props.permissionSetArn,
18
+ ManagedPolicyArn: props.managedPolicyArn
19
+ },
20
+ physicalResourceId: customResources.PhysicalResourceId.of(`attachManagedPolicyToPermissionSet${props.permissionSet}`)
21
+ },
22
+ onDelete: {
23
+ service: "sso-admin",
24
+ action: "DetachManagedPolicyFromPermissionSet", // https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sso-admin/command/DetachManagedPolicyFromPermissionSetCommand/
25
+ parameters: {
26
+ InstanceArn: props.instanceArn,
27
+ PermissionSetArn: props.permissionSetArn,
28
+ ManagedPolicyArn: props.managedPolicyArn
29
+ }
30
+ },
31
+ policy: customResources.AwsCustomResourcePolicy.fromSdkCalls({
32
+ resources: ["*"]
33
+ }),
34
+ // TODO: Lock down permissions, when we're ready to troubleshoot intermittent policy errors
35
+ // role: props.role,
36
+ // policy: customResources.AwsCustomResourcePolicy.fromStatements([
37
+ // new PolicyStatement({
38
+ // actions: [
39
+ // "sso:ProvisionPermissionSet",
40
+ // "sso:AttachManagedPolicyToPermissionSet",
41
+ // "sso:DetachManagedPolicyFromPermissionSet",
42
+ // "sso:TagResource"
43
+ // ],
44
+ // resources: ["*"]
45
+ // })
46
+ // ]),
47
+ resourceType: "Custom::PermissionSet"
48
+ });
49
+ }
50
+ }
51
+ exports.AttachManagedPolicy = AttachManagedPolicy;
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNoTWFuYWdlZFBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2lhbS9pZGVudGl0eUNlbnRlci9hdHRhY2hNYW5hZ2VkUG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2QyxnRUFBZ0U7QUFDaEUseUVBQXNFO0FBV3RFLE1BQWEsbUJBQW9CLFNBQVEsc0JBQVM7SUFDaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUkscUNBQWlCLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQ2pELFlBQVksRUFBRSw4QkFBOEIsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUNqRSxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLE1BQU0sRUFBRSxvQ0FBb0MsRUFBRSw0SEFBNEg7Z0JBQzFLLFVBQVUsRUFBRTtvQkFDVixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQzlCLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQ3hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7aUJBQ3pDO2dCQUNELGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQ3ZELHFDQUFxQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQzNEO2FBQ0Y7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLE1BQU0sRUFBRSxzQ0FBc0MsRUFBRSwrSEFBK0g7Z0JBQy9LLFVBQVUsRUFBRTtvQkFDVixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQzlCLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQ3hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7aUJBQ3pDO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsZUFBZSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQztnQkFDM0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO2FBQ2pCLENBQUM7WUFDRiwyRkFBMkY7WUFDM0Ysb0JBQW9CO1lBQ3BCLG1FQUFtRTtZQUNuRSwwQkFBMEI7WUFDMUIsaUJBQWlCO1lBQ2pCLHNDQUFzQztZQUN0QyxrREFBa0Q7WUFDbEQsb0RBQW9EO1lBQ3BELDBCQUEwQjtZQUMxQixTQUFTO1lBQ1QsdUJBQXVCO1lBQ3ZCLE9BQU87WUFDUCxNQUFNO1lBQ04sWUFBWSxFQUFFLHVCQUF1QjtTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUE5Q0Qsa0RBOENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCAqIGFzIGN1c3RvbVJlc291cmNlcyBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgQXdzQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2F3c0N1c3RvbVJlc291cmNlXCI7XG5pbXBvcnQgeyB0eXBlIFJvbGUgfSBmcm9tIFwiLi5cIjtcblxuaW50ZXJmYWNlIEF0dGFjaE1hbmFnZWRQb2xpY3lQcm9wcyB7XG4gIGluc3RhbmNlQXJuOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25TZXQ6IHN0cmluZztcbiAgcGVybWlzc2lvblNldEFybjogc3RyaW5nO1xuICBtYW5hZ2VkUG9saWN5QXJuOiBzdHJpbmc7XG4gIHJvbGU6IFJvbGU7XG59XG5cbmV4cG9ydCBjbGFzcyBBdHRhY2hNYW5hZ2VkUG9saWN5IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEF0dGFjaE1hbmFnZWRQb2xpY3lQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJhdHRhY2hNYW5hZ2VkUG9saWN5XCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYGF0dGFjaFBvbGljeVRvUGVybWlzc2lvblNldCR7cHJvcHMucGVybWlzc2lvblNldH1gLFxuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJzc28tYWRtaW5cIixcbiAgICAgICAgYWN0aW9uOiBcIkF0dGFjaE1hbmFnZWRQb2xpY3lUb1Blcm1pc3Npb25TZXRcIiwgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvdjMvbGF0ZXN0L2NsaWVudC9zc28tYWRtaW4vY29tbWFuZC9BdHRhY2hNYW5hZ2VkUG9saWN5VG9QZXJtaXNzaW9uU2V0Q29tbWFuZFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgSW5zdGFuY2VBcm46IHByb3BzLmluc3RhbmNlQXJuLFxuICAgICAgICAgIFBlcm1pc3Npb25TZXRBcm46IHByb3BzLnBlcm1pc3Npb25TZXRBcm4sXG4gICAgICAgICAgTWFuYWdlZFBvbGljeUFybjogcHJvcHMubWFuYWdlZFBvbGljeUFyblxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgYGF0dGFjaE1hbmFnZWRQb2xpY3lUb1Blcm1pc3Npb25TZXQke3Byb3BzLnBlcm1pc3Npb25TZXR9YFxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgc2VydmljZTogXCJzc28tYWRtaW5cIixcbiAgICAgICAgYWN0aW9uOiBcIkRldGFjaE1hbmFnZWRQb2xpY3lGcm9tUGVybWlzc2lvblNldFwiLCAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy92My9sYXRlc3QvY2xpZW50L3Nzby1hZG1pbi9jb21tYW5kL0RldGFjaE1hbmFnZWRQb2xpY3lGcm9tUGVybWlzc2lvblNldENvbW1hbmQvXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBJbnN0YW5jZUFybjogcHJvcHMuaW5zdGFuY2VBcm4sXG4gICAgICAgICAgUGVybWlzc2lvblNldEFybjogcHJvcHMucGVybWlzc2lvblNldEFybixcbiAgICAgICAgICBNYW5hZ2VkUG9saWN5QXJuOiBwcm9wcy5tYW5hZ2VkUG9saWN5QXJuXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwb2xpY3k6IGN1c3RvbVJlc291cmNlcy5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU2RrQ2FsbHMoe1xuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgIH0pLFxuICAgICAgLy8gVE9ETzogTG9jayBkb3duIHBlcm1pc3Npb25zLCB3aGVuIHdlJ3JlIHJlYWR5IHRvIHRyb3VibGVzaG9vdCBpbnRlcm1pdHRlbnQgcG9saWN5IGVycm9yc1xuICAgICAgLy8gcm9sZTogcHJvcHMucm9sZSxcbiAgICAgIC8vIHBvbGljeTogY3VzdG9tUmVzb3VyY2VzLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TdGF0ZW1lbnRzKFtcbiAgICAgIC8vICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAvLyAgICAgYWN0aW9uczogW1xuICAgICAgLy8gICAgICAgXCJzc286UHJvdmlzaW9uUGVybWlzc2lvblNldFwiLFxuICAgICAgLy8gICAgICAgXCJzc286QXR0YWNoTWFuYWdlZFBvbGljeVRvUGVybWlzc2lvblNldFwiLFxuICAgICAgLy8gICAgICAgXCJzc286RGV0YWNoTWFuYWdlZFBvbGljeUZyb21QZXJtaXNzaW9uU2V0XCIsXG4gICAgICAvLyAgICAgICBcInNzbzpUYWdSZXNvdXJjZVwiXG4gICAgICAvLyAgICAgXSxcbiAgICAgIC8vICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgIC8vICAgfSlcbiAgICAgIC8vIF0pLFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6UGVybWlzc2lvblNldFwiXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import * as ec2 from "aws-cdk-lib/aws-ec2";
2
+ import { type Construct } from "constructs";
3
+ export declare class SecurityGroup extends ec2.SecurityGroup {
4
+ constructor(scope: Construct, id: string, props: ec2.SecurityGroupProps);
5
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SecurityGroup = void 0;
4
+ const ec2 = require("aws-cdk-lib/aws-ec2");
5
+ class SecurityGroup extends ec2.SecurityGroup {
6
+ constructor(scope, id, props) {
7
+ super(scope, id, {
8
+ ...props,
9
+ description: props.description || `${id} Security Group`
10
+ });
11
+ }
12
+ }
13
+ exports.SecurityGroup = SecurityGroup;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHlHcm91cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2lhbS9zZWN1cml0eUdyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUEyQztBQUczQyxNQUFhLGFBQWMsU0FBUSxHQUFHLENBQUMsYUFBYTtJQUNsRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTZCO1FBQ3JFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUksR0FBRyxFQUFFLGlCQUFpQjtTQUN6RCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFQRCxzQ0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlHcm91cCBleHRlbmRzIGVjMi5TZWN1cml0eUdyb3VwIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IGVjMi5TZWN1cml0eUdyb3VwUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uIHx8IGAke2lkfSBTZWN1cml0eSBHcm91cGBcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,28 @@
1
+ import { Role } from "aws-cdk-lib/aws-iam";
2
+ import { type Construct } from "constructs";
3
+ export interface MonitoringRoleConfig {
4
+ /**
5
+ * The AWS account ID of the Fjall webapp that will assume this role
6
+ */
7
+ webappAccountId: string;
8
+ /**
9
+ * The application name to scope the role's permissions to
10
+ */
11
+ appName: string;
12
+ /**
13
+ * Optional role name prefix. Defaults to "FjallMonitoring"
14
+ */
15
+ roleNamePrefix?: string;
16
+ /**
17
+ * Optional IAM path for the role. Defaults to "/"
18
+ */
19
+ rolePath?: string;
20
+ }
21
+ /**
22
+ * Factory to build a cross-account monitoring IAM role that allows the Fjall webapp
23
+ * to query CloudWatch metrics, ECS service status, and logs for this application.
24
+ */
25
+ export declare class MonitoringRoleFactory {
26
+ static build(id: string, config: MonitoringRoleConfig): (app: Construct, scope: Construct) => Role;
27
+ }
28
+ export default MonitoringRoleFactory;
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MonitoringRoleFactory = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
6
+ /**
7
+ * Factory to build a cross-account monitoring IAM role that allows the Fjall webapp
8
+ * to query CloudWatch metrics, ECS service status, and logs for this application.
9
+ */
10
+ class MonitoringRoleFactory {
11
+ static build(id, config) {
12
+ return (app, scope) => {
13
+ const stack = aws_cdk_lib_1.Stack.of(scope);
14
+ const role = new aws_iam_1.Role(scope, id, {
15
+ roleName: `${config.roleNamePrefix || "FjallMonitoring"}-${config.appName}`,
16
+ path: config.rolePath || "/",
17
+ assumedBy: new aws_iam_1.AccountPrincipal(config.webappAccountId),
18
+ description: `Cross-account monitoring role for Fjall application: ${config.appName}`,
19
+ inlinePolicies: {
20
+ MonitoringPolicy: new aws_iam_1.PolicyDocument({
21
+ statements: [
22
+ // CloudWatch Metrics - all resources
23
+ new aws_iam_1.PolicyStatement({
24
+ effect: aws_iam_1.Effect.ALLOW,
25
+ actions: [
26
+ "cloudwatch:GetMetricData",
27
+ "cloudwatch:GetMetricStatistics",
28
+ "cloudwatch:ListMetrics"
29
+ ],
30
+ resources: ["*"]
31
+ }),
32
+ // ECS - scoped to app resources
33
+ new aws_iam_1.PolicyStatement({
34
+ effect: aws_iam_1.Effect.ALLOW,
35
+ actions: [
36
+ "ecs:DescribeServices",
37
+ "ecs:DescribeTasks",
38
+ "ecs:ListTasks",
39
+ "ecs:DescribeClusters",
40
+ "ecs:ListServices"
41
+ ],
42
+ resources: ["*"],
43
+ conditions: {
44
+ StringEquals: {
45
+ "aws:ResourceTag/fjall:costAllocation:service": config.appName
46
+ }
47
+ }
48
+ }),
49
+ // RDS - describe and monitoring
50
+ new aws_iam_1.PolicyStatement({
51
+ effect: aws_iam_1.Effect.ALLOW,
52
+ actions: [
53
+ "rds:DescribeDBInstances",
54
+ "rds:DescribeDBClusters",
55
+ "rds:DescribeDBProxies",
56
+ "rds:ListTagsForResource"
57
+ ],
58
+ resources: ["*"]
59
+ }),
60
+ // S3 - bucket metrics and listing
61
+ new aws_iam_1.PolicyStatement({
62
+ effect: aws_iam_1.Effect.ALLOW,
63
+ actions: [
64
+ "s3:GetBucketLocation",
65
+ "s3:GetBucketMetricsConfiguration",
66
+ "s3:GetBucketTagging",
67
+ "s3:ListBucket",
68
+ "s3:ListAllMyBuckets"
69
+ ],
70
+ resources: ["*"]
71
+ }),
72
+ // Lambda - function metrics and status
73
+ new aws_iam_1.PolicyStatement({
74
+ effect: aws_iam_1.Effect.ALLOW,
75
+ actions: [
76
+ "lambda:GetFunction",
77
+ "lambda:GetFunctionConfiguration",
78
+ "lambda:ListFunctions",
79
+ "lambda:ListTags"
80
+ ],
81
+ resources: ["*"]
82
+ }),
83
+ // Application Load Balancer - metrics and health
84
+ new aws_iam_1.PolicyStatement({
85
+ effect: aws_iam_1.Effect.ALLOW,
86
+ actions: [
87
+ "elasticloadbalancing:DescribeLoadBalancers",
88
+ "elasticloadbalancing:DescribeTargetGroups",
89
+ "elasticloadbalancing:DescribeTargetHealth",
90
+ "elasticloadbalancing:DescribeTags"
91
+ ],
92
+ resources: ["*"]
93
+ }),
94
+ // CloudWatch Logs - read logs for all app resources
95
+ new aws_iam_1.PolicyStatement({
96
+ effect: aws_iam_1.Effect.ALLOW,
97
+ actions: [
98
+ "logs:FilterLogEvents",
99
+ "logs:GetLogEvents",
100
+ "logs:DescribeLogGroups",
101
+ "logs:DescribeLogStreams"
102
+ ],
103
+ resources: [
104
+ `arn:aws:logs:${stack.region}:${stack.account}:log-group:/aws/ecs/${config.appName}*:*`,
105
+ `arn:aws:logs:${stack.region}:${stack.account}:log-group:/aws/lambda/${config.appName}*:*`,
106
+ `arn:aws:logs:${stack.region}:${stack.account}:log-group:/aws/rds/${config.appName}*:*`
107
+ ]
108
+ })
109
+ ]
110
+ })
111
+ }
112
+ });
113
+ // Export the role ARN so it can be retrieved after deployment
114
+ new aws_cdk_lib_1.CfnOutput(scope, `${id}Arn`, {
115
+ value: role.roleArn,
116
+ description: `ARN of the monitoring role for ${config.appName}`,
117
+ exportName: `${config.appName}-MonitoringRoleArn`
118
+ });
119
+ return role;
120
+ };
121
+ }
122
+ }
123
+ exports.MonitoringRoleFactory = MonitoringRoleFactory;
124
+ exports.default = MonitoringRoleFactory;
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmluZ1JvbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9tb25pdG9yaW5nL21vbml0b3JpbmdSb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUErQztBQUMvQyxpREFNNkI7QUF5QjdCOzs7R0FHRztBQUNILE1BQWEscUJBQXFCO0lBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQ2pCLEVBQVUsRUFDVixNQUE0QjtRQUU1QixPQUFPLENBQUMsR0FBYyxFQUFFLEtBQWdCLEVBQUUsRUFBRTtZQUMxQyxNQUFNLEtBQUssR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU5QixNQUFNLElBQUksR0FBRyxJQUFJLGNBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO2dCQUMvQixRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLGlCQUFpQixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7Z0JBQzNFLElBQUksRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLEdBQUc7Z0JBQzVCLFNBQVMsRUFBRSxJQUFJLDBCQUFnQixDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7Z0JBQ3ZELFdBQVcsRUFBRSx3REFBd0QsTUFBTSxDQUFDLE9BQU8sRUFBRTtnQkFDckYsY0FBYyxFQUFFO29CQUNkLGdCQUFnQixFQUFFLElBQUksd0JBQWMsQ0FBQzt3QkFDbkMsVUFBVSxFQUFFOzRCQUNWLHFDQUFxQzs0QkFDckMsSUFBSSx5QkFBZSxDQUFDO2dDQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dDQUNwQixPQUFPLEVBQUU7b0NBQ1AsMEJBQTBCO29DQUMxQixnQ0FBZ0M7b0NBQ2hDLHdCQUF3QjtpQ0FDekI7Z0NBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDOzZCQUNqQixDQUFDOzRCQUNGLGdDQUFnQzs0QkFDaEMsSUFBSSx5QkFBZSxDQUFDO2dDQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dDQUNwQixPQUFPLEVBQUU7b0NBQ1Asc0JBQXNCO29DQUN0QixtQkFBbUI7b0NBQ25CLGVBQWU7b0NBQ2Ysc0JBQXNCO29DQUN0QixrQkFBa0I7aUNBQ25CO2dDQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztnQ0FDaEIsVUFBVSxFQUFFO29DQUNWLFlBQVksRUFBRTt3Q0FDWiw4Q0FBOEMsRUFDNUMsTUFBTSxDQUFDLE9BQU87cUNBQ2pCO2lDQUNGOzZCQUNGLENBQUM7NEJBQ0YsZ0NBQWdDOzRCQUNoQyxJQUFJLHlCQUFlLENBQUM7Z0NBQ2xCLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7Z0NBQ3BCLE9BQU8sRUFBRTtvQ0FDUCx5QkFBeUI7b0NBQ3pCLHdCQUF3QjtvQ0FDeEIsdUJBQXVCO29DQUN2Qix5QkFBeUI7aUNBQzFCO2dDQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQzs2QkFDakIsQ0FBQzs0QkFDRixrQ0FBa0M7NEJBQ2xDLElBQUkseUJBQWUsQ0FBQztnQ0FDbEIsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztnQ0FDcEIsT0FBTyxFQUFFO29DQUNQLHNCQUFzQjtvQ0FDdEIsa0NBQWtDO29DQUNsQyxxQkFBcUI7b0NBQ3JCLGVBQWU7b0NBQ2YscUJBQXFCO2lDQUN0QjtnQ0FDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7NkJBQ2pCLENBQUM7NEJBQ0YsdUNBQXVDOzRCQUN2QyxJQUFJLHlCQUFlLENBQUM7Z0NBQ2xCLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7Z0NBQ3BCLE9BQU8sRUFBRTtvQ0FDUCxvQkFBb0I7b0NBQ3BCLGlDQUFpQztvQ0FDakMsc0JBQXNCO29DQUN0QixpQkFBaUI7aUNBQ2xCO2dDQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQzs2QkFDakIsQ0FBQzs0QkFDRixpREFBaUQ7NEJBQ2pELElBQUkseUJBQWUsQ0FBQztnQ0FDbEIsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztnQ0FDcEIsT0FBTyxFQUFFO29DQUNQLDRDQUE0QztvQ0FDNUMsMkNBQTJDO29DQUMzQywyQ0FBMkM7b0NBQzNDLG1DQUFtQztpQ0FDcEM7Z0NBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDOzZCQUNqQixDQUFDOzRCQUNGLG9EQUFvRDs0QkFDcEQsSUFBSSx5QkFBZSxDQUFDO2dDQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dDQUNwQixPQUFPLEVBQUU7b0NBQ1Asc0JBQXNCO29DQUN0QixtQkFBbUI7b0NBQ25CLHdCQUF3QjtvQ0FDeEIseUJBQXlCO2lDQUMxQjtnQ0FDRCxTQUFTLEVBQUU7b0NBQ1QsZ0JBQWdCLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sdUJBQXVCLE1BQU0sQ0FBQyxPQUFPLEtBQUs7b0NBQ3ZGLGdCQUFnQixLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLDBCQUEwQixNQUFNLENBQUMsT0FBTyxLQUFLO29DQUMxRixnQkFBZ0IsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyx1QkFBdUIsTUFBTSxDQUFDLE9BQU8sS0FBSztpQ0FDeEY7NkJBQ0YsQ0FBQzt5QkFDSDtxQkFDRixDQUFDO2lCQUNIO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsOERBQThEO1lBQzlELElBQUksdUJBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtnQkFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNuQixXQUFXLEVBQUUsa0NBQWtDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7Z0JBQy9ELFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLG9CQUFvQjthQUNsRCxDQUFDLENBQUM7WUFFSCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXZIRCxzREF1SEM7QUFFRCxrQkFBZSxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIFJvbGUsXG4gIEFjY291bnRQcmluY2lwYWwsXG4gIFBvbGljeURvY3VtZW50LFxuICBQb2xpY3lTdGF0ZW1lbnQsXG4gIEVmZmVjdFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdSb2xlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBBV1MgYWNjb3VudCBJRCBvZiB0aGUgRmphbGwgd2ViYXBwIHRoYXQgd2lsbCBhc3N1bWUgdGhpcyByb2xlXG4gICAqL1xuICB3ZWJhcHBBY2NvdW50SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIG5hbWUgdG8gc2NvcGUgdGhlIHJvbGUncyBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgYXBwTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCByb2xlIG5hbWUgcHJlZml4LiBEZWZhdWx0cyB0byBcIkZqYWxsTW9uaXRvcmluZ1wiXG4gICAqL1xuICByb2xlTmFtZVByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgSUFNIHBhdGggZm9yIHRoZSByb2xlLiBEZWZhdWx0cyB0byBcIi9cIlxuICAgKi9cbiAgcm9sZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmFjdG9yeSB0byBidWlsZCBhIGNyb3NzLWFjY291bnQgbW9uaXRvcmluZyBJQU0gcm9sZSB0aGF0IGFsbG93cyB0aGUgRmphbGwgd2ViYXBwXG4gKiB0byBxdWVyeSBDbG91ZFdhdGNoIG1ldHJpY3MsIEVDUyBzZXJ2aWNlIHN0YXR1cywgYW5kIGxvZ3MgZm9yIHRoaXMgYXBwbGljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBNb25pdG9yaW5nUm9sZUZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBNb25pdG9yaW5nUm9sZUNvbmZpZ1xuICApOiAoYXBwOiBDb25zdHJ1Y3QsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFJvbGUge1xuICAgIHJldHVybiAoYXBwOiBDb25zdHJ1Y3QsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IHtcbiAgICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2Yoc2NvcGUpO1xuXG4gICAgICBjb25zdCByb2xlID0gbmV3IFJvbGUoc2NvcGUsIGlkLCB7XG4gICAgICAgIHJvbGVOYW1lOiBgJHtjb25maWcucm9sZU5hbWVQcmVmaXggfHwgXCJGamFsbE1vbml0b3JpbmdcIn0tJHtjb25maWcuYXBwTmFtZX1gLFxuICAgICAgICBwYXRoOiBjb25maWcucm9sZVBhdGggfHwgXCIvXCIsXG4gICAgICAgIGFzc3VtZWRCeTogbmV3IEFjY291bnRQcmluY2lwYWwoY29uZmlnLndlYmFwcEFjY291bnRJZCksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgQ3Jvc3MtYWNjb3VudCBtb25pdG9yaW5nIHJvbGUgZm9yIEZqYWxsIGFwcGxpY2F0aW9uOiAke2NvbmZpZy5hcHBOYW1lfWAsXG4gICAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgICAgTW9uaXRvcmluZ1BvbGljeTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgICAgLy8gQ2xvdWRXYXRjaCBNZXRyaWNzIC0gYWxsIHJlc291cmNlc1xuICAgICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICBcImNsb3Vkd2F0Y2g6R2V0TWV0cmljRGF0YVwiLFxuICAgICAgICAgICAgICAgICAgXCJjbG91ZHdhdGNoOkdldE1ldHJpY1N0YXRpc3RpY3NcIixcbiAgICAgICAgICAgICAgICAgIFwiY2xvdWR3YXRjaDpMaXN0TWV0cmljc1wiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC8vIEVDUyAtIHNjb3BlZCB0byBhcHAgcmVzb3VyY2VzXG4gICAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgIFwiZWNzOkRlc2NyaWJlU2VydmljZXNcIixcbiAgICAgICAgICAgICAgICAgIFwiZWNzOkRlc2NyaWJlVGFza3NcIixcbiAgICAgICAgICAgICAgICAgIFwiZWNzOkxpc3RUYXNrc1wiLFxuICAgICAgICAgICAgICAgICAgXCJlY3M6RGVzY3JpYmVDbHVzdGVyc1wiLFxuICAgICAgICAgICAgICAgICAgXCJlY3M6TGlzdFNlcnZpY2VzXCJcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJhd3M6UmVzb3VyY2VUYWcvZmphbGw6Y29zdEFsbG9jYXRpb246c2VydmljZVwiOlxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hcHBOYW1lXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgLy8gUkRTIC0gZGVzY3JpYmUgYW5kIG1vbml0b3JpbmdcbiAgICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgXCJyZHM6RGVzY3JpYmVEQkluc3RhbmNlc1wiLFxuICAgICAgICAgICAgICAgICAgXCJyZHM6RGVzY3JpYmVEQkNsdXN0ZXJzXCIsXG4gICAgICAgICAgICAgICAgICBcInJkczpEZXNjcmliZURCUHJveGllc1wiLFxuICAgICAgICAgICAgICAgICAgXCJyZHM6TGlzdFRhZ3NGb3JSZXNvdXJjZVwiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC8vIFMzIC0gYnVja2V0IG1ldHJpY3MgYW5kIGxpc3RpbmdcbiAgICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgXCJzMzpHZXRCdWNrZXRMb2NhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgXCJzMzpHZXRCdWNrZXRNZXRyaWNzQ29uZmlndXJhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgXCJzMzpHZXRCdWNrZXRUYWdnaW5nXCIsXG4gICAgICAgICAgICAgICAgICBcInMzOkxpc3RCdWNrZXRcIixcbiAgICAgICAgICAgICAgICAgIFwiczM6TGlzdEFsbE15QnVja2V0c1wiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC8vIExhbWJkYSAtIGZ1bmN0aW9uIG1ldHJpY3MgYW5kIHN0YXR1c1xuICAgICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICBcImxhbWJkYTpHZXRGdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgXCJsYW1iZGE6R2V0RnVuY3Rpb25Db25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgICBcImxhbWJkYTpMaXN0RnVuY3Rpb25zXCIsXG4gICAgICAgICAgICAgICAgICBcImxhbWJkYTpMaXN0VGFnc1wiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC8vIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIgLSBtZXRyaWNzIGFuZCBoZWFsdGhcbiAgICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgXCJlbGFzdGljbG9hZGJhbGFuY2luZzpEZXNjcmliZUxvYWRCYWxhbmNlcnNcIixcbiAgICAgICAgICAgICAgICAgIFwiZWxhc3RpY2xvYWRiYWxhbmNpbmc6RGVzY3JpYmVUYXJnZXRHcm91cHNcIixcbiAgICAgICAgICAgICAgICAgIFwiZWxhc3RpY2xvYWRiYWxhbmNpbmc6RGVzY3JpYmVUYXJnZXRIZWFsdGhcIixcbiAgICAgICAgICAgICAgICAgIFwiZWxhc3RpY2xvYWRiYWxhbmNpbmc6RGVzY3JpYmVUYWdzXCJcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgLy8gQ2xvdWRXYXRjaCBMb2dzIC0gcmVhZCBsb2dzIGZvciBhbGwgYXBwIHJlc291cmNlc1xuICAgICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICBcImxvZ3M6RmlsdGVyTG9nRXZlbnRzXCIsXG4gICAgICAgICAgICAgICAgICBcImxvZ3M6R2V0TG9nRXZlbnRzXCIsXG4gICAgICAgICAgICAgICAgICBcImxvZ3M6RGVzY3JpYmVMb2dHcm91cHNcIixcbiAgICAgICAgICAgICAgICAgIFwibG9nczpEZXNjcmliZUxvZ1N0cmVhbXNcIlxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgICBgYXJuOmF3czpsb2dzOiR7c3RhY2sucmVnaW9ufToke3N0YWNrLmFjY291bnR9OmxvZy1ncm91cDovYXdzL2Vjcy8ke2NvbmZpZy5hcHBOYW1lfSo6KmAsXG4gICAgICAgICAgICAgICAgICBgYXJuOmF3czpsb2dzOiR7c3RhY2sucmVnaW9ufToke3N0YWNrLmFjY291bnR9OmxvZy1ncm91cDovYXdzL2xhbWJkYS8ke2NvbmZpZy5hcHBOYW1lfSo6KmAsXG4gICAgICAgICAgICAgICAgICBgYXJuOmF3czpsb2dzOiR7c3RhY2sucmVnaW9ufToke3N0YWNrLmFjY291bnR9OmxvZy1ncm91cDovYXdzL3Jkcy8ke2NvbmZpZy5hcHBOYW1lfSo6KmBcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEV4cG9ydCB0aGUgcm9sZSBBUk4gc28gaXQgY2FuIGJlIHJldHJpZXZlZCBhZnRlciBkZXBsb3ltZW50XG4gICAgICBuZXcgQ2ZuT3V0cHV0KHNjb3BlLCBgJHtpZH1Bcm5gLCB7XG4gICAgICAgIHZhbHVlOiByb2xlLnJvbGVBcm4sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgQVJOIG9mIHRoZSBtb25pdG9yaW5nIHJvbGUgZm9yICR7Y29uZmlnLmFwcE5hbWV9YCxcbiAgICAgICAgZXhwb3J0TmFtZTogYCR7Y29uZmlnLmFwcE5hbWV9LU1vbml0b3JpbmdSb2xlQXJuYFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByb2xlO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTW9uaXRvcmluZ1JvbGVGYWN0b3J5O1xuIl19
@@ -0,0 +1,5 @@
1
+ import * as cdk from "aws-cdk-lib";
2
+ import { type Construct } from "constructs";
3
+ export declare class CfnOutput extends cdk.CfnOutput {
4
+ constructor(scope: Construct, id: string, props: cdk.CfnOutputProps);
5
+ }