@composurecdk/ec2 0.8.3 → 0.8.5

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 (70) hide show
  1. package/README.md +200 -0
  2. package/dist/commonjs/index.d.ts +20 -0
  3. package/dist/commonjs/index.d.ts.map +1 -1
  4. package/dist/commonjs/index.js +23 -1
  5. package/dist/commonjs/index.js.map +1 -1
  6. package/dist/commonjs/interface-endpoint-alarm-config.d.ts +34 -0
  7. package/dist/commonjs/interface-endpoint-alarm-config.d.ts.map +1 -0
  8. package/dist/commonjs/interface-endpoint-alarm-config.js +3 -0
  9. package/dist/commonjs/interface-endpoint-alarm-config.js.map +1 -0
  10. package/dist/commonjs/interface-endpoint-alarm-defaults.d.ts +13 -0
  11. package/dist/commonjs/interface-endpoint-alarm-defaults.d.ts.map +1 -0
  12. package/dist/commonjs/interface-endpoint-alarm-defaults.js +28 -0
  13. package/dist/commonjs/interface-endpoint-alarm-defaults.js.map +1 -0
  14. package/dist/commonjs/interface-endpoint-alarms.d.ts +13 -0
  15. package/dist/commonjs/interface-endpoint-alarms.d.ts.map +1 -0
  16. package/dist/commonjs/interface-endpoint-alarms.js +58 -0
  17. package/dist/commonjs/interface-endpoint-alarms.js.map +1 -0
  18. package/dist/commonjs/interface-endpoint-builder.d.ts +135 -0
  19. package/dist/commonjs/interface-endpoint-builder.d.ts.map +1 -0
  20. package/dist/commonjs/interface-endpoint-builder.js +126 -0
  21. package/dist/commonjs/interface-endpoint-builder.js.map +1 -0
  22. package/dist/commonjs/interface-endpoint-defaults.d.ts +14 -0
  23. package/dist/commonjs/interface-endpoint-defaults.d.ts.map +1 -0
  24. package/dist/commonjs/interface-endpoint-defaults.js +27 -0
  25. package/dist/commonjs/interface-endpoint-defaults.js.map +1 -0
  26. package/dist/commonjs/security-group-builder.d.ts.map +1 -1
  27. package/dist/commonjs/security-group-builder.js +7 -0
  28. package/dist/commonjs/security-group-builder.js.map +1 -1
  29. package/dist/commonjs/security-group-constraints.d.ts +17 -0
  30. package/dist/commonjs/security-group-constraints.d.ts.map +1 -0
  31. package/dist/commonjs/security-group-constraints.js +70 -0
  32. package/dist/commonjs/security-group-constraints.js.map +1 -0
  33. package/dist/commonjs/vpc-builder.d.ts.map +1 -1
  34. package/dist/commonjs/vpc-builder.js +11 -0
  35. package/dist/commonjs/vpc-builder.js.map +1 -1
  36. package/dist/esm/index.d.ts +20 -0
  37. package/dist/esm/index.d.ts.map +1 -1
  38. package/dist/esm/index.js +19 -0
  39. package/dist/esm/index.js.map +1 -1
  40. package/dist/esm/interface-endpoint-alarm-config.d.ts +34 -0
  41. package/dist/esm/interface-endpoint-alarm-config.d.ts.map +1 -0
  42. package/dist/esm/interface-endpoint-alarm-config.js +2 -0
  43. package/dist/esm/interface-endpoint-alarm-config.js.map +1 -0
  44. package/dist/esm/interface-endpoint-alarm-defaults.d.ts +13 -0
  45. package/dist/esm/interface-endpoint-alarm-defaults.d.ts.map +1 -0
  46. package/dist/esm/interface-endpoint-alarm-defaults.js +25 -0
  47. package/dist/esm/interface-endpoint-alarm-defaults.js.map +1 -0
  48. package/dist/esm/interface-endpoint-alarms.d.ts +13 -0
  49. package/dist/esm/interface-endpoint-alarms.d.ts.map +1 -0
  50. package/dist/esm/interface-endpoint-alarms.js +55 -0
  51. package/dist/esm/interface-endpoint-alarms.js.map +1 -0
  52. package/dist/esm/interface-endpoint-builder.d.ts +135 -0
  53. package/dist/esm/interface-endpoint-builder.d.ts.map +1 -0
  54. package/dist/esm/interface-endpoint-builder.js +123 -0
  55. package/dist/esm/interface-endpoint-builder.js.map +1 -0
  56. package/dist/esm/interface-endpoint-defaults.d.ts +14 -0
  57. package/dist/esm/interface-endpoint-defaults.d.ts.map +1 -0
  58. package/dist/esm/interface-endpoint-defaults.js +24 -0
  59. package/dist/esm/interface-endpoint-defaults.js.map +1 -0
  60. package/dist/esm/security-group-builder.d.ts.map +1 -1
  61. package/dist/esm/security-group-builder.js +7 -0
  62. package/dist/esm/security-group-builder.js.map +1 -1
  63. package/dist/esm/security-group-constraints.d.ts +17 -0
  64. package/dist/esm/security-group-constraints.d.ts.map +1 -0
  65. package/dist/esm/security-group-constraints.js +66 -0
  66. package/dist/esm/security-group-constraints.js.map +1 -0
  67. package/dist/esm/vpc-builder.d.ts.map +1 -1
  68. package/dist/esm/vpc-builder.js +11 -0
  69. package/dist/esm/vpc-builder.js.map +1 -1
  70. package/package.json +16 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface-endpoint-alarms.js","sourceRoot":"","sources":["../../src/interface-endpoint-alarms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAc,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAI3F,OAAO,EAA0B,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEpG,OAAO,EAAE,iCAAiC,EAAE,MAAM,wCAAwC,CAAC;AAE3F,MAAM,sBAAsB,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACnD,MAAM,4BAA4B,GAAG,GAAG,MAAM,CAAC,sBAAsB,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC;AAE5F,SAAS,cAAc,CACrB,QAA8B,EAC9B,UAAkB,EAClB,SAAiB,EACjB,MAAgB;IAEhB,OAAO,IAAI,MAAM,CAAC;QAChB,SAAS,EAAE,0BAA0B;QACrC,UAAU;QACV,aAAa,EAAE,EAAE,iBAAiB,EAAE,QAAQ,CAAC,aAAa,EAAE;QAC5D,SAAS;QACT,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,SAAS,+BAA+B,CACtC,QAA8B,EAC9B,MAAgD;IAEhD,IAAI,MAAM,EAAE,OAAO,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAEzC,MAAM,WAAW,GAAsB,EAAE,CAAC;IAE1C,IAAI,MAAM,EAAE,cAAc,KAAK,KAAK,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,kBAAkB,CAC5B,MAAM,EAAE,cAAc,EACtB,iCAAiC,CAAC,cAAc,CACjD,CAAC;QACF,WAAW,CAAC,IAAI,CAAC;YACf,GAAG,EAAE,gBAAgB;YACrB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,GAAG,EAAE,sBAAsB,CAAC;YACrF,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,kBAAkB,EAAE,kBAAkB,CAAC,sBAAsB;YAC7D,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,WAAW,EACT,oFAAoF;gBACpF,wFAAwF;gBACxF,gBAAgB,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc;gBACnD,GAAG,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,4BAA4B,GAAG;SACxE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAC3C,KAAiB,EACjB,EAAU,EACV,QAA8B,EAC9B,MAAwD,EACxD,eAA+D,EAAE;IAEjE,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,iCAAiC,CAAC,OAAO,CAAC;IAC7E,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,WAAW,GAAG,+BAA+B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE5D,OAAO,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,135 @@
1
+ import { type Alarm } from "aws-cdk-lib/aws-cloudwatch";
2
+ import { InterfaceVpcEndpoint, type IConnectable, type InterfaceVpcEndpointProps, type ISecurityGroup, type IVpc, type SecurityGroup } from "aws-cdk-lib/aws-ec2";
3
+ import { type IConstruct } from "constructs";
4
+ import { COPY_STATE, type Lifecycle, type Resolvable } from "@composurecdk/core";
5
+ import { type ITaggedBuilder } from "@composurecdk/cloudformation";
6
+ import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
7
+ import type { InterfaceEndpointAlarmConfig } from "./interface-endpoint-alarm-config.js";
8
+ /**
9
+ * Configuration properties for the interface-endpoint builder.
10
+ *
11
+ * Lifts three CDK props off the props object:
12
+ * - `vpc` — supplied via {@link IInterfaceEndpointBuilder.vpc | .vpc()} so it
13
+ * can accept a {@link Resolvable} for cross-component wiring.
14
+ * - `securityGroups` — supplied via
15
+ * {@link IInterfaceEndpointBuilder.securityGroups | .securityGroups()} so
16
+ * each can be a {@link Resolvable} (typically a sibling
17
+ * `SecurityGroupBuilder`).
18
+ * - `open` — always `false`; ingress is explicit (see the builder docs).
19
+ */
20
+ export interface InterfaceEndpointBuilderProps extends Omit<InterfaceVpcEndpointProps, "vpc" | "securityGroups" | "open"> {
21
+ /**
22
+ * Configuration for AWS-recommended CloudWatch alarms.
23
+ *
24
+ * By default, the builder creates recommended alarms with sensible
25
+ * thresholds. Individual alarms can be customized or disabled. Set to
26
+ * `false` to disable all alarms.
27
+ *
28
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#PrivateLinkEndpoints
29
+ */
30
+ recommendedAlarms?: InterfaceEndpointAlarmConfig | false;
31
+ }
32
+ /**
33
+ * The build output of an {@link IInterfaceEndpointBuilder}.
34
+ *
35
+ * `securityGroup` is present only in **managed mode** — i.e. when the caller
36
+ * did *not* supply `.securityGroups(...)`, so the builder auto-created one. It
37
+ * is exposed for cases where sibling builders need to reference the
38
+ * auto-created SG directly. In **BYO mode** it is `undefined`: the caller
39
+ * already holds refs to the security groups they passed in.
40
+ */
41
+ export interface InterfaceEndpointBuilderResult {
42
+ endpoint: InterfaceVpcEndpoint;
43
+ securityGroup?: SecurityGroup;
44
+ alarms: Record<string, Alarm>;
45
+ }
46
+ /**
47
+ * A fluent builder for a single VPC interface endpoint (AWS PrivateLink).
48
+ *
49
+ * Unlike raw CDK — where interface endpoints exist only as a post-build
50
+ * `vpc.addInterfaceEndpoint(...)` call whose security group is never exposed —
51
+ * this builder is a first-class {@link compose} component. It maps 1:1 to a
52
+ * CDK `InterfaceVpcEndpoint` (one `service` per endpoint); group several into
53
+ * one access policy by pointing them at the same security group.
54
+ *
55
+ * **Security group, two modes:**
56
+ * - *BYO* — call {@link IInterfaceEndpointBuilder.securityGroups | .securityGroups([...])}
57
+ * with security groups you fully manage (typically sibling
58
+ * `SecurityGroupBuilder`s). Full ingress/egress/port control; the builder
59
+ * creates no SG and `securityGroup` is absent from the result.
60
+ * - *Managed shortcut* — omit `.securityGroups()` and the builder auto-creates
61
+ * a closed SG, exposes it on the result, and for each peer you pass to
62
+ * {@link IInterfaceEndpointBuilder.allowDefaultPortFrom} it opens ingress on
63
+ * the managed SG **and** egress on the peer's SG — matching exactly what CDK's
64
+ * `connections.allowDefaultPortFrom(...)` does bidirectionally.
65
+ *
66
+ * The two are mutually exclusive — combining BYO `.securityGroups()` with
67
+ * `.allowDefaultPortFrom()` throws, since the rule would have nowhere it
68
+ * could be applied that the caller isn't already managing.
69
+ *
70
+ * @see https://docs.aws.amazon.com/vpc/latest/privatelink/
71
+ *
72
+ * @example Managed shortcut (the SSM-from-bastion common case)
73
+ * ```ts
74
+ * createInterfaceEndpointBuilder()
75
+ * .vpc(ref<VpcBuilderResult>("network").get("vpc"))
76
+ * .service(InterfaceVpcEndpointAwsService.SSM)
77
+ * .subnets({ subnetType: SubnetType.PRIVATE_ISOLATED })
78
+ * .allowDefaultPortFrom(ref<SecurityGroupBuilderResult>("bastionSg").get("securityGroup"));
79
+ * // result = { endpoint, securityGroup }
80
+ * ```
81
+ */
82
+ export type IInterfaceEndpointBuilder = ITaggedBuilder<InterfaceEndpointBuilderProps, InterfaceEndpointBuilder>;
83
+ declare class InterfaceEndpointBuilder implements Lifecycle<InterfaceEndpointBuilderResult> {
84
+ #private;
85
+ props: Partial<InterfaceEndpointBuilderProps>;
86
+ /**
87
+ * Sets the VPC the endpoint is created in. Accepts a concrete {@link IVpc}
88
+ * or a {@link Ref} to a sibling {@link IVpcBuilder}.
89
+ */
90
+ vpc(vpc: Resolvable<IVpc>): this;
91
+ /**
92
+ * Bring-your-own security groups. Each entry is a {@link Resolvable}, so it
93
+ * can be a concrete {@link ISecurityGroup} or a {@link Ref} to a sibling
94
+ * `SecurityGroupBuilder` — giving you full ingress/egress/port control. When
95
+ * set, the builder creates no security group of its own and
96
+ * {@link InterfaceEndpointBuilderResult.securityGroup} is `undefined`.
97
+ *
98
+ * Mutually exclusive with {@link allowDefaultPortFrom}.
99
+ */
100
+ securityGroups(securityGroups: Resolvable<ISecurityGroup>[]): this;
101
+ /**
102
+ * Managed-SG shortcut: wires `peer` to the auto-created security group via
103
+ * CDK's `endpoint.connections.allowDefaultPortFrom(peer)` — opening ingress
104
+ * on the managed SG from `peer`'s SG **and** egress from `peer`'s SG to the
105
+ * managed SG, on the service's default port (443 for AWS services).
106
+ *
107
+ * Because this delegates to CDK connections, `peer` must be an
108
+ * {@link IConnectable} (e.g. a `SecurityGroup` or `Instance`), not a raw
109
+ * `IPeer` (e.g. `Peer.ipv4(...)`). For CIDR-based rules use BYO mode with
110
+ * an explicit `addIngressRule` on your own {@link SecurityGroupBuilder}.
111
+ *
112
+ * Mutually exclusive with {@link securityGroups}.
113
+ */
114
+ allowDefaultPortFrom(peer: Resolvable<IConnectable>, description?: string): this;
115
+ /**
116
+ * Adds a custom CloudWatch alarm alongside the recommended ones. The
117
+ * callback receives an {@link AlarmDefinitionBuilder} typed to the
118
+ * `InterfaceVpcEndpoint` construct, giving access to the endpoint at
119
+ * build time for metric dimension wiring.
120
+ */
121
+ addAlarm(key: string, configure: (alarm: AlarmDefinitionBuilder<InterfaceVpcEndpoint>) => AlarmDefinitionBuilder<InterfaceVpcEndpoint>): this;
122
+ /** @internal — see ADR-0005. */
123
+ [COPY_STATE](target: InterfaceEndpointBuilder): void;
124
+ build(scope: IConstruct, id: string, context?: Record<string, object>): InterfaceEndpointBuilderResult;
125
+ }
126
+ /**
127
+ * Creates a new {@link IInterfaceEndpointBuilder} for a single VPC interface
128
+ * endpoint. The returned builder exposes every
129
+ * {@link InterfaceEndpointBuilderProps} property as a fluent setter/getter,
130
+ * plus `.vpc()`, `.securityGroups()` (BYO), and `.allowDefaultPortFrom()`
131
+ * (managed-SG shortcut).
132
+ */
133
+ export declare function createInterfaceEndpointBuilder(): IInterfaceEndpointBuilder;
134
+ export {};
135
+ //# sourceMappingURL=interface-endpoint-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface-endpoint-builder.d.ts","sourceRoot":"","sources":["../../src/interface-endpoint-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EACL,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,yBAAyB,EAC9B,KAAK,cAAc,EACnB,KAAK,IAAI,EACT,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAW,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAGzF;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CACzD,yBAAyB,EACzB,KAAK,GAAG,gBAAgB,GAAG,MAAM,CAClC;IACC;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,4BAA4B,GAAG,KAAK,CAAC;CAC1D;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC/B;AAOD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,MAAM,yBAAyB,GAAG,cAAc,CACpD,6BAA6B,EAC7B,wBAAwB,CACzB,CAAC;AAEF,cAAM,wBAAyB,YAAW,SAAS,CAAC,8BAA8B,CAAC;;IACjF,KAAK,EAAE,OAAO,CAAC,6BAA6B,CAAC,CAAM;IAMnD;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI;IAKhC;;;;;;;;OAQG;IACH,cAAc,CAAC,cAAc,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,GAAG,IAAI;IAKlE;;;;;;;;;;;;OAYG;IACH,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAKhF;;;;;OAKG;IACH,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CACT,KAAK,EAAE,sBAAsB,CAAC,oBAAoB,CAAC,KAChD,sBAAsB,CAAC,oBAAoB,CAAC,GAChD,IAAI;IAKP,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI;IAOpD,KAAK,CACH,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,8BAA8B;CA6DlC;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,IAAI,yBAAyB,CAI1E"}
@@ -0,0 +1,123 @@
1
+ import { InterfaceVpcEndpoint, } from "aws-cdk-lib/aws-ec2";
2
+ import { COPY_STATE, resolve } from "@composurecdk/core";
3
+ import { taggedBuilder } from "@composurecdk/cloudformation";
4
+ import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
5
+ import { createSecurityGroupBuilder } from "./security-group-builder.js";
6
+ import { INTERFACE_ENDPOINT_DEFAULTS } from "./interface-endpoint-defaults.js";
7
+ import { createInterfaceEndpointAlarms } from "./interface-endpoint-alarms.js";
8
+ class InterfaceEndpointBuilder {
9
+ props = {};
10
+ #access = [];
11
+ #customAlarms = [];
12
+ #vpc;
13
+ #securityGroups;
14
+ /**
15
+ * Sets the VPC the endpoint is created in. Accepts a concrete {@link IVpc}
16
+ * or a {@link Ref} to a sibling {@link IVpcBuilder}.
17
+ */
18
+ vpc(vpc) {
19
+ this.#vpc = vpc;
20
+ return this;
21
+ }
22
+ /**
23
+ * Bring-your-own security groups. Each entry is a {@link Resolvable}, so it
24
+ * can be a concrete {@link ISecurityGroup} or a {@link Ref} to a sibling
25
+ * `SecurityGroupBuilder` — giving you full ingress/egress/port control. When
26
+ * set, the builder creates no security group of its own and
27
+ * {@link InterfaceEndpointBuilderResult.securityGroup} is `undefined`.
28
+ *
29
+ * Mutually exclusive with {@link allowDefaultPortFrom}.
30
+ */
31
+ securityGroups(securityGroups) {
32
+ this.#securityGroups = securityGroups;
33
+ return this;
34
+ }
35
+ /**
36
+ * Managed-SG shortcut: wires `peer` to the auto-created security group via
37
+ * CDK's `endpoint.connections.allowDefaultPortFrom(peer)` — opening ingress
38
+ * on the managed SG from `peer`'s SG **and** egress from `peer`'s SG to the
39
+ * managed SG, on the service's default port (443 for AWS services).
40
+ *
41
+ * Because this delegates to CDK connections, `peer` must be an
42
+ * {@link IConnectable} (e.g. a `SecurityGroup` or `Instance`), not a raw
43
+ * `IPeer` (e.g. `Peer.ipv4(...)`). For CIDR-based rules use BYO mode with
44
+ * an explicit `addIngressRule` on your own {@link SecurityGroupBuilder}.
45
+ *
46
+ * Mutually exclusive with {@link securityGroups}.
47
+ */
48
+ allowDefaultPortFrom(peer, description) {
49
+ this.#access.push({ peer, description });
50
+ return this;
51
+ }
52
+ /**
53
+ * Adds a custom CloudWatch alarm alongside the recommended ones. The
54
+ * callback receives an {@link AlarmDefinitionBuilder} typed to the
55
+ * `InterfaceVpcEndpoint` construct, giving access to the endpoint at
56
+ * build time for metric dimension wiring.
57
+ */
58
+ addAlarm(key, configure) {
59
+ this.#customAlarms.push(configure(new AlarmDefinitionBuilder(key)));
60
+ return this;
61
+ }
62
+ /** @internal — see ADR-0005. */
63
+ [COPY_STATE](target) {
64
+ target.#vpc = this.#vpc;
65
+ target.#securityGroups = this.#securityGroups ? [...this.#securityGroups] : undefined;
66
+ target.#access.push(...this.#access);
67
+ target.#customAlarms.push(...this.#customAlarms);
68
+ }
69
+ build(scope, id, context) {
70
+ const resolvedVpc = this.#vpc ? resolve(this.#vpc, context) : undefined;
71
+ if (!resolvedVpc) {
72
+ throw new Error(`InterfaceEndpointBuilder "${id}" requires a VPC. Call .vpc() with an IVpc or a Ref to one.`);
73
+ }
74
+ const { recommendedAlarms: alarmConfig, service, ...endpointProps } = this.props;
75
+ if (service === undefined) {
76
+ throw new Error(`InterfaceEndpointBuilder "${id}" requires a service. ` +
77
+ "Call .service() with an InterfaceVpcEndpointAwsService or a custom IInterfaceVpcEndpointService.");
78
+ }
79
+ const byo = this.#securityGroups;
80
+ if (byo !== undefined && this.#access.length > 0) {
81
+ throw new Error(`InterfaceEndpointBuilder "${id}": .allowDefaultPortFrom() applies only to the ` +
82
+ "auto-created security group and cannot be combined with .securityGroups() — " +
83
+ "add the ingress rule to your own SecurityGroupBuilder instead.");
84
+ }
85
+ let managedSecurityGroup;
86
+ let securityGroups;
87
+ if (byo !== undefined) {
88
+ securityGroups = byo.map((sg) => resolve(sg, context));
89
+ }
90
+ else {
91
+ managedSecurityGroup = createSecurityGroupBuilder()
92
+ .vpc(resolvedVpc)
93
+ .description(`Interface endpoint ${id}`)
94
+ .build(scope, `${id}Sg`).securityGroup;
95
+ securityGroups = [managedSecurityGroup];
96
+ }
97
+ const endpoint = new InterfaceVpcEndpoint(scope, id, {
98
+ ...INTERFACE_ENDPOINT_DEFAULTS,
99
+ ...endpointProps,
100
+ service,
101
+ vpc: resolvedVpc,
102
+ securityGroups,
103
+ // Always explicit: `open: true` would silently add a VPC-wide :443 rule.
104
+ open: false,
105
+ });
106
+ for (const rule of this.#access) {
107
+ endpoint.connections.allowDefaultPortFrom(resolve(rule.peer, context), rule.description);
108
+ }
109
+ const alarms = createInterfaceEndpointAlarms(scope, id, endpoint, alarmConfig, this.#customAlarms);
110
+ return { endpoint, securityGroup: managedSecurityGroup, alarms };
111
+ }
112
+ }
113
+ /**
114
+ * Creates a new {@link IInterfaceEndpointBuilder} for a single VPC interface
115
+ * endpoint. The returned builder exposes every
116
+ * {@link InterfaceEndpointBuilderProps} property as a fluent setter/getter,
117
+ * plus `.vpc()`, `.securityGroups()` (BYO), and `.allowDefaultPortFrom()`
118
+ * (managed-SG shortcut).
119
+ */
120
+ export function createInterfaceEndpointBuilder() {
121
+ return taggedBuilder(InterfaceEndpointBuilder);
122
+ }
123
+ //# sourceMappingURL=interface-endpoint-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface-endpoint-builder.js","sourceRoot":"","sources":["../../src/interface-endpoint-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { InterfaceVpcEndpointProps } from "aws-cdk-lib/aws-ec2";
2
+ /**
3
+ * Secure, AWS-recommended defaults applied to every interface endpoint built
4
+ * with {@link createInterfaceEndpointBuilder}. Each property can be
5
+ * individually overridden via the builder's fluent API.
6
+ *
7
+ * Note `open` is intentionally *not* here: the builder always sets it to
8
+ * `false` (see the builder's `build()`). Allowing it through would silently
9
+ * add a VPC-wide rule to the managed security group behind the caller's back;
10
+ * ingress is always explicit — via `.allowDefaultPortFrom()` (managed SG) or
11
+ * the BYO `SecurityGroupBuilder`.
12
+ */
13
+ export declare const INTERFACE_ENDPOINT_DEFAULTS: Partial<InterfaceVpcEndpointProps>;
14
+ //# sourceMappingURL=interface-endpoint-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface-endpoint-defaults.d.ts","sourceRoot":"","sources":["../../src/interface-endpoint-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,2BAA2B,EAAE,OAAO,CAAC,yBAAyB,CAW1E,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Secure, AWS-recommended defaults applied to every interface endpoint built
3
+ * with {@link createInterfaceEndpointBuilder}. Each property can be
4
+ * individually overridden via the builder's fluent API.
5
+ *
6
+ * Note `open` is intentionally *not* here: the builder always sets it to
7
+ * `false` (see the builder's `build()`). Allowing it through would silently
8
+ * add a VPC-wide rule to the managed security group behind the caller's back;
9
+ * ingress is always explicit — via `.allowDefaultPortFrom()` (managed SG) or
10
+ * the BYO `SecurityGroupBuilder`.
11
+ */
12
+ export const INTERFACE_ENDPOINT_DEFAULTS = {
13
+ /**
14
+ * Private DNS enables `<service>.<region>.amazonaws.com` to resolve to the
15
+ * endpoint ENIs instead of the public service IP addresses, keeping traffic
16
+ * on the AWS network without requiring application-level changes. Disabled
17
+ * by default in raw CDK; always on here because every AWS-service use case
18
+ * requires it for transparent private access.
19
+ *
20
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/sec_network_protection_private_connectivity.html
21
+ */
22
+ privateDnsEnabled: true,
23
+ };
24
+ //# sourceMappingURL=interface-endpoint-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface-endpoint-defaults.js","sourceRoot":"","sources":["../../src/interface-endpoint-defaults.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAuC;IAC7E;;;;;;;;OAQG;IACH,iBAAiB,EAAE,IAAI;CACxB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"security-group-builder.d.ts","sourceRoot":"","sources":["../../src/security-group-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,KAAK,EACV,KAAK,IAAI,EACT,KAAK,IAAI,EACT,aAAa,EACb,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAW,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAGlF;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAExE;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,aAAa,CAAC;CAC9B;AAcD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,CAAC;AAEpG,cAAM,oBAAqB,YAAW,SAAS,CAAC,0BAA0B,CAAC;;IACzE,KAAK,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAM;IAK/C;;;;;;;;;OASG;IACH,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI;IAKhC;;;;;;;;;OASG;IACH,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAU/E;;;;;;;;;OASG;IACH,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAU9E;;;;;;;;;;OAUG;IACH,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAQtD,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAMhD,KAAK,CACH,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,0BAA0B;CAiD9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,IAAI,qBAAqB,CAElE"}
1
+ {"version":3,"file":"security-group-builder.d.ts","sourceRoot":"","sources":["../../src/security-group-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,KAAK,EACV,KAAK,IAAI,EACT,KAAK,IAAI,EACT,aAAa,EACb,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAW,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAOlF;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAExE;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,aAAa,CAAC;CAC9B;AAcD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,CAAC;AAEpG,cAAM,oBAAqB,YAAW,SAAS,CAAC,0BAA0B,CAAC;;IACzE,KAAK,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAM;IAK/C;;;;;;;;;OASG;IACH,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI;IAKhC;;;;;;;;;OASG;IACH,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAU/E;;;;;;;;;OASG;IACH,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAU9E;;;;;;;;;;OAUG;IACH,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAQtD,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAMhD,KAAK,CACH,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,0BAA0B;CAwD9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,IAAI,qBAAqB,CAElE"}
@@ -2,6 +2,7 @@ import { SecurityGroup, } from "aws-cdk-lib/aws-ec2";
2
2
  import { COPY_STATE, resolve } from "@composurecdk/core";
3
3
  import { taggedBuilder } from "@composurecdk/cloudformation";
4
4
  import { SECURITY_GROUP_DEFAULTS } from "./security-group-defaults.js";
5
+ import { validateSecurityGroupDescription, validateSecurityGroupName, } from "./security-group-constraints.js";
5
6
  class SecurityGroupBuilder {
6
7
  props = {};
7
8
  #peerRules = [];
@@ -93,6 +94,12 @@ class SecurityGroupBuilder {
93
94
  throw new Error(`SecurityGroupBuilder "${id}" requires a description. ` +
94
95
  "Call .description() with a short summary of the SG's purpose.");
95
96
  }
97
+ // Fail at synth, at the authoring call site, instead of CREATE_FAILED at
98
+ // deploy time. The validators skip unresolved tokens (ADR-0010).
99
+ validateSecurityGroupDescription(this.props.description);
100
+ if (this.props.securityGroupName !== undefined) {
101
+ validateSecurityGroupName(this.props.securityGroupName);
102
+ }
96
103
  // Drop keys whose value is `undefined` so a fluent call like
97
104
  // `.allowAllOutbound(undefined)` (common in "optional override" code:
98
105
  // `b.allowAllOutbound(cfg?.allowAllOutbound)`) does not clobber the
@@ -1 +1 @@
1
- {"version":3,"file":"security-group-builder.js","sourceRoot":"","sources":["../../src/security-group-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,aAAa,GAEd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAkB,OAAO,EAAmB,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAuB,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AA8FvE,MAAM,oBAAoB;IACxB,KAAK,GAAuC,EAAE,CAAC;IACtC,UAAU,GAAmB,EAAE,CAAC;IAChC,YAAY,GAAsB,EAAE,CAAC;IAC9C,IAAI,CAAoB;IAExB;;;;;;;;;OASG;IACH,GAAG,CAAC,GAAqB;QACvB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;OASG;IACH,cAAc,CAAC,IAAuB,EAAE,IAAU,EAAE,WAAoB;QACtE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,SAAS,EAAE,SAAS;YACpB,IAAI;YACJ,IAAI;YACJ,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;OASG;IACH,aAAa,CAAC,IAAuB,EAAE,IAAU,EAAE,WAAoB;QACrE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,SAAS,EAAE,QAAQ;YACnB,IAAI;YACJ,IAAI;YACJ,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACH,cAAc,CAAC,IAAU,EAAE,WAAoB;QAC7C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YACrB,IAAI;YACJ,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAA4B;QACvC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACxB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CACH,KAAiB,EACjB,EAAU,EACV,OAAgC;QAEhC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,yBAAyB,EAAE,oBAAoB;gBAC7C,2CAA2C,CAC9C,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACjF,MAAM,IAAI,KAAK,CACb,yBAAyB,EAAE,4BAA4B;gBACrD,+DAA+D,CAClE,CAAC;QACJ,CAAC;QAED,6DAA6D;QAC7D,sEAAsE;QACtE,oEAAoE;QACpE,mDAAmD;QACnD,MAAM,SAAS,GAAuC,EAAE,CAAC;QACzD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAwC,EAAE,CAAC;YACjF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACvB,SAAqC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtD,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG;YAClB,GAAG,uBAAuB;YAC1B,GAAG,SAAS;YACZ,GAAG,EAAE,WAAW;SACK,CAAC;QAExB,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEhE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACjC,aAAa,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,aAAa,CAAC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,EAAE,aAAa,EAAE,CAAC;IAC3B,CAAC;CACF;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,aAAa,CAAkD,oBAAoB,CAAC,CAAC;AAC9F,CAAC"}
1
+ {"version":3,"file":"security-group-builder.js","sourceRoot":"","sources":["../../src/security-group-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Validates an EC2 security group description. Unresolved CDK tokens are
3
+ * skipped — their value is resolved by CloudFormation and is not knowable at
4
+ * synth (ADR-0010).
5
+ *
6
+ * @throws on invalid input.
7
+ */
8
+ export declare function validateSecurityGroupDescription(raw: string): void;
9
+ /**
10
+ * Validates an EC2 security group name. AWS additionally reserves the `sg-`
11
+ * prefix for generated group IDs, so a user-supplied name must not use it.
12
+ * Unresolved CDK tokens are skipped (ADR-0010).
13
+ *
14
+ * @throws on invalid input.
15
+ */
16
+ export declare function validateSecurityGroupName(raw: string): void;
17
+ //# sourceMappingURL=security-group-constraints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-group-constraints.d.ts","sourceRoot":"","sources":["../../src/security-group-constraints.ts"],"names":[],"mappings":"AA2CA;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAGlE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQ3D"}
@@ -0,0 +1,66 @@
1
+ import { Token } from "aws-cdk-lib";
2
+ import { charSets, stringConstraint, validateString } from "@composurecdk/cloudformation";
3
+ /**
4
+ * AWS-property constraints for EC2 security groups.
5
+ *
6
+ * The catalogue mechanism (`stringConstraint` / `validateString`) lives in
7
+ * `@composurecdk/cloudformation`; this per-resource data lives next to the
8
+ * builder that enforces it. The trigger for the catalogue was an em-dash in a
9
+ * `GroupDescription` reaching CloudFormation and failing at CREATE_FAILED — a
10
+ * `validate*` call in `build()` turns that into a `cdk synth` error. See
11
+ * ADR-0010.
12
+ *
13
+ * The constraints themselves are module-private; the package exposes only the
14
+ * `validate*` functions (via the `constraints` namespace in the package index).
15
+ *
16
+ * `GroupDescription` and `GroupName` share the same EC2 character set, so they
17
+ * spread the same class fragments; the comma/bracket tail beyond the shared
18
+ * `charSets.AWS_NAME_PUNCT` spine is EC2-specific and stays local.
19
+ */
20
+ const SG_TAIL = ",\\[\\]&;{}!$*";
21
+ const SG_CHAR_CLASS = `${charSets.ALNUM}${charSets.AWS_NAME_PUNCT}${SG_TAIL}`;
22
+ const SG_ALLOWED = "ASCII letters, digits, spaces and ._-:/()#,@[]+=&;{}!$*";
23
+ const SG_SOURCE = "https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateSecurityGroup.html";
24
+ const SECURITY_GROUP_DESCRIPTION = stringConstraint({
25
+ name: "EC2 SecurityGroup GroupDescription",
26
+ charClass: SG_CHAR_CLASS,
27
+ maxLength: 255,
28
+ allowed: SG_ALLOWED,
29
+ source: SG_SOURCE,
30
+ });
31
+ const SECURITY_GROUP_NAME = stringConstraint({
32
+ name: "EC2 SecurityGroup GroupName",
33
+ charClass: SG_CHAR_CLASS,
34
+ minLength: 1,
35
+ maxLength: 255,
36
+ allowed: SG_ALLOWED,
37
+ source: SG_SOURCE,
38
+ });
39
+ /**
40
+ * Validates an EC2 security group description. Unresolved CDK tokens are
41
+ * skipped — their value is resolved by CloudFormation and is not knowable at
42
+ * synth (ADR-0010).
43
+ *
44
+ * @throws on invalid input.
45
+ */
46
+ export function validateSecurityGroupDescription(raw) {
47
+ if (Token.isUnresolved(raw))
48
+ return;
49
+ validateString(raw, SECURITY_GROUP_DESCRIPTION);
50
+ }
51
+ /**
52
+ * Validates an EC2 security group name. AWS additionally reserves the `sg-`
53
+ * prefix for generated group IDs, so a user-supplied name must not use it.
54
+ * Unresolved CDK tokens are skipped (ADR-0010).
55
+ *
56
+ * @throws on invalid input.
57
+ */
58
+ export function validateSecurityGroupName(raw) {
59
+ if (Token.isUnresolved(raw))
60
+ return;
61
+ if (raw.startsWith("sg-")) {
62
+ throw new Error(`EC2 SecurityGroup GroupName "${raw}" must not start with the reserved "sg-" prefix. See ${SG_SOURCE}.`);
63
+ }
64
+ validateString(raw, SECURITY_GROUP_NAME);
65
+ }
66
+ //# sourceMappingURL=security-group-constraints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-group-constraints.js","sourceRoot":"","sources":["../../src/security-group-constraints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE1F;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,GAAG,gBAAgB,CAAC;AACjC,MAAM,aAAa,GAAG,GAAG,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,cAAc,GAAG,OAAO,EAAE,CAAC;AAC9E,MAAM,UAAU,GAAG,yDAAyD,CAAC;AAC7E,MAAM,SAAS,GACb,qFAAqF,CAAC;AAExF,MAAM,0BAA0B,GAAG,gBAAgB,CAAC;IAClD,IAAI,EAAE,oCAAoC;IAC1C,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,GAAG;IACd,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,SAAS;CAClB,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;IAC3C,IAAI,EAAE,6BAA6B;IACnC,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,GAAG;IACd,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,SAAS;CAClB,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAAC,GAAW;IAC1D,IAAI,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;QAAE,OAAO;IACpC,cAAc,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,IAAI,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;QAAE,OAAO;IACpC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,gCAAgC,GAAG,wDAAwD,SAAS,GAAG,CACxG,CAAC;IACJ,CAAC;IACD,cAAc,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;AAC3C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"vpc-builder.d.ts","sourceRoot":"","sources":["../../src/vpc-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGlF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,cAAc,GACtB,KAAK,GACL;IACE,gFAAgF;IAChF,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,gBAAgB,CAAC;CACvD,CAAC;AAEN;;;;;;GAMG;AACH,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;IACjE,wFAAwF;IACxF,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,GAAG,CAAC;IAET;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,QAAQ,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;AAItE,cAAM,UAAW,YAAW,SAAS,CAAC,gBAAgB,CAAC;IACrD,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,CAAM;IAErC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,gBAAgB;CAgBvD;AA2CD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,CAE9C"}
1
+ {"version":3,"file":"vpc-builder.d.ts","sourceRoot":"","sources":["../../src/vpc-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGlF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,cAAc,GACtB,KAAK,GACL;IACE,gFAAgF;IAChF,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,gBAAgB,CAAC;CACvD,CAAC;AAEN;;;;;;GAMG;AACH,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;IACjE,wFAAwF;IACxF,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,GAAG,CAAC;IAET;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,QAAQ,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;AAItE,cAAM,UAAW,YAAW,SAAS,CAAC,gBAAgB,CAAC;IACrD,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,CAAM;IAErC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,gBAAgB;CA8BvD;AA2CD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,CAE9C"}
@@ -8,11 +8,22 @@ class VpcBuilder {
8
8
  build(scope, id) {
9
9
  const { flowLogs: flowLogsConfig, ...vpcProps } = this.props;
10
10
  const { flowLogsLogGroup, flowLogProps } = resolveFlowLogs(scope, id, flowLogsConfig);
11
+ // CDK accepts `availabilityZones` or `maxAzs`, but not both. When the user
12
+ // pins AZs explicitly, the default `maxAzs` must yield to their intent;
13
+ // setting both is a genuine conflict and fails fast.
14
+ const userPinnedAzs = vpcProps.availabilityZones !== undefined;
15
+ if (userPinnedAzs && vpcProps.maxAzs !== undefined) {
16
+ throw new Error(`VpcBuilder "${id}": .availabilityZones() and .maxAzs() are mutually exclusive — ` +
17
+ `CDK accepts one or the other, not both.`);
18
+ }
11
19
  const mergedProps = {
12
20
  ...VPC_DEFAULTS,
13
21
  ...flowLogProps,
14
22
  ...vpcProps,
15
23
  };
24
+ if (userPinnedAzs) {
25
+ delete mergedProps.maxAzs;
26
+ }
16
27
  return {
17
28
  vpc: new Vpc(scope, id, mergedProps),
18
29
  flowLogsLogGroup,
@@ -1 +1 @@
1
- {"version":3,"file":"vpc-builder.js","sourceRoot":"","sources":["../../src/vpc-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAiB,MAAM,qBAAqB,CAAC;AAI7E,OAAO,EAAuB,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAyB,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAmFjD,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAE9C,MAAM,UAAU;IACd,KAAK,GAA6B,EAAE,CAAC;IAErC,KAAK,CAAC,KAAiB,EAAE,EAAU;QACjC,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE7D,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;QAEtF,MAAM,WAAW,GAAG;YAClB,GAAG,YAAY;YACf,GAAG,YAAY;YACf,GAAG,QAAQ;SACZ,CAAC;QAEF,OAAO;YACL,GAAG,EAAE,IAAI,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC;YACpC,gBAAgB;SACjB,CAAC;IACJ,CAAC;CACF;AAED,SAAS,eAAe,CACtB,KAAiB,EACjB,EAAU,EACV,GAA+B;IAE/B,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,GAAG,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,gEAAgE;gBAC9D,gEAAgE,CACnE,CAAC;QACJ,CAAC;QACD,OAAO;YACL,YAAY,EAAE;gBACZ,QAAQ,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE;aACvE;SACF,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,GAAG,qBAAqB,EAAE,CAAC;IACzC,IAAI,GAAG,EAAE,SAAS,EAAE,CAAC;QACnB,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,gBAAgB,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;IAEnF,OAAO;QACL,gBAAgB;QAChB,YAAY,EAAE;YACZ,QAAQ,EAAE;gBACR,CAAC,oBAAoB,CAAC,EAAE;oBACtB,WAAW,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC;iBACnE;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAA8B,UAAU,CAAC,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"vpc-builder.js","sourceRoot":"","sources":["../../src/vpc-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAiB,MAAM,qBAAqB,CAAC;AAI7E,OAAO,EAAuB,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAyB,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAmFjD,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAE9C,MAAM,UAAU;IACd,KAAK,GAA6B,EAAE,CAAC;IAErC,KAAK,CAAC,KAAiB,EAAE,EAAU;QACjC,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE7D,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;QAEtF,2EAA2E;QAC3E,wEAAwE;QACxE,qDAAqD;QACrD,MAAM,aAAa,GAAG,QAAQ,CAAC,iBAAiB,KAAK,SAAS,CAAC;QAC/D,IAAI,aAAa,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,eAAe,EAAE,iEAAiE;gBAChF,yCAAyC,CAC5C,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG;YAClB,GAAG,YAAY;YACf,GAAG,YAAY;YACf,GAAG,QAAQ;SACZ,CAAC;QACF,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,WAAW,CAAC,MAAM,CAAC;QAC5B,CAAC;QAED,OAAO;YACL,GAAG,EAAE,IAAI,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC;YACpC,gBAAgB;SACjB,CAAC;IACJ,CAAC;CACF;AAED,SAAS,eAAe,CACtB,KAAiB,EACjB,EAAU,EACV,GAA+B;IAE/B,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,GAAG,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,gEAAgE;gBAC9D,gEAAgE,CACnE,CAAC;QACJ,CAAC;QACD,OAAO;YACL,YAAY,EAAE;gBACZ,QAAQ,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE;aACvE;SACF,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,GAAG,qBAAqB,EAAE,CAAC;IACzC,IAAI,GAAG,EAAE,SAAS,EAAE,CAAC;QACnB,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,gBAAgB,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;IAEnF,OAAO;QACL,gBAAgB;QAChB,YAAY,EAAE;YACZ,QAAQ,EAAE;gBACR,CAAC,oBAAoB,CAAC,EAAE;oBACtB,WAAW,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC;iBACnE;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAA8B,UAAU,CAAC,CAAC;AAChE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@composurecdk/ec2",
3
- "version": "0.8.3",
3
+ "version": "0.8.5",
4
4
  "description": "Composable EC2 instance and VPC builders with well-architected defaults",
5
5
  "repository": {
6
6
  "type": "git",
@@ -20,7 +20,18 @@
20
20
  "test": "vitest run --passWithNoTests",
21
21
  "test:watch": "vitest"
22
22
  },
23
- "keywords": [],
23
+ "keywords": [
24
+ "aws",
25
+ "cdk",
26
+ "aws-cdk",
27
+ "infrastructure-as-code",
28
+ "iac",
29
+ "composurecdk",
30
+ "ec2",
31
+ "vpc",
32
+ "networking",
33
+ "compute"
34
+ ],
24
35
  "author": "Jason Duffett (https://github.com/laazyj)",
25
36
  "license": "MIT",
26
37
  "publishConfig": {
@@ -45,11 +56,11 @@
45
56
  "constructs": "^10.0.0"
46
57
  },
47
58
  "devDependencies": {
48
- "@types/node": "^25.9.1",
49
- "aws-cdk-lib": "^2.257.0",
59
+ "@types/node": "^25.9.3",
60
+ "aws-cdk-lib": "^2.258.1",
50
61
  "constructs": "^10.6.0",
51
62
  "typescript": "^6.0.2",
52
- "vitest": "^4.1.7"
63
+ "vitest": "^4.1.8"
53
64
  },
54
65
  "exports": {
55
66
  "./package.json": "./package.json",