@venturekit/infra 0.0.40 → 0.0.41

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 (39) hide show
  1. package/README.md +91 -0
  2. package/dist/cdk/app-stack.d.ts +15 -0
  3. package/dist/cdk/app-stack.d.ts.map +1 -1
  4. package/dist/cdk/app-stack.js +16 -0
  5. package/dist/cdk/app-stack.js.map +1 -1
  6. package/dist/cdk/compute-stack.d.ts +146 -0
  7. package/dist/cdk/compute-stack.d.ts.map +1 -0
  8. package/dist/cdk/compute-stack.js +485 -0
  9. package/dist/cdk/compute-stack.js.map +1 -0
  10. package/dist/cdk/config-stack.d.ts.map +1 -1
  11. package/dist/cdk/config-stack.js +14 -0
  12. package/dist/cdk/config-stack.js.map +1 -1
  13. package/dist/cdk/data-stack.d.ts.map +1 -1
  14. package/dist/cdk/data-stack.js +30 -14
  15. package/dist/cdk/data-stack.js.map +1 -1
  16. package/dist/cdk/edge-stack.d.ts.map +1 -1
  17. package/dist/cdk/edge-stack.js +42 -6
  18. package/dist/cdk/edge-stack.js.map +1 -1
  19. package/dist/cdk/index.d.ts +7 -1
  20. package/dist/cdk/index.d.ts.map +1 -1
  21. package/dist/cdk/index.js +7 -1
  22. package/dist/cdk/index.js.map +1 -1
  23. package/dist/cdk/services-stack.d.ts +143 -0
  24. package/dist/cdk/services-stack.d.ts.map +1 -0
  25. package/dist/cdk/services-stack.js +562 -0
  26. package/dist/cdk/services-stack.js.map +1 -0
  27. package/dist/cdk/shared/service-alarms.d.ts +83 -0
  28. package/dist/cdk/shared/service-alarms.d.ts.map +1 -0
  29. package/dist/cdk/shared/service-alarms.js +180 -0
  30. package/dist/cdk/shared/service-alarms.js.map +1 -0
  31. package/dist/cdk/shared/ssm-keys.d.ts +104 -0
  32. package/dist/cdk/shared/ssm-keys.d.ts.map +1 -1
  33. package/dist/cdk/shared/ssm-keys.js +56 -0
  34. package/dist/cdk/shared/ssm-keys.js.map +1 -1
  35. package/dist/venture.d.ts +23 -1
  36. package/dist/venture.d.ts.map +1 -1
  37. package/dist/venture.js +52 -0
  38. package/dist/venture.js.map +1 -1
  39. package/package.json +2 -2
@@ -0,0 +1,485 @@
1
+ /**
2
+ * Tier — Compute stack: the pools `services[]` run on (`compute[]`).
3
+ *
4
+ * One ECS cluster per pool, and per `kind`:
5
+ *
6
+ * - `instance` — the machines every service of the pool runs on: an Auto
7
+ * Scaling group of `instances.min`–`max` (the preset's `machines.count`
8
+ * by default) behind an explicit launch template (a launch
9
+ * *configuration* is deprecated and refused in accounts opened after
10
+ * June 2024), in the private subnets unless `placement: 'public'`, a
11
+ * capacity provider the cluster knows them by, a security group that is
12
+ * every service's door (tasks use the host's network), and a private
13
+ * hosted zone for their names. Operators reach a machine through SSM
14
+ * Session Manager: no key pair, no open port.
15
+ *
16
+ * What fronts the machines is decided by the services' ports:
17
+ * - any `public` port → an internet-facing Network Load Balancer with an
18
+ * Elastic IP per AZ — the fixed addresses devices are configured
19
+ * with — the group as instance target, client addresses preserved;
20
+ * - any `shared` port, or a `vpc` port of a named service on a pool of
21
+ * several machines → an internal Network Load Balancer, and, for the
22
+ * shared ports, a VPC Endpoint Service other ventures reach through
23
+ * a private link.
24
+ * A pool of one machine with neither is just the machine: the zone's
25
+ * wildcard record points at its private IP, registered at boot. The zone
26
+ * exists for names — a pool none of whose services declares `dns` has
27
+ * none.
28
+ * - `serverless` — the cluster and, for named services, a Cloud Map private
29
+ * DNS namespace on the same zone name; the services tier registers each
30
+ * task's name in it.
31
+ *
32
+ * # Why the pool knows the services
33
+ *
34
+ * On an `instance` pool the machines' security group admits what the
35
+ * services' ports declare, the balancers' listeners are those ports, the
36
+ * machines' disks carry the services' persistent volumes, and the machines —
37
+ * not a task — are what the databases they use admit. So this stack reads
38
+ * `services[]` too, for the pool's sake only; the tasks themselves are the
39
+ * services tier's.
40
+ *
41
+ * # Lifecycle position
42
+ *
43
+ * Rarely updated: a size, a count, a disk. The balancer's Elastic IPs are the
44
+ * external contract — units in the field are configured with them — hence
45
+ * `retainAddress` (default: retained under strict data safety).
46
+ *
47
+ * # Public surface (via SSM)
48
+ *
49
+ * - `computeKeys.clusterName / privateZoneName` per pool;
50
+ * - `computeKeys.capacityProviderName / instanceSecurityGroupId /
51
+ * alarmTopicArn` per instance pool;
52
+ * - `computeKeys.loadBalancerDnsName / addresses` when the pool has a
53
+ * public balancer, `internalLoadBalancerDnsName / endpointServiceName`
54
+ * when it has an internal one / an endpoint service.
55
+ */
56
+ import * as cdk from 'aws-cdk-lib';
57
+ import * as autoscaling from 'aws-cdk-lib/aws-autoscaling';
58
+ import * as ec2 from 'aws-cdk-lib/aws-ec2';
59
+ import * as ecs from 'aws-cdk-lib/aws-ecs';
60
+ import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
61
+ import * as iam from 'aws-cdk-lib/aws-iam';
62
+ import * as route53 from 'aws-cdk-lib/aws-route53';
63
+ import * as route53Targets from 'aws-cdk-lib/aws-route53-targets';
64
+ import * as servicediscovery from 'aws-cdk-lib/aws-servicediscovery';
65
+ import { DATA_SAFETY_CONFIG, architectureOf, assertValid, poolMachineCount, validateComputeAndServices, } from '@venturekit/core';
66
+ import { writeSsm } from './shared/cross-stack-refs.js';
67
+ import { computeKeys } from './shared/ssm-keys.js';
68
+ import { ServiceAlarms } from './shared/service-alarms.js';
69
+ /** Memory the ECS agent keeps for the operating system and itself on an instance pool, MiB. */
70
+ export const INSTANCE_RESERVED_MEMORY_MIB = 384;
71
+ /** Where an instance pool keeps the services' persistent volumes: `<root>/<service>/<volume>`. */
72
+ export const INSTANCE_VOLUME_ROOT = '/var/lib/venturekit';
73
+ /** The zone services are named under when the pool gives none. */
74
+ export function defaultPrivateZone(projectName, stage) {
75
+ return `${stage}.${projectName}.internal`;
76
+ }
77
+ /** The host path of a service's persistent volume on an instance pool. */
78
+ export function instanceVolumePath(serviceId, volume) {
79
+ return `${INSTANCE_VOLUME_ROOT}/${serviceId}/${volume}`;
80
+ }
81
+ /** The pool a service is on: its own `compute`, else the first declared. */
82
+ export function poolOf(service, compute) {
83
+ return service.compute === undefined ? compute[0] : compute.find((p) => p.id === service.compute);
84
+ }
85
+ /** The instance type of a pool: spelled out on the intent, else the stage's table for its `size`. */
86
+ export function instanceTypeOf(intent, envConfig) {
87
+ return intent.instanceType ?? envConfig.machines.sizes[intent.size ?? 'medium'];
88
+ }
89
+ export class VentureComputeStack extends cdk.Stack {
90
+ /** In-process handles for the services tier, keyed by pool id. */
91
+ pools = new Map();
92
+ isStrictRetain;
93
+ constructor(scope, id, props) {
94
+ super(scope, id, props);
95
+ const { projectName, stage, envConfig, infrastructure, vpc } = props;
96
+ assertValid(validateComputeAndServices(infrastructure));
97
+ this.isStrictRetain = DATA_SAFETY_CONFIG[envConfig.dataSafety].removalPolicy === 'retain';
98
+ const compute = infrastructure.compute ?? [];
99
+ const services = (infrastructure.services ?? []).filter((s) => !s.external);
100
+ for (const intent of compute) {
101
+ const onPool = services.filter((s) => poolOf(s, compute)?.id === intent.id);
102
+ const pool = intent.kind === 'instance'
103
+ ? this.createInstancePool(intent, onPool, props)
104
+ : this.createServerlessPool(intent, onPool, projectName, stage, vpc);
105
+ this.pools.set(intent.id, pool);
106
+ writeSsm(this, computeKeys.clusterName(projectName, stage, intent.id), pool.cluster.clusterName, {
107
+ description: `ECS cluster of compute pool '${intent.id}' (${intent.kind}).`,
108
+ });
109
+ if (pool.hasZone) {
110
+ writeSsm(this, computeKeys.privateZoneName(projectName, stage, intent.id), pool.zoneName, {
111
+ description: `Private DNS zone services on pool '${intent.id}' are named under; resolves inside the VPC only.`,
112
+ });
113
+ new cdk.CfnOutput(this, `Pool${logicalSuffix(intent.id)}Zone`, {
114
+ value: pool.zoneName,
115
+ description: `*.${pool.zoneName} names the services of pool ${intent.id}, inside the VPC`,
116
+ });
117
+ }
118
+ }
119
+ }
120
+ createServerlessPool(intent, onPool, projectName, stage, vpc) {
121
+ const name = `${projectName}-${stage}-${intent.id}`;
122
+ const zoneName = intent.privateZone ?? defaultPrivateZone(projectName, stage);
123
+ // Container Insights is a per-metric bill; the services' log groups say what their tasks are doing.
124
+ const cluster = new ecs.Cluster(this, `Cluster${logicalSuffix(intent.id)}`, {
125
+ vpc,
126
+ clusterName: name,
127
+ containerInsightsV2: ecs.ContainerInsights.DISABLED,
128
+ });
129
+ const namespace = onPool.some((s) => s.dns)
130
+ ? new servicediscovery.PrivateDnsNamespace(this, `Namespace${logicalSuffix(intent.id)}`, {
131
+ name: zoneName,
132
+ vpc,
133
+ description: `${name}: the services of the pool, by name, for the venture's Lambdas`,
134
+ })
135
+ : undefined;
136
+ return {
137
+ intent,
138
+ kind: 'serverless',
139
+ architecture: intent.architecture ?? 'arm64',
140
+ cluster,
141
+ zoneName,
142
+ hasZone: namespace !== undefined,
143
+ machines: { min: 0, max: 0 },
144
+ namespace,
145
+ addresses: [],
146
+ targetGroups: new Map(),
147
+ sharedPorts: [],
148
+ };
149
+ }
150
+ createInstancePool(intent, onPool, props) {
151
+ const { projectName, stage, envConfig, vpc } = props;
152
+ const name = `${projectName}-${stage}-${intent.id}`;
153
+ const suffix = logicalSuffix(intent.id);
154
+ const instanceType = instanceTypeOf(intent, envConfig);
155
+ const architecture = architectureOf(instanceType);
156
+ const zoneName = intent.privateZone ?? defaultPrivateZone(projectName, stage);
157
+ const machines = poolMachineCount(intent, envConfig.machines.count);
158
+ const fleet = machines.max > 1;
159
+ const placement = intent.placement ?? 'private';
160
+ const swapMiB = intent.swapMiB ?? 0;
161
+ const retainAddresses = intent.retainAddress ?? this.isStrictRetain;
162
+ const addressPolicy = retainAddresses ? cdk.RemovalPolicy.RETAIN : cdk.RemovalPolicy.DESTROY;
163
+ // ── The ports, from the services ─────────────────────────────────
164
+ const ports = [];
165
+ for (const service of onPool) {
166
+ for (const container of service.containers ?? []) {
167
+ for (const p of container.ports ?? []) {
168
+ if (p.expose && p.expose !== 'none')
169
+ ports.push({ serviceId: service.id, containerName: container.name, port: p.port, expose: p.expose, from: p.from ?? [], tls: p.tls });
170
+ }
171
+ }
172
+ }
173
+ const publicPorts = ports.filter((p) => p.expose === 'public');
174
+ const sharedPorts = ports.filter((p) => p.expose === 'shared');
175
+ const vpcPorts = ports.filter((p) => p.expose === 'vpc');
176
+ const named = new Set(onPool.filter((s) => s.dns).map((s) => s.id));
177
+ // On several machines a name has to be a balancer's; a vpc port of a named service is a listener on the internal one.
178
+ const internalListeners = [...sharedPorts, ...(fleet ? vpcPorts.filter((p) => named.has(p.serviceId)) : [])];
179
+ const healthOf = (serviceId) => onPool.find((s) => s.id === serviceId)?.health;
180
+ // ── The door ─────────────────────────────────────────────────────
181
+ // Tasks use the host's network, so this group is every service's:
182
+ // what their ports declare, and nothing else. Public ports admit their
183
+ // ranges (a balancer preserves the client's address) and the VPC (the
184
+ // balancer's own health checks and TLS-terminated traffic come from
185
+ // inside it); vpc and shared ports admit the VPC; health ports admit
186
+ // the VPC. Operators come in through Session Manager, which needs no
187
+ // port.
188
+ const securityGroup = new ec2.SecurityGroup(this, `InstanceSg${suffix}`, {
189
+ vpc,
190
+ description: `${name}: the services' declared ports, nothing else`,
191
+ allowAllOutbound: true,
192
+ });
193
+ const vpcRange = ec2.Peer.ipv4(vpc.vpcCidrBlock);
194
+ // EC2 rule descriptions reject apostrophes — a-zA-Z0-9. _-:/()#,@[]+=&;{}!$* only.
195
+ for (const p of ports) {
196
+ if (p.expose === 'public') {
197
+ for (const cidr of p.from)
198
+ securityGroup.addIngressRule(ec2.Peer.ipv4(cidr), ec2.Port.tcp(p.port), `${p.serviceId}/${p.containerName} :${p.port} from ${cidr}`);
199
+ }
200
+ securityGroup.addIngressRule(vpcRange, ec2.Port.tcp(p.port), `${p.serviceId}/${p.containerName} :${p.port} from the VPC`);
201
+ }
202
+ for (const service of onPool) {
203
+ if (service.health)
204
+ securityGroup.addIngressRule(vpcRange, ec2.Port.tcp(service.health.port), `${service.id} health checks :${service.health.port} from the VPC`);
205
+ }
206
+ // The machines, once, for every task on them — the rule lands in THIS
207
+ // stack against the imported group, the way the app stack admits its Lambdas.
208
+ const databases = new Set(onPool.map((s) => s.database).filter((d) => d !== undefined));
209
+ for (const dbId of databases) {
210
+ const conn = props.databaseConnectionsById?.get(dbId);
211
+ if (!conn) {
212
+ throw new Error(`[venturekit] compute stack: a service on pool '${intent.id}' declares database '${dbId}' ` +
213
+ `but databaseConnectionsById has no entry for it. The CLI generator must wire dataStack.databases into VentureComputeStackProps.`);
214
+ }
215
+ const dbSg = ec2.SecurityGroup.fromSecurityGroupId(this, `ImportedDbSg${suffix}-${dbId}`, conn.securityGroupId, { mutable: true });
216
+ dbSg.connections.allowFrom(securityGroup, ec2.Port.tcp(conn.port), `Allow ${name} to connect to db ${dbId}`);
217
+ }
218
+ // ── The machines ─────────────────────────────────────────────────
219
+ // The zone exists for names: none of the services named, none needed.
220
+ const zone = named.size > 0
221
+ ? new route53.PrivateHostedZone(this, `Zone${suffix}`, {
222
+ zoneName,
223
+ vpc,
224
+ comment: `${name}: the services on the machines, by name`,
225
+ })
226
+ : undefined;
227
+ const cluster = new ecs.Cluster(this, `Cluster${suffix}`, {
228
+ vpc,
229
+ clusterName: name,
230
+ containerInsightsV2: ecs.ContainerInsights.DISABLED,
231
+ });
232
+ const role = new iam.Role(this, `InstanceRole${suffix}`, {
233
+ assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
234
+ description: `${name}: what a machine may do for itself; the ECS agent's permissions come from the capacity provider`,
235
+ });
236
+ const launchTemplate = new ec2.LaunchTemplate(this, `LaunchTemplate${suffix}`, {
237
+ instanceType: new ec2.InstanceType(instanceType),
238
+ machineImage: ecs.EcsOptimizedImage.amazonLinux2023(architecture === 'arm64' ? ecs.AmiHardwareType.ARM : ecs.AmiHardwareType.STANDARD),
239
+ securityGroup,
240
+ role,
241
+ userData: ec2.UserData.forLinux(),
242
+ requireImdsv2: true,
243
+ // Private machines have no public address at all and leave through the VPC's NAT.
244
+ associatePublicIpAddress: placement === 'public',
245
+ blockDevices: [
246
+ {
247
+ deviceName: '/dev/xvda',
248
+ volume: ec2.BlockDeviceVolume.ebs(intent.diskGiB ?? envConfig.machines.diskGiB, {
249
+ volumeType: ec2.EbsDeviceVolumeType.GP3,
250
+ encrypted: true,
251
+ deleteOnTermination: true,
252
+ }),
253
+ },
254
+ ],
255
+ });
256
+ const group = new autoscaling.AutoScalingGroup(this, `Group${suffix}`, {
257
+ vpc,
258
+ vpcSubnets: { subnetType: placement === 'public' ? ec2.SubnetType.PUBLIC : ec2.SubnetType.PRIVATE_WITH_EGRESS },
259
+ launchTemplate,
260
+ minCapacity: machines.min,
261
+ maxCapacity: machines.max,
262
+ desiredCapacity: machines.min,
263
+ // Free, and what the no-instance alarm reads.
264
+ groupMetrics: [autoscaling.GroupMetrics.all()],
265
+ // A new AMI or user data replaces the machines one at a time; a pool of
266
+ // several keeps all but one in service throughout, a pool of one comes
267
+ // back on the replacement within minutes.
268
+ updatePolicy: autoscaling.UpdatePolicy.rollingUpdate({ minInstancesInService: fleet ? machines.min - 1 : 0, maxBatchSize: 1 }),
269
+ newInstancesProtectedFromScaleIn: false,
270
+ });
271
+ // What a machine may do for itself: be reached through Session Manager,
272
+ // and — alone on its pool — publish its name. Everything the ECS agent
273
+ // needs is granted by the capacity provider below.
274
+ group.role.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'));
275
+ if (zone && !fleet) {
276
+ group.role.addToPrincipalPolicy(new iam.PolicyStatement({
277
+ sid: 'PublishTheName',
278
+ actions: ['route53:ChangeResourceRecordSets'],
279
+ resources: [zone.hostedZoneArn],
280
+ }));
281
+ }
282
+ const volumePaths = onPool.flatMap((s) => (s.volumes ?? []).filter((v) => v.persistent).map((v) => instanceVolumePath(s.id, v.name)));
283
+ group.addUserData('set -euo pipefail',
284
+ // The ECS agent: the OS's share is not the tasks'.
285
+ `echo ECS_RESERVED_MEMORY=${INSTANCE_RESERVED_MEMORY_MIB} >> /etc/ecs/ecs.config`, 'echo ECS_ENABLE_CONTAINER_METADATA=true >> /etc/ecs/ecs.config', ...(swapMiB > 0
286
+ ? [`fallocate -l ${swapMiB}M /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile && echo '/swapfile none swap sw 0 0' >> /etc/fstab`]
287
+ : []), ...volumePaths.map((p) => `mkdir -p ${p} && chmod 0777 ${p}`), ...(!zone || fleet
288
+ ? []
289
+ : [
290
+ // Alone on the pool, the machine is the name: every service on it, under the pool's zone (IMDSv2).
291
+ `TOKEN=$(curl -sS -X PUT http://169.254.169.254/latest/api/token -H 'X-aws-ec2-metadata-token-ttl-seconds: 60')`,
292
+ `PRIVATE_IP=$(curl -sS -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/local-ipv4)`,
293
+ `aws route53 change-resource-record-sets --hosted-zone-id ${zone.hostedZoneId} --change-batch "{\\"Changes\\":[{\\"Action\\":\\"UPSERT\\",\\"ResourceRecordSet\\":{\\"Name\\":\\"*.${zoneName}.\\",\\"Type\\":\\"A\\",\\"TTL\\":60,\\"ResourceRecords\\":[{\\"Value\\":\\"$PRIVATE_IP\\"}]}}]}"`,
294
+ ]));
295
+ const capacityProvider = new ecs.AsgCapacityProvider(this, `Capacity${suffix}`, {
296
+ capacityProviderName: `${name}-machines`,
297
+ autoScalingGroup: group,
298
+ // The count is the intent's; nothing scales the group.
299
+ enableManagedScaling: false,
300
+ enableManagedTerminationProtection: false,
301
+ machineImageType: ecs.MachineImageType.AMAZON_LINUX_2,
302
+ });
303
+ cluster.addAsgCapacityProvider(capacityProvider);
304
+ // ── What fronts them ─────────────────────────────────────────────
305
+ const targetGroups = new Map();
306
+ const targetGroupFor = (p, preserveClientIp) => {
307
+ const existing = targetGroups.get(p.port);
308
+ if (existing)
309
+ return existing;
310
+ const health = healthOf(p.serviceId);
311
+ const targetGroup = new elbv2.NetworkTargetGroup(this, `Targets${suffix}${p.port}`, {
312
+ vpc,
313
+ port: p.port,
314
+ protocol: elbv2.Protocol.TCP,
315
+ targetType: elbv2.TargetType.INSTANCE,
316
+ preserveClientIp,
317
+ // A client whose machine is going away should reconnect now, not when its keepalive notices.
318
+ connectionTermination: true,
319
+ deregistrationDelay: cdk.Duration.seconds(30),
320
+ healthCheck: health
321
+ ? { protocol: elbv2.Protocol.HTTP, path: health.path, port: String(health.port), interval: cdk.Duration.seconds(10), timeout: cdk.Duration.seconds(5), healthyThresholdCount: 2, unhealthyThresholdCount: 2 }
322
+ : { protocol: elbv2.Protocol.TCP, interval: cdk.Duration.seconds(10), healthyThresholdCount: 2, unhealthyThresholdCount: 2 },
323
+ });
324
+ targetGroup.addTarget(group);
325
+ targetGroups.set(p.port, targetGroup);
326
+ return targetGroup;
327
+ };
328
+ let publicLoadBalancer;
329
+ const addresses = [];
330
+ if (publicPorts.length > 0) {
331
+ const balancerSg = new ec2.SecurityGroup(this, `PublicBalancerSg${suffix}`, {
332
+ vpc,
333
+ description: `${name} public balancer: the public ports from their ranges, TLS doors from anywhere`,
334
+ allowAllOutbound: true,
335
+ });
336
+ for (const p of publicPorts) {
337
+ for (const cidr of p.from)
338
+ balancerSg.addIngressRule(ec2.Peer.ipv4(cidr), ec2.Port.tcp(p.port), `${p.serviceId}/${p.containerName} :${p.port} from ${cidr}`);
339
+ if (p.tls)
340
+ balancerSg.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(p.tls.port ?? 443), `${p.serviceId}/${p.containerName} TLS to :${p.port}`);
341
+ if (p.from.length === 0) {
342
+ cdk.Annotations.of(this).addWarningV2(`venturekit:compute:public-port-closed:${p.serviceId}:${p.port}`, `${name}: port ${p.port} of ${p.serviceId}/${p.containerName} is public with no ranges in 'from', so it admits nobody. List the ranges that may reach it.`);
343
+ }
344
+ }
345
+ vpc.publicSubnets.forEach((_, i) => {
346
+ const address = new ec2.CfnEIP(this, `Address${suffix}${i + 1}`, { domain: 'vpc', tags: [{ key: 'Name', value: `${name}-${i + 1}` }] });
347
+ address.applyRemovalPolicy(addressPolicy);
348
+ addresses.push(address);
349
+ });
350
+ publicLoadBalancer = new elbv2.NetworkLoadBalancer(this, `PublicBalancer${suffix}`, {
351
+ vpc,
352
+ loadBalancerName: `${name}-pub`.slice(0, 32),
353
+ internetFacing: true,
354
+ // One machine in one AZ must be reachable through every address.
355
+ crossZoneEnabled: true,
356
+ securityGroups: [balancerSg],
357
+ subnetMappings: vpc.publicSubnets.map((subnet, i) => ({ subnet, allocationId: addresses[i].attrAllocationId })),
358
+ });
359
+ for (const p of publicPorts) {
360
+ const targetGroup = targetGroupFor(p, true);
361
+ publicLoadBalancer.addListener(`Listener${suffix}${p.port}`, { port: p.port, protocol: elbv2.Protocol.TCP, defaultTargetGroups: [targetGroup] });
362
+ if (p.tls) {
363
+ publicLoadBalancer.addListener(`Tls${suffix}${p.port}`, {
364
+ port: p.tls.port ?? 443,
365
+ protocol: elbv2.Protocol.TLS,
366
+ certificates: [elbv2.ListenerCertificate.fromArn(p.tls.certificateArn)],
367
+ sslPolicy: elbv2.SslPolicy.RECOMMENDED_TLS,
368
+ defaultTargetGroups: [targetGroup],
369
+ });
370
+ }
371
+ }
372
+ }
373
+ let internalLoadBalancer;
374
+ let endpointService;
375
+ if (internalListeners.length > 0) {
376
+ // No group on the internal balancer: a private link's traffic arrives
377
+ // from AWS, not from an address a rule could name; the machines' group
378
+ // is the door (it admits the VPC on these ports, which is where the
379
+ // balancer's addresses are).
380
+ internalLoadBalancer = new elbv2.NetworkLoadBalancer(this, `InternalBalancer${suffix}`, {
381
+ vpc,
382
+ loadBalancerName: `${name}-int`.slice(0, 32),
383
+ internetFacing: false,
384
+ vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS },
385
+ crossZoneEnabled: true,
386
+ });
387
+ const seen = new Set();
388
+ for (const p of internalListeners) {
389
+ if (seen.has(p.port))
390
+ continue;
391
+ seen.add(p.port);
392
+ // Client addresses cannot be preserved through a private link; the machines see the balancer's.
393
+ internalLoadBalancer.addListener(`Internal${suffix}${p.port}`, { port: p.port, protocol: elbv2.Protocol.TCP, defaultTargetGroups: [targetGroupFor(p, false)] });
394
+ }
395
+ if (zone && fleet) {
396
+ new route53.ARecord(this, `ZoneAlias${suffix}`, {
397
+ zone,
398
+ recordName: `*.${zoneName}`,
399
+ target: route53.RecordTarget.fromAlias(new route53Targets.LoadBalancerTarget(internalLoadBalancer)),
400
+ comment: `${name}: every named service on the pool, through the internal balancer`,
401
+ });
402
+ }
403
+ if (sharedPorts.length > 0) {
404
+ // Other ventures of this account connect their interface endpoints
405
+ // here; no acceptance step, the account is the boundary.
406
+ endpointService = new ec2.VpcEndpointService(this, `EndpointService${suffix}`, {
407
+ vpcEndpointServiceLoadBalancers: [internalLoadBalancer],
408
+ acceptanceRequired: false,
409
+ allowedPrincipals: [new iam.ArnPrincipal(`arn:${this.partition}:iam::${this.account}:root`)],
410
+ });
411
+ }
412
+ }
413
+ // ── Who hears when the machines are gone ─────────────────────────
414
+ const alarms = new ServiceAlarms(this, `Alarms${suffix}`, { name, email: intent.alarms?.email });
415
+ alarms.instanceOut(group, `${name} (the machines every service of the pool runs on)`, machines.min);
416
+ // ── Public surface ───────────────────────────────────────────────
417
+ writeSsm(this, computeKeys.capacityProviderName(projectName, stage, intent.id), capacityProvider.capacityProviderName, {
418
+ description: `Capacity provider a service names to land on pool '${intent.id}''s machines.`,
419
+ });
420
+ writeSsm(this, computeKeys.instanceSecurityGroupId(projectName, stage, intent.id), securityGroup.securityGroupId, {
421
+ description: `Security group of pool '${intent.id}''s machines — every service on them uses the host network, so this is their door.`,
422
+ });
423
+ writeSsm(this, computeKeys.alarmTopicArn(projectName, stage, intent.id), alarms.topic.topicArn, {
424
+ description: `SNS topic pool '${intent.id}''s machine alarms ring.`,
425
+ });
426
+ if (publicLoadBalancer) {
427
+ writeSsm(this, computeKeys.loadBalancerDnsName(projectName, stage, intent.id), publicLoadBalancer.loadBalancerDnsName, {
428
+ description: `Internet-facing balancer in front of pool '${intent.id}''s public ports — a CNAME target.`,
429
+ });
430
+ writeSsm(this, computeKeys.addresses(projectName, stage, intent.id), cdk.Fn.join(',', addresses.map((a) => a.ref)), {
431
+ description: `Fixed public addresses of pool '${intent.id}' (one per AZ) — what devices are configured with.`,
432
+ });
433
+ }
434
+ if (internalLoadBalancer) {
435
+ writeSsm(this, computeKeys.internalLoadBalancerDnsName(projectName, stage, intent.id), internalLoadBalancer.loadBalancerDnsName, {
436
+ description: `Internal balancer in front of pool '${intent.id}''s shared and named ports; resolves inside the VPC only.`,
437
+ });
438
+ }
439
+ if (endpointService) {
440
+ writeSsm(this, computeKeys.endpointServiceName(projectName, stage, intent.id), endpointService.vpcEndpointServiceName, {
441
+ description: `Endpoint service other ventures connect an interface endpoint to, for pool '${intent.id}''s shared ports.`,
442
+ });
443
+ }
444
+ new cdk.CfnOutput(this, `Pool${suffix}Machines`, { value: `${machines.min}–${machines.max} × ${instanceType} (${architecture}), ${placement} subnets` });
445
+ if (publicLoadBalancer) {
446
+ new cdk.CfnOutput(this, `Pool${suffix}Addresses`, {
447
+ value: cdk.Fn.join(', ', addresses.map((a) => a.ref)),
448
+ description: 'One Elastic IP per AZ — point the public hostname at them, or a CNAME at the balancer name',
449
+ });
450
+ new cdk.CfnOutput(this, `Pool${suffix}LoadBalancerDnsName`, { value: publicLoadBalancer.loadBalancerDnsName });
451
+ }
452
+ if (endpointService) {
453
+ new cdk.CfnOutput(this, `Pool${suffix}EndpointService`, { value: endpointService.vpcEndpointServiceName, description: 'What a consumer venture names in services[].external (resolved from SSM for it)' });
454
+ }
455
+ new cdk.CfnOutput(this, `Pool${suffix}Shell`, {
456
+ value: `aws ssm start-session --region ${this.region} --target <instance id from: aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names ${group.autoScalingGroupName}>`,
457
+ description: 'A shell on a machine, no key pair, no open port',
458
+ });
459
+ return {
460
+ intent,
461
+ kind: 'instance',
462
+ architecture,
463
+ cluster,
464
+ zoneName,
465
+ hasZone: zone !== undefined,
466
+ machines,
467
+ capacityProvider,
468
+ publicLoadBalancer,
469
+ addresses,
470
+ internalLoadBalancer,
471
+ endpointService,
472
+ targetGroups,
473
+ sharedPorts: [...new Set(sharedPorts.map((p) => p.port))],
474
+ };
475
+ }
476
+ }
477
+ /** `my-pool` → `MyPool`, for construct ids. */
478
+ function logicalSuffix(id) {
479
+ return id
480
+ .split(/[^a-zA-Z0-9]+/)
481
+ .filter(Boolean)
482
+ .map((part) => part[0].toUpperCase() + part.slice(1))
483
+ .join('');
484
+ }
485
+ //# sourceMappingURL=compute-stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-stack.js","sourceRoot":"","sources":["../../src/cdk/compute-stack.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-stack.d.ts","sourceRoot":"","sources":["../../src/cdk/config-stack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFG;AAEH,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,GAAG,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,cAAc,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAuC1B,MAAM,WAAW,uBAAwB,SAAQ,GAAG,CAAC,UAAU;IAC7D,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAC;IAEpB,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IAEd,yCAAyC;IACzC,SAAS,EAAE,SAAS,CAAC;IAErB;;;OAGG;IACH,cAAc,EAAE,aAAa,CAAC;CAC/B;AAED,qBAAa,kBAAmB,SAAQ,GAAG,CAAC,KAAK;IAC/C,wDAAwD;IACxD,SAAgB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAa;IAExE,gDAAgD;IAChD,SAAgB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,eAAe,CAAC,CAAa;IAEzE,yEAAyE;IACzE,SAAgB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAa;IAE/E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;gBAE7B,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB;IAiBxE;;;;;;;;;OASG;IACH,OAAO,CAAC,mBAAmB;IA+C3B,OAAO,CAAC,YAAY;CAsErB"}
1
+ {"version":3,"file":"config-stack.d.ts","sourceRoot":"","sources":["../../src/cdk/config-stack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFG;AAEH,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,GAAG,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,cAAc,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAuC1B,MAAM,WAAW,uBAAwB,SAAQ,GAAG,CAAC,UAAU;IAC7D,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAC;IAEpB,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IAEd,yCAAyC;IACzC,SAAS,EAAE,SAAS,CAAC;IAErB;;;OAGG;IACH,cAAc,EAAE,aAAa,CAAC;CAC/B;AAED,qBAAa,kBAAmB,SAAQ,GAAG,CAAC,KAAK;IAC/C,wDAAwD;IACxD,SAAgB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAa;IAExE,gDAAgD;IAChD,SAAgB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,eAAe,CAAC,CAAa;IAEzE,yEAAyE;IACzE,SAAgB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAa;IAE/E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;gBAE7B,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB;IAiBxE;;;;;;;;;OASG;IACH,OAAO,CAAC,mBAAmB;IA+C3B,OAAO,CAAC,YAAY;CAoFrB"}
@@ -194,12 +194,26 @@ export class VentureConfigStack extends cdk.Stack {
194
194
  const isStrictRetain = this.isStrictRetain;
195
195
  const resourceName = `${projectName}-${intent.id}`;
196
196
  if (intent.store === 'secretsmanager') {
197
+ // `generate` shapes the initial random value for a secret that is
198
+ // used as generated rather than pasted over — a key shared between
199
+ // a service container and the Lambdas that call it. Absent, the
200
+ // CloudFormation default (32 characters, punctuation included)
201
+ // applies, exactly as before.
202
+ const generateSecretString = intent.generate
203
+ ? {
204
+ passwordLength: intent.generate.length ?? 32,
205
+ excludePunctuation: intent.generate.punctuation === false,
206
+ includeSpace: false,
207
+ requireEachIncludedType: false,
208
+ }
209
+ : undefined;
197
210
  const secret = new secretsmanager.Secret(this, resourceName, {
198
211
  // Operator-namespace name (no `venturekit/` prefix) — gives
199
212
  // the operator a recognizable name in the SM console
200
213
  // independent of internal SSM key conventions.
201
214
  secretName: `${projectName}/${stage}/${intent.id}`,
202
215
  description: intent.description || `Secret for ${intent.id}`,
216
+ ...(generateSecretString ? { generateSecretString } : {}),
203
217
  // Operator-paste-in values can't be re-generated by
204
218
  // VentureKit; an accidental delete forces the operator to
205
219
  // manually rotate the credential at the third party. RETAIN
@@ -1 +1 @@
1
- {"version":3,"file":"config-stack.js","sourceRoot":"","sources":["../../src/cdk/config-stack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-stack.js","sourceRoot":"","sources":["../../src/cdk/config-stack.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-stack.d.ts","sourceRoot":"","sources":["../../src/cdk/data-stack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-stack.d.ts","sourceRoot":"","sources":["../../src/cdk/data-stack.ts"],"names":[],"mappings":"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"}