@composurecdk/ec2 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commonjs/index.d.ts.map +1 -0
- package/dist/commonjs/index.js +22 -0
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/instance-alarm-config.d.ts.map +1 -0
- package/dist/commonjs/instance-alarm-config.js +3 -0
- package/dist/commonjs/instance-alarm-config.js.map +1 -0
- package/dist/commonjs/instance-alarm-defaults.d.ts.map +1 -0
- package/dist/commonjs/instance-alarm-defaults.js +65 -0
- package/dist/commonjs/instance-alarm-defaults.js.map +1 -0
- package/dist/commonjs/instance-alarms.d.ts.map +1 -0
- package/dist/commonjs/instance-alarms.js +132 -0
- package/dist/commonjs/instance-alarms.js.map +1 -0
- package/dist/commonjs/instance-builder.d.ts.map +1 -0
- package/dist/commonjs/instance-builder.js +135 -0
- package/dist/commonjs/instance-builder.js.map +1 -0
- package/dist/commonjs/instance-defaults.d.ts.map +1 -0
- package/dist/commonjs/instance-defaults.js +62 -0
- package/dist/commonjs/instance-defaults.js.map +1 -0
- package/dist/commonjs/instance-volume-attachment-config.d.ts.map +1 -0
- package/dist/commonjs/instance-volume-attachment-config.js +3 -0
- package/dist/commonjs/instance-volume-attachment-config.js.map +1 -0
- package/dist/commonjs/instance-volume-attachment-defaults.d.ts.map +1 -0
- package/dist/commonjs/instance-volume-attachment-defaults.js +27 -0
- package/dist/commonjs/instance-volume-attachment-defaults.js.map +1 -0
- package/dist/commonjs/instance-volume-attachments.d.ts.map +1 -0
- package/dist/commonjs/instance-volume-attachments.js +107 -0
- package/dist/commonjs/instance-volume-attachments.js.map +1 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/commonjs/volume-alarm-config.d.ts.map +1 -0
- package/dist/commonjs/volume-alarm-config.js +3 -0
- package/dist/commonjs/volume-alarm-config.js.map +1 -0
- package/dist/commonjs/volume-alarm-defaults.d.ts.map +1 -0
- package/dist/commonjs/volume-alarm-defaults.js +30 -0
- package/dist/commonjs/volume-alarm-defaults.js.map +1 -0
- package/dist/commonjs/volume-alarms.d.ts.map +1 -0
- package/dist/commonjs/volume-alarms.js +92 -0
- package/dist/commonjs/volume-alarms.js.map +1 -0
- package/dist/commonjs/volume-builder.d.ts.map +1 -0
- package/dist/commonjs/volume-builder.js +98 -0
- package/dist/commonjs/volume-builder.js.map +1 -0
- package/dist/commonjs/volume-defaults.d.ts.map +1 -0
- package/dist/commonjs/volume-defaults.js +50 -0
- package/dist/commonjs/volume-defaults.js.map +1 -0
- package/dist/commonjs/vpc-builder.d.ts.map +1 -0
- package/dist/commonjs/vpc-builder.js +82 -0
- package/dist/commonjs/vpc-builder.js.map +1 -0
- package/dist/commonjs/vpc-defaults.d.ts.map +1 -0
- package/dist/commonjs/vpc-defaults.js +58 -0
- package/dist/commonjs/vpc-defaults.js.map +1 -0
- package/dist/esm/index.d.ts +14 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/instance-alarm-config.d.ts +62 -0
- package/dist/esm/instance-alarm-config.d.ts.map +1 -0
- package/dist/esm/instance-alarm-config.js.map +1 -0
- package/dist/esm/instance-alarm-defaults.d.ts +20 -0
- package/dist/esm/instance-alarm-defaults.d.ts.map +1 -0
- package/dist/esm/instance-alarm-defaults.js.map +1 -0
- package/dist/esm/instance-alarms.d.ts +28 -0
- package/dist/esm/instance-alarms.d.ts.map +1 -0
- package/dist/esm/instance-alarms.js.map +1 -0
- package/dist/esm/instance-builder.d.ts +223 -0
- package/dist/esm/instance-builder.d.ts.map +1 -0
- package/dist/esm/instance-builder.js.map +1 -0
- package/dist/esm/instance-defaults.d.ts +14 -0
- package/dist/esm/instance-defaults.d.ts.map +1 -0
- package/dist/esm/instance-defaults.js.map +1 -0
- package/dist/esm/instance-volume-attachment-config.d.ts +34 -0
- package/dist/esm/instance-volume-attachment-config.d.ts.map +1 -0
- package/dist/esm/instance-volume-attachment-config.js.map +1 -0
- package/dist/esm/instance-volume-attachment-defaults.d.ts +14 -0
- package/dist/esm/instance-volume-attachment-defaults.d.ts.map +1 -0
- package/dist/esm/instance-volume-attachment-defaults.js.map +1 -0
- package/dist/esm/instance-volume-attachments.d.ts +59 -0
- package/dist/esm/instance-volume-attachments.d.ts.map +1 -0
- package/dist/esm/instance-volume-attachments.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/volume-alarm-config.d.ts +35 -0
- package/dist/esm/volume-alarm-config.d.ts.map +1 -0
- package/dist/esm/volume-alarm-config.js.map +1 -0
- package/dist/esm/volume-alarm-defaults.d.ts +17 -0
- package/dist/esm/volume-alarm-defaults.d.ts.map +1 -0
- package/dist/esm/volume-alarm-defaults.js.map +1 -0
- package/dist/esm/volume-alarms.d.ts +29 -0
- package/dist/esm/volume-alarms.d.ts.map +1 -0
- package/dist/esm/volume-alarms.js.map +1 -0
- package/dist/esm/volume-builder.d.ts +171 -0
- package/dist/esm/volume-builder.d.ts.map +1 -0
- package/dist/esm/volume-builder.js.map +1 -0
- package/dist/esm/volume-defaults.d.ts +15 -0
- package/dist/esm/volume-defaults.d.ts.map +1 -0
- package/dist/esm/volume-defaults.js.map +1 -0
- package/dist/esm/vpc-builder.d.ts +110 -0
- package/dist/esm/vpc-builder.d.ts.map +1 -0
- package/dist/esm/vpc-builder.js.map +1 -0
- package/dist/esm/vpc-defaults.d.ts +15 -0
- package/dist/esm/vpc-defaults.d.ts.map +1 -0
- package/dist/esm/vpc-defaults.js.map +1 -0
- package/package.json +36 -18
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/instance-alarm-config.d.ts.map +0 -1
- package/dist/instance-alarm-config.js.map +0 -1
- package/dist/instance-alarm-defaults.d.ts.map +0 -1
- package/dist/instance-alarm-defaults.js.map +0 -1
- package/dist/instance-alarms.d.ts.map +0 -1
- package/dist/instance-alarms.js.map +0 -1
- package/dist/instance-builder.d.ts.map +0 -1
- package/dist/instance-builder.js.map +0 -1
- package/dist/instance-defaults.d.ts.map +0 -1
- package/dist/instance-defaults.js.map +0 -1
- package/dist/instance-volume-attachment-config.d.ts.map +0 -1
- package/dist/instance-volume-attachment-config.js.map +0 -1
- package/dist/instance-volume-attachment-defaults.d.ts.map +0 -1
- package/dist/instance-volume-attachment-defaults.js.map +0 -1
- package/dist/instance-volume-attachments.d.ts.map +0 -1
- package/dist/instance-volume-attachments.js.map +0 -1
- package/dist/volume-alarm-config.d.ts.map +0 -1
- package/dist/volume-alarm-config.js.map +0 -1
- package/dist/volume-alarm-defaults.d.ts.map +0 -1
- package/dist/volume-alarm-defaults.js.map +0 -1
- package/dist/volume-alarms.d.ts.map +0 -1
- package/dist/volume-alarms.js.map +0 -1
- package/dist/volume-builder.d.ts.map +0 -1
- package/dist/volume-builder.js.map +0 -1
- package/dist/volume-defaults.d.ts.map +0 -1
- package/dist/volume-defaults.js.map +0 -1
- package/dist/vpc-builder.d.ts.map +0 -1
- package/dist/vpc-builder.js.map +0 -1
- package/dist/vpc-defaults.d.ts.map +0 -1
- package/dist/vpc-defaults.js.map +0 -1
- /package/dist/{index.d.ts → commonjs/index.d.ts} +0 -0
- /package/dist/{instance-alarm-config.d.ts → commonjs/instance-alarm-config.d.ts} +0 -0
- /package/dist/{instance-alarm-defaults.d.ts → commonjs/instance-alarm-defaults.d.ts} +0 -0
- /package/dist/{instance-alarms.d.ts → commonjs/instance-alarms.d.ts} +0 -0
- /package/dist/{instance-builder.d.ts → commonjs/instance-builder.d.ts} +0 -0
- /package/dist/{instance-defaults.d.ts → commonjs/instance-defaults.d.ts} +0 -0
- /package/dist/{instance-volume-attachment-config.d.ts → commonjs/instance-volume-attachment-config.d.ts} +0 -0
- /package/dist/{instance-volume-attachment-defaults.d.ts → commonjs/instance-volume-attachment-defaults.d.ts} +0 -0
- /package/dist/{instance-volume-attachments.d.ts → commonjs/instance-volume-attachments.d.ts} +0 -0
- /package/dist/{volume-alarm-config.d.ts → commonjs/volume-alarm-config.d.ts} +0 -0
- /package/dist/{volume-alarm-defaults.d.ts → commonjs/volume-alarm-defaults.d.ts} +0 -0
- /package/dist/{volume-alarms.d.ts → commonjs/volume-alarms.d.ts} +0 -0
- /package/dist/{volume-builder.d.ts → commonjs/volume-builder.d.ts} +0 -0
- /package/dist/{volume-defaults.d.ts → commonjs/volume-defaults.d.ts} +0 -0
- /package/dist/{vpc-builder.d.ts → commonjs/vpc-builder.d.ts} +0 -0
- /package/dist/{vpc-defaults.d.ts → commonjs/vpc-defaults.d.ts} +0 -0
- /package/dist/{index.js → esm/index.js} +0 -0
- /package/dist/{instance-alarm-config.js → esm/instance-alarm-config.js} +0 -0
- /package/dist/{instance-alarm-defaults.js → esm/instance-alarm-defaults.js} +0 -0
- /package/dist/{instance-alarms.js → esm/instance-alarms.js} +0 -0
- /package/dist/{instance-builder.js → esm/instance-builder.js} +0 -0
- /package/dist/{instance-defaults.js → esm/instance-defaults.js} +0 -0
- /package/dist/{instance-volume-attachment-config.js → esm/instance-volume-attachment-config.js} +0 -0
- /package/dist/{instance-volume-attachment-defaults.js → esm/instance-volume-attachment-defaults.js} +0 -0
- /package/dist/{instance-volume-attachments.js → esm/instance-volume-attachments.js} +0 -0
- /package/dist/{volume-alarm-config.js → esm/volume-alarm-config.js} +0 -0
- /package/dist/{volume-alarm-defaults.js → esm/volume-alarm-defaults.js} +0 -0
- /package/dist/{volume-alarms.js → esm/volume-alarms.js} +0 -0
- /package/dist/{volume-builder.js → esm/volume-builder.js} +0 -0
- /package/dist/{volume-defaults.js → esm/volume-defaults.js} +0 -0
- /package/dist/{vpc-builder.js → esm/vpc-builder.js} +0 -0
- /package/dist/{vpc-defaults.js → esm/vpc-defaults.js} +0 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createVolumeAttachments = createVolumeAttachments;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
6
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
7
|
+
const core_1 = require("@composurecdk/core");
|
|
8
|
+
const cloudwatch_1 = require("@composurecdk/cloudwatch");
|
|
9
|
+
const instance_volume_attachment_defaults_js_1 = require("./instance-volume-attachment-defaults.js");
|
|
10
|
+
const STALLED_IO_PERIOD = aws_cdk_lib_1.Duration.minutes(1);
|
|
11
|
+
const STALLED_IO_PERIOD_LABEL = `${String(STALLED_IO_PERIOD.toMinutes())} minute`;
|
|
12
|
+
function resolveInstanceAz(instanceProps) {
|
|
13
|
+
if (instanceProps.availabilityZone && !aws_cdk_lib_1.Token.isUnresolved(instanceProps.availabilityZone)) {
|
|
14
|
+
return instanceProps.availabilityZone;
|
|
15
|
+
}
|
|
16
|
+
let selected;
|
|
17
|
+
try {
|
|
18
|
+
selected = instanceProps.vpc.selectSubnets(instanceProps.vpcSubnets);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// selectSubnets() throws for several unrelated reasons (no matching subnets,
|
|
22
|
+
// unresolved tokens, etc.). The validation is best-effort — if we can't
|
|
23
|
+
// resolve a concrete AZ, fall through and let CFN surface the real failure.
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
return selected.availabilityZones.find((az) => !aws_cdk_lib_1.Token.isUnresolved(az));
|
|
27
|
+
}
|
|
28
|
+
function unwrapVolume(resolved) {
|
|
29
|
+
if ("volumeId" in resolved) {
|
|
30
|
+
return resolved;
|
|
31
|
+
}
|
|
32
|
+
return resolved.volume;
|
|
33
|
+
}
|
|
34
|
+
function volumeAttachmentMetric(volume, instance, metricName, statistic, period) {
|
|
35
|
+
return new aws_cloudwatch_1.Metric({
|
|
36
|
+
namespace: "AWS/EBS",
|
|
37
|
+
metricName,
|
|
38
|
+
dimensionsMap: {
|
|
39
|
+
VolumeId: volume.volumeId,
|
|
40
|
+
InstanceId: instance.instanceId,
|
|
41
|
+
},
|
|
42
|
+
statistic,
|
|
43
|
+
period,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function resolveVolumeAttachmentAlarmDefinitions(attachmentKey, volume, instance, config) {
|
|
47
|
+
if (config === false)
|
|
48
|
+
return [];
|
|
49
|
+
const enabled = config?.enabled ?? instance_volume_attachment_defaults_js_1.VOLUME_ATTACHMENT_ALARM_DEFAULTS.enabled;
|
|
50
|
+
if (!enabled)
|
|
51
|
+
return [];
|
|
52
|
+
if (config?.volumeStalledIo === false)
|
|
53
|
+
return [];
|
|
54
|
+
const cfg = (0, cloudwatch_1.resolveAlarmConfig)(config?.volumeStalledIo, instance_volume_attachment_defaults_js_1.VOLUME_ATTACHMENT_ALARM_DEFAULTS.volumeStalledIo);
|
|
55
|
+
return [
|
|
56
|
+
{
|
|
57
|
+
key: `${attachmentKey}.volumeStalledIo`,
|
|
58
|
+
alarmName: cfg.alarmName,
|
|
59
|
+
metric: volumeAttachmentMetric(volume, instance, "VolumeStalledIOCheck", aws_cloudwatch_1.Stats.MAXIMUM, STALLED_IO_PERIOD),
|
|
60
|
+
threshold: cfg.threshold,
|
|
61
|
+
comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
|
|
62
|
+
evaluationPeriods: cfg.evaluationPeriods,
|
|
63
|
+
datapointsToAlarm: cfg.datapointsToAlarm,
|
|
64
|
+
treatMissingData: cfg.treatMissingData,
|
|
65
|
+
description: `EBS volume attachment "${attachmentKey}" is reporting a stalled I/O condition. ` +
|
|
66
|
+
`Threshold: >= ${String(cfg.threshold)} (max) over ${String(cfg.evaluationPeriods)} x ${STALLED_IO_PERIOD_LABEL}. ` +
|
|
67
|
+
`Note: VolumeStalledIOCheck is published only for Nitro-instance attachments.`,
|
|
68
|
+
},
|
|
69
|
+
];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Creates a {@link CfnVolumeAttachment} for each pending attachment and
|
|
73
|
+
* (when configured) the per-attachment recommended alarms. Synth-time AZ
|
|
74
|
+
* alignment is validated when both the volume's AZ and the instance's
|
|
75
|
+
* effective AZ are concrete strings.
|
|
76
|
+
*
|
|
77
|
+
* @returns The created `CfnVolumeAttachment`s keyed by attachment key,
|
|
78
|
+
* plus the per-attachment alarms keyed by `${attachmentKey}.${alarmKey}`
|
|
79
|
+
* so they can be flat-merged into the instance's `alarms` record.
|
|
80
|
+
*/
|
|
81
|
+
function createVolumeAttachments(scope, id, instance, instanceProps, attachments, context) {
|
|
82
|
+
const attachmentRecords = {};
|
|
83
|
+
const alarmDefinitions = [];
|
|
84
|
+
// Resolve the instance AZ once — it is the same for every attachment.
|
|
85
|
+
const instanceAz = attachments.length > 0 ? resolveInstanceAz(instanceProps) : undefined;
|
|
86
|
+
for (const pending of attachments) {
|
|
87
|
+
const resolved = (0, core_1.resolve)(pending.volumeRef, context);
|
|
88
|
+
const volume = unwrapVolume(resolved);
|
|
89
|
+
if (instanceAz !== undefined && !aws_cdk_lib_1.Token.isUnresolved(volume.availabilityZone)) {
|
|
90
|
+
if (volume.availabilityZone !== instanceAz) {
|
|
91
|
+
throw new Error(`attachVolume "${pending.key}": volume is in availability zone "${volume.availabilityZone}" ` +
|
|
92
|
+
`but the instance is in "${instanceAz}". ` +
|
|
93
|
+
`EBS volumes can only attach to instances in the same AZ.`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const attachment = new aws_ec2_1.CfnVolumeAttachment(scope, `${id}${pending.key}Attachment`, {
|
|
97
|
+
device: pending.options.device,
|
|
98
|
+
instanceId: instance.instanceId,
|
|
99
|
+
volumeId: volume.volumeId,
|
|
100
|
+
});
|
|
101
|
+
attachmentRecords[pending.key] = attachment;
|
|
102
|
+
alarmDefinitions.push(...resolveVolumeAttachmentAlarmDefinitions(pending.key, volume, instance, pending.options.recommendedAlarms));
|
|
103
|
+
}
|
|
104
|
+
const alarms = alarmDefinitions.length > 0 ? (0, cloudwatch_1.createAlarms)(scope, id, alarmDefinitions) : {};
|
|
105
|
+
return { attachments: attachmentRecords, alarms };
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=instance-volume-attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-volume-attachments.js","sourceRoot":"","sources":["../../src/instance-volume-attachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume-alarm-config.d.ts","sourceRoot":"","sources":["../../src/volume-alarm-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;;;;;;;OAeG;IACH,YAAY,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CACpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume-alarm-config.js","sourceRoot":"","sources":["../../src/volume-alarm-config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume-alarm-defaults.d.ts","sourceRoot":"","sources":["../../src/volume-alarm-defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,UAAU,mBAAmB;IAC3B,OAAO,EAAE,IAAI,CAAC;IACd,YAAY,EAAE,mBAAmB,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,EAAE,mBAgBnC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VOLUME_ALARM_DEFAULTS = void 0;
|
|
4
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
5
|
+
/**
|
|
6
|
+
* AWS-recommended default alarm configuration for EBS volumes.
|
|
7
|
+
*
|
|
8
|
+
* Thresholds are sourced from the CloudWatch Best Practice Recommended
|
|
9
|
+
* Alarms guide. Thresholds may reasonably be tuned per-workload; defaults
|
|
10
|
+
* bias toward catching obvious issues without excessive noise.
|
|
11
|
+
*
|
|
12
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#EBS
|
|
13
|
+
*/
|
|
14
|
+
exports.VOLUME_ALARM_DEFAULTS = {
|
|
15
|
+
enabled: true,
|
|
16
|
+
/**
|
|
17
|
+
* Burst credit balance is a percentage. Below 20% the volume is
|
|
18
|
+
* approaching throttling to baseline performance — early warning to
|
|
19
|
+
* upsize, switch to a non-burstable type (e.g. `gp3`), or investigate
|
|
20
|
+
* unexpectedly heavy I/O. The 3-of-3 evaluation at 5-minute granularity
|
|
21
|
+
* suppresses transient dips around backup windows.
|
|
22
|
+
*/
|
|
23
|
+
burstBalance: {
|
|
24
|
+
threshold: 20,
|
|
25
|
+
evaluationPeriods: 3,
|
|
26
|
+
datapointsToAlarm: 3,
|
|
27
|
+
treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=volume-alarm-defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume-alarm-defaults.js","sourceRoot":"","sources":["../../src/volume-alarm-defaults.ts"],"names":[],"mappings":";;;AAAA,+DAA8D;AAQ9D;;;;;;;;GAQG;AACU,QAAA,qBAAqB,GAAwB;IACxD,OAAO,EAAE,IAAI;IAEb;;;;;;OAMG;IACH,YAAY,EAAE;QACZ,SAAS,EAAE,EAAE;QACb,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,iCAAgB,CAAC,aAAa;KACjD;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume-alarms.d.ts","sourceRoot":"","sources":["../../src/volume-alarms.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAqC,MAAM,4BAA4B,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAgB,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAoC,MAAM,0BAA0B,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AA4ClE;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB,GAAG,SAAS,EACrC,UAAU,EAAE,mBAAmB,GAAG,SAAS,GAC1C,eAAe,EAAE,CAqBnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB,GAAG,KAAK,GAAG,SAAS,EAC7C,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAC3C,YAAY,GAAE,sBAAsB,CAAC,MAAM,CAAC,EAAO,GAClD,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAUvB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveVolumeAlarmDefinitions = resolveVolumeAlarmDefinitions;
|
|
4
|
+
exports.createVolumeAlarms = createVolumeAlarms;
|
|
5
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
7
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
8
|
+
const cloudwatch_1 = require("@composurecdk/cloudwatch");
|
|
9
|
+
const volume_alarm_defaults_js_1 = require("./volume-alarm-defaults.js");
|
|
10
|
+
/**
|
|
11
|
+
* BurstBalance is published at 5-minute granularity for burstable volume
|
|
12
|
+
* types. A shorter period yields missing data rather than higher resolution.
|
|
13
|
+
*
|
|
14
|
+
* @see https://docs.aws.amazon.com/ebs/latest/userguide/using_cloudwatch_ebs.html
|
|
15
|
+
*/
|
|
16
|
+
const BURST_METRIC_PERIOD = aws_cdk_lib_1.Duration.minutes(5);
|
|
17
|
+
const BURST_METRIC_PERIOD_LABEL = `${String(BURST_METRIC_PERIOD.toMinutes())} minute`;
|
|
18
|
+
/**
|
|
19
|
+
* EBS volume types that publish a `BurstBalance` metric. `gp2` accrues IOPS
|
|
20
|
+
* credits; `st1` and `sc1` accrue throughput credits. Other types
|
|
21
|
+
* (`gp3`, `io1`, `io2`, `standard`) have no burst credit model.
|
|
22
|
+
*
|
|
23
|
+
* @see https://docs.aws.amazon.com/ebs/latest/userguide/using_cloudwatch_ebs.html
|
|
24
|
+
*/
|
|
25
|
+
const BURSTABLE_VOLUME_TYPES = new Set([
|
|
26
|
+
aws_ec2_1.EbsDeviceVolumeType.GP2,
|
|
27
|
+
aws_ec2_1.EbsDeviceVolumeType.ST1,
|
|
28
|
+
aws_ec2_1.EbsDeviceVolumeType.SC1,
|
|
29
|
+
]);
|
|
30
|
+
function isBurstableVolumeType(volumeType) {
|
|
31
|
+
return volumeType !== undefined && BURSTABLE_VOLUME_TYPES.has(volumeType);
|
|
32
|
+
}
|
|
33
|
+
function volumeMetric(volume, metricName, statistic, period) {
|
|
34
|
+
return new aws_cloudwatch_1.Metric({
|
|
35
|
+
namespace: "AWS/EBS",
|
|
36
|
+
metricName,
|
|
37
|
+
dimensionsMap: { VolumeId: volume.volumeId },
|
|
38
|
+
statistic,
|
|
39
|
+
period,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolves the recommended alarm configuration into fully-resolved
|
|
44
|
+
* {@link AlarmDefinition}s, applying contextual logic for the
|
|
45
|
+
* burstable-only credit alarm.
|
|
46
|
+
*/
|
|
47
|
+
function resolveVolumeAlarmDefinitions(volume, config, volumeType) {
|
|
48
|
+
if (config?.enabled === false)
|
|
49
|
+
return [];
|
|
50
|
+
const definitions = [];
|
|
51
|
+
if (config?.burstBalance !== false && isBurstableVolumeType(volumeType)) {
|
|
52
|
+
const cfg = (0, cloudwatch_1.resolveAlarmConfig)(config?.burstBalance, volume_alarm_defaults_js_1.VOLUME_ALARM_DEFAULTS.burstBalance);
|
|
53
|
+
definitions.push({
|
|
54
|
+
key: "burstBalance",
|
|
55
|
+
alarmName: cfg.alarmName,
|
|
56
|
+
metric: volumeMetric(volume, "BurstBalance", aws_cloudwatch_1.Stats.AVERAGE, BURST_METRIC_PERIOD),
|
|
57
|
+
threshold: cfg.threshold,
|
|
58
|
+
comparisonOperator: aws_cloudwatch_1.ComparisonOperator.LESS_THAN_THRESHOLD,
|
|
59
|
+
evaluationPeriods: cfg.evaluationPeriods,
|
|
60
|
+
datapointsToAlarm: cfg.datapointsToAlarm,
|
|
61
|
+
treatMissingData: cfg.treatMissingData,
|
|
62
|
+
description: `EBS burstable volume burst credit balance is low — baseline-IOPS throttling is imminent. Threshold: < ${String(cfg.threshold)}% (average) over ${String(cfg.evaluationPeriods)} x ${BURST_METRIC_PERIOD_LABEL}.`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return definitions;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Creates AWS-recommended CloudWatch alarms for an EBS volume,
|
|
69
|
+
* merging recommended definitions with any custom alarm builders.
|
|
70
|
+
*
|
|
71
|
+
* @param scope - CDK construct scope for creating alarm constructs.
|
|
72
|
+
* @param id - Base identifier for alarm construct ids.
|
|
73
|
+
* @param volume - The EBS volume to create alarms for.
|
|
74
|
+
* @param config - User-provided alarm configuration, or `false` to disable all.
|
|
75
|
+
* @param volumeType - Resolved volume type, used to gate the contextual
|
|
76
|
+
* burst-balance alarm.
|
|
77
|
+
* @param customAlarms - Custom alarm builders added via `addAlarm()`.
|
|
78
|
+
* @returns A record mapping alarm keys to their created Alarm constructs.
|
|
79
|
+
*
|
|
80
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#EBS
|
|
81
|
+
*/
|
|
82
|
+
function createVolumeAlarms(scope, id, volume, config, volumeType, customAlarms = []) {
|
|
83
|
+
if (config === false)
|
|
84
|
+
return {};
|
|
85
|
+
const enabled = config?.enabled ?? volume_alarm_defaults_js_1.VOLUME_ALARM_DEFAULTS.enabled;
|
|
86
|
+
if (!enabled)
|
|
87
|
+
return {};
|
|
88
|
+
const recommended = resolveVolumeAlarmDefinitions(volume, config, volumeType);
|
|
89
|
+
const custom = customAlarms.map((b) => b.resolve(volume));
|
|
90
|
+
return (0, cloudwatch_1.createAlarms)(scope, id, [...recommended, ...custom]);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=volume-alarms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume-alarms.js","sourceRoot":"","sources":["../../src/volume-alarms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume-builder.d.ts","sourceRoot":"","sources":["../../src/volume-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAChD,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;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAIlE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAC9C,WAAW,EACX,kBAAkB,GAAG,eAAe,CACrC;IACC;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAEjC;;;;;;;;;;;;;;;;OAgBG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAC;CAC/C;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IAEf;;;;;;;;;;;OAWG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;AAE/E,cAAM,aAAc,YAAW,SAAS,CAAC,mBAAmB,CAAC;;IAC3D,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAM;IAIxC;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,gBAAgB,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI;IAK5D;;;;;;;;OAQG;IACH,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,MAAM,CAAC,KAAK,sBAAsB,CAAC,MAAM,CAAC,GACnF,IAAI;IAKP,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAKzC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,mBAAmB;CAkC5F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,CAEpD"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createVolumeBuilder = createVolumeBuilder;
|
|
4
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
5
|
+
const core_1 = require("@composurecdk/core");
|
|
6
|
+
const cloudformation_1 = require("@composurecdk/cloudformation");
|
|
7
|
+
const cloudwatch_1 = require("@composurecdk/cloudwatch");
|
|
8
|
+
const volume_alarms_js_1 = require("./volume-alarms.js");
|
|
9
|
+
const volume_defaults_js_1 = require("./volume-defaults.js");
|
|
10
|
+
class VolumeBuilder {
|
|
11
|
+
props = {};
|
|
12
|
+
#customAlarms = [];
|
|
13
|
+
#availabilityZone;
|
|
14
|
+
/**
|
|
15
|
+
* Sets the Availability Zone the volume will be created in.
|
|
16
|
+
*
|
|
17
|
+
* Accepts a concrete AZ string or a {@link Ref} that resolves to one at
|
|
18
|
+
* build time. This is how cross-component wiring works — e.g., to a
|
|
19
|
+
* sibling {@link IVpcBuilder} via
|
|
20
|
+
* `ref<VpcBuilderResult>("network").map(r => r.vpc.availabilityZones[0])`.
|
|
21
|
+
*
|
|
22
|
+
* @param availabilityZone - The AZ string or a Ref to one.
|
|
23
|
+
* @returns This builder for chaining.
|
|
24
|
+
*/
|
|
25
|
+
availabilityZone(availabilityZone) {
|
|
26
|
+
this.#availabilityZone = availabilityZone;
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Adds a custom CloudWatch alarm to be created alongside the recommended
|
|
31
|
+
* alarms. The provided callback receives an {@link AlarmDefinitionBuilder}
|
|
32
|
+
* scoped to the built {@link Volume}; configure it fluently and return it.
|
|
33
|
+
*
|
|
34
|
+
* @param key - A unique key for the alarm (used to generate the alarm id).
|
|
35
|
+
* @param configure - Callback that configures the alarm definition.
|
|
36
|
+
* @returns This builder for chaining.
|
|
37
|
+
*/
|
|
38
|
+
addAlarm(key, configure) {
|
|
39
|
+
this.#customAlarms.push(configure(new cloudwatch_1.AlarmDefinitionBuilder(key)));
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
/** @internal — see ADR-0005. */
|
|
43
|
+
[core_1.COPY_STATE](target) {
|
|
44
|
+
target.#availabilityZone = this.#availabilityZone;
|
|
45
|
+
target.#customAlarms.push(...this.#customAlarms);
|
|
46
|
+
}
|
|
47
|
+
build(scope, id, context) {
|
|
48
|
+
const resolvedAz = this.#availabilityZone
|
|
49
|
+
? (0, core_1.resolve)(this.#availabilityZone, context)
|
|
50
|
+
: undefined;
|
|
51
|
+
if (resolvedAz === undefined) {
|
|
52
|
+
throw new Error(`VolumeBuilder "${id}" requires an availability zone. ` +
|
|
53
|
+
`Call .availabilityZone() with a string or a Ref to one.`);
|
|
54
|
+
}
|
|
55
|
+
const { recommendedAlarms: alarmConfig, encryptionKey, ...volumeProps } = this.props;
|
|
56
|
+
const mergedProps = {
|
|
57
|
+
...volume_defaults_js_1.VOLUME_DEFAULTS,
|
|
58
|
+
...volumeProps,
|
|
59
|
+
availabilityZone: resolvedAz,
|
|
60
|
+
...(encryptionKey !== undefined ? { encryptionKey: (0, core_1.resolve)(encryptionKey, context) } : {}),
|
|
61
|
+
};
|
|
62
|
+
const volume = new aws_ec2_1.Volume(scope, id, mergedProps);
|
|
63
|
+
const alarms = (0, volume_alarms_js_1.createVolumeAlarms)(scope, id, volume, alarmConfig, mergedProps.volumeType, this.#customAlarms);
|
|
64
|
+
return { volume, alarms };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Creates a new {@link IVolumeBuilder} for configuring an AWS EBS volume.
|
|
69
|
+
*
|
|
70
|
+
* This is the entry point for defining an EBS volume component. The
|
|
71
|
+
* returned builder exposes every {@link VolumeBuilderProps} property as a
|
|
72
|
+
* fluent setter/getter, plus
|
|
73
|
+
* {@link IVolumeBuilder.availabilityZone | .availabilityZone()} for
|
|
74
|
+
* cross-component AZ wiring with Ref support. It implements
|
|
75
|
+
* {@link Lifecycle} for use with {@link compose}.
|
|
76
|
+
*
|
|
77
|
+
* @returns A fluent builder for an AWS EBS volume.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```ts
|
|
81
|
+
* const data = createVolumeBuilder()
|
|
82
|
+
* .availabilityZone(ref<VpcBuilderResult>("network").map(r => r.vpc.availabilityZones[0]))
|
|
83
|
+
* .size(Size.gibibytes(50));
|
|
84
|
+
*
|
|
85
|
+
* // Use standalone:
|
|
86
|
+
* const result = data.build(stack, "Data", { network });
|
|
87
|
+
*
|
|
88
|
+
* // Or compose into a system:
|
|
89
|
+
* const system = compose(
|
|
90
|
+
* { network: createVpcBuilder(), data },
|
|
91
|
+
* { network: [], data: ["network"] },
|
|
92
|
+
* );
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
function createVolumeBuilder() {
|
|
96
|
+
return (0, cloudformation_1.taggedBuilder)(VolumeBuilder);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=volume-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume-builder.js","sourceRoot":"","sources":["../../src/volume-builder.ts"],"names":[],"mappings":";;AAsOA,kDAEC;AAvOD,iDAA+D;AAG/D,6CAA0F;AAC1F,iEAAkF;AAClF,yDAAkE;AAElE,yDAAwD;AACxD,6DAAuD;AAiHvD,MAAM,aAAa;IACjB,KAAK,GAAgC,EAAE,CAAC;IAC/B,aAAa,GAAqC,EAAE,CAAC;IAC9D,iBAAiB,CAAsB;IAEvC;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,gBAAoC;QACnD,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACH,QAAQ,CACN,GAAW,EACX,SAAoF;QAEpF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,mCAAsB,CAAS,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,iBAAU,CAAC,CAAC,MAAqB;QAChC,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAClD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU,EAAE,OAAgC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB;YACvC,CAAC,CAAC,IAAA,cAAO,EAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC;YAC1C,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,kBAAkB,EAAE,mCAAmC;gBACrD,yDAAyD,CAC5D,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAErF,MAAM,WAAW,GAAG;YAClB,GAAG,oCAAe;YAClB,GAAG,WAAW;YACd,gBAAgB,EAAE,UAAU;YAC5B,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAA,cAAO,EAAC,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;QAEjB,MAAM,MAAM,GAAG,IAAI,gBAAM,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,IAAA,qCAAkB,EAC/B,KAAK,EACL,EAAE,EACF,MAAM,EACN,WAAW,EACX,WAAW,CAAC,UAAU,EACtB,IAAI,CAAC,aAAa,CACnB,CAAC;QAEF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,SAAgB,mBAAmB;IACjC,OAAO,IAAA,8BAAa,EAAoC,aAAa,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume-defaults.d.ts","sourceRoot":"","sources":["../../src/volume-defaults.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE5E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,WAAW,CAkChD,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VOLUME_DEFAULTS = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
6
|
+
/**
|
|
7
|
+
* Secure, AWS-recommended defaults applied to every EBS volume built with
|
|
8
|
+
* {@link createVolumeBuilder}. Each property can be individually overridden
|
|
9
|
+
* via the builder's fluent API.
|
|
10
|
+
*
|
|
11
|
+
* Three properties intentionally have no default — they are application-
|
|
12
|
+
* specific and must be supplied explicitly:
|
|
13
|
+
* - `availabilityZone` (via the builder's `.availabilityZone()` method)
|
|
14
|
+
* - `size`
|
|
15
|
+
* - `iops` / `throughput` (only when opting into a volume type that
|
|
16
|
+
* requires them, e.g. `io1`/`io2`)
|
|
17
|
+
*/
|
|
18
|
+
exports.VOLUME_DEFAULTS = {
|
|
19
|
+
/**
|
|
20
|
+
* GP3 is the current-generation general-purpose SSD — cheaper and faster
|
|
21
|
+
* than GP2 at equivalent sizes, and matches the root-volume choice in
|
|
22
|
+
* {@link INSTANCE_DEFAULTS}.
|
|
23
|
+
* @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/general-purpose.html
|
|
24
|
+
*/
|
|
25
|
+
volumeType: aws_ec2_1.EbsDeviceVolumeType.GP3,
|
|
26
|
+
/**
|
|
27
|
+
* Encrypt the volume at rest. Defaults to the account's default EBS KMS
|
|
28
|
+
* key; pass an `encryptionKey` to use a customer-managed key (CMK) for
|
|
29
|
+
* sensitive workloads per SEC08-BP02.
|
|
30
|
+
* @see https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/sec_protect_data_rest_encrypt.html
|
|
31
|
+
* @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html
|
|
32
|
+
*/
|
|
33
|
+
encrypted: true,
|
|
34
|
+
/**
|
|
35
|
+
* When EBS detects inconsistent data on boot it disables I/O until the
|
|
36
|
+
* operator acknowledges. For a persistent data volume the safer default
|
|
37
|
+
* is to let I/O resume so the instance can come up unattended; override
|
|
38
|
+
* to `false` for workloads that prefer to block on potential corruption.
|
|
39
|
+
* @see https://docs.aws.amazon.com/ebs/latest/userguide/monitoring-volume-events.html
|
|
40
|
+
*/
|
|
41
|
+
autoEnableIo: true,
|
|
42
|
+
/**
|
|
43
|
+
* Mirrors `BUCKET_DEFAULTS.removalPolicy`. A destroyed volume is
|
|
44
|
+
* unrecoverable; an orphaned volume is a $/month nuisance. Err on the
|
|
45
|
+
* side of retention — flip to `DESTROY` explicitly for ephemeral data.
|
|
46
|
+
* @see https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_planning_for_recovery_back_up_data.html
|
|
47
|
+
*/
|
|
48
|
+
removalPolicy: aws_cdk_lib_1.RemovalPolicy.RETAIN,
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=volume-defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume-defaults.js","sourceRoot":"","sources":["../../src/volume-defaults.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAC5C,iDAA4E;AAE5E;;;;;;;;;;;GAWG;AACU,QAAA,eAAe,GAAyB;IACnD;;;;;OAKG;IACH,UAAU,EAAE,6BAAmB,CAAC,GAAG;IAEnC;;;;;;OAMG;IACH,SAAS,EAAE,IAAI;IAEf;;;;;;OAMG;IACH,YAAY,EAAE,IAAI;IAElB;;;;;OAKG;IACH,aAAa,EAAE,2BAAa,CAAC,MAAM;CACpC,CAAC"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createVpcBuilder = createVpcBuilder;
|
|
4
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
5
|
+
const cloudformation_1 = require("@composurecdk/cloudformation");
|
|
6
|
+
const logs_1 = require("@composurecdk/logs");
|
|
7
|
+
const vpc_defaults_js_1 = require("./vpc-defaults.js");
|
|
8
|
+
const DEFAULT_FLOW_LOG_KEY = "DefaultFlowLog";
|
|
9
|
+
class VpcBuilder {
|
|
10
|
+
props = {};
|
|
11
|
+
build(scope, id) {
|
|
12
|
+
const { flowLogs: flowLogsConfig, ...vpcProps } = this.props;
|
|
13
|
+
const { flowLogsLogGroup, flowLogProps } = resolveFlowLogs(scope, id, flowLogsConfig);
|
|
14
|
+
const mergedProps = {
|
|
15
|
+
...vpc_defaults_js_1.VPC_DEFAULTS,
|
|
16
|
+
...flowLogProps,
|
|
17
|
+
...vpcProps,
|
|
18
|
+
};
|
|
19
|
+
return {
|
|
20
|
+
vpc: new aws_ec2_1.Vpc(scope, id, mergedProps),
|
|
21
|
+
flowLogsLogGroup,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function resolveFlowLogs(scope, id, cfg) {
|
|
26
|
+
if (cfg === false) {
|
|
27
|
+
return { flowLogProps: {} };
|
|
28
|
+
}
|
|
29
|
+
if (cfg?.destination !== undefined) {
|
|
30
|
+
if (cfg.configure !== undefined) {
|
|
31
|
+
throw new Error("flowLogs: 'configure' cannot be combined with 'destination' — " +
|
|
32
|
+
"the destination is user-managed and not built by this builder.");
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
flowLogProps: {
|
|
36
|
+
flowLogs: { [DEFAULT_FLOW_LOG_KEY]: { destination: cfg.destination } },
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
let subBuilder = (0, logs_1.createLogGroupBuilder)();
|
|
41
|
+
if (cfg?.configure) {
|
|
42
|
+
subBuilder = cfg.configure(subBuilder);
|
|
43
|
+
}
|
|
44
|
+
const flowLogsLogGroup = subBuilder.build(scope, `${id}FlowLogsLogGroup`).logGroup;
|
|
45
|
+
return {
|
|
46
|
+
flowLogsLogGroup,
|
|
47
|
+
flowLogProps: {
|
|
48
|
+
flowLogs: {
|
|
49
|
+
[DEFAULT_FLOW_LOG_KEY]: {
|
|
50
|
+
destination: aws_ec2_1.FlowLogDestination.toCloudWatchLogs(flowLogsLogGroup),
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Creates a new {@link IVpcBuilder} for configuring an AWS VPC.
|
|
58
|
+
*
|
|
59
|
+
* This is the entry point for defining a VPC component. The returned builder
|
|
60
|
+
* exposes every {@link VpcBuilderProps} property as a fluent setter/getter
|
|
61
|
+
* and implements {@link Lifecycle} for use with {@link compose}.
|
|
62
|
+
*
|
|
63
|
+
* @returns A fluent builder for an AWS VPC.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* const network = createVpcBuilder().maxAzs(3).natGateways(3);
|
|
68
|
+
*
|
|
69
|
+
* // Use standalone:
|
|
70
|
+
* const result = network.build(stack, "Network");
|
|
71
|
+
*
|
|
72
|
+
* // Or compose into a system:
|
|
73
|
+
* const system = compose(
|
|
74
|
+
* { network, server: createInstanceBuilder() },
|
|
75
|
+
* { network: [], server: ["network"] },
|
|
76
|
+
* );
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
function createVpcBuilder() {
|
|
80
|
+
return (0, cloudformation_1.taggedBuilder)(VpcBuilder);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=vpc-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vpc-builder.js","sourceRoot":"","sources":["../../src/vpc-builder.ts"],"names":[],"mappings":";;AAgLA,4CAEC;AAlLD,iDAA6E;AAI7E,iEAAkF;AAClF,6CAAkF;AAClF,uDAAiD;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,8BAAY;YACf,GAAG,YAAY;YACf,GAAG,QAAQ;SACZ,CAAC;QAEF,OAAO;YACL,GAAG,EAAE,IAAI,aAAG,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,IAAA,4BAAqB,GAAE,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,4BAAkB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC;iBACnE;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,SAAgB,gBAAgB;IAC9B,OAAO,IAAA,8BAAa,EAA8B,UAAU,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vpc-defaults.d.ts","sourceRoot":"","sources":["../../src/vpc-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,EAAE,OAAO,CAAC,QAAQ,CA6C1C,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VPC_DEFAULTS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Secure, cost-conscious defaults applied to every VPC built with
|
|
6
|
+
* {@link createVpcBuilder}. Each property can be individually overridden
|
|
7
|
+
* via the builder's fluent API.
|
|
8
|
+
*
|
|
9
|
+
* Subnet layout uses CDK defaults (one public + one private-with-egress
|
|
10
|
+
* subnet per AZ) — override `subnetConfiguration` for custom topologies.
|
|
11
|
+
*
|
|
12
|
+
* Flow logs are created separately by the builder (not via this defaults
|
|
13
|
+
* object) so the destination log group can be auto-managed with
|
|
14
|
+
* well-architected retention/removal policies.
|
|
15
|
+
*/
|
|
16
|
+
exports.VPC_DEFAULTS = {
|
|
17
|
+
/**
|
|
18
|
+
* Two availability zones strike a balance between high availability
|
|
19
|
+
* and cost. Override to 3+ AZs for production workloads that need
|
|
20
|
+
* stricter HA guarantees.
|
|
21
|
+
* @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html
|
|
22
|
+
*/
|
|
23
|
+
maxAzs: 2,
|
|
24
|
+
/**
|
|
25
|
+
* Single NAT gateway is a cost-conscious default. Production HA
|
|
26
|
+
* workloads should override this to match `maxAzs` so a single-AZ
|
|
27
|
+
* NAT failure does not partition private-subnet egress.
|
|
28
|
+
* @see https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html
|
|
29
|
+
*/
|
|
30
|
+
natGateways: 1,
|
|
31
|
+
/**
|
|
32
|
+
* Required for internal DNS resolution for most AWS managed services
|
|
33
|
+
* (ALB, RDS, VPC endpoints). Default-on in AWS but set explicitly for
|
|
34
|
+
* safety across CDK feature-flag configurations.
|
|
35
|
+
* @see https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html
|
|
36
|
+
*/
|
|
37
|
+
enableDnsSupport: true,
|
|
38
|
+
/**
|
|
39
|
+
* Required alongside DNS support for instances to receive public DNS
|
|
40
|
+
* hostnames. Needed for most hostname-based TLS and service discovery
|
|
41
|
+
* scenarios.
|
|
42
|
+
* @see https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html
|
|
43
|
+
*/
|
|
44
|
+
enableDnsHostnames: true,
|
|
45
|
+
/**
|
|
46
|
+
* Strip all rules from the default security group. This prevents
|
|
47
|
+
* accidentally using the default SG (which allows all intra-SG
|
|
48
|
+
* traffic and no ingress) and forces explicit SG design — a
|
|
49
|
+
* foundational well-architected security practice.
|
|
50
|
+
*
|
|
51
|
+
* Also enabled by the `@aws-cdk/aws-ec2:restrictDefaultSecurityGroup`
|
|
52
|
+
* feature flag; we set it explicitly so the guarantee holds regardless
|
|
53
|
+
* of CDK context configuration.
|
|
54
|
+
* @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Vpc.html#restrictdefaultsecuritygroup
|
|
55
|
+
*/
|
|
56
|
+
restrictDefaultSecurityGroup: true,
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=vpc-defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vpc-defaults.js","sourceRoot":"","sources":["../../src/vpc-defaults.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;GAWG;AACU,QAAA,YAAY,GAAsB;IAC7C;;;;;OAKG;IACH,MAAM,EAAE,CAAC;IAET;;;;;OAKG;IACH,WAAW,EAAE,CAAC;IAEd;;;;;OAKG;IACH,gBAAgB,EAAE,IAAI;IAEtB;;;;;OAKG;IACH,kBAAkB,EAAE,IAAI;IAExB;;;;;;;;;;OAUG;IACH,4BAA4B,EAAE,IAAI;CACnC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { createInstanceBuilder, type IInstanceBuilder, type InstanceBuilderProps, type InstanceBuilderResult, } from "./instance-builder.js";
|
|
2
|
+
export { INSTANCE_DEFAULTS } from "./instance-defaults.js";
|
|
3
|
+
export { type InstanceAlarmConfig } from "./instance-alarm-config.js";
|
|
4
|
+
export { INSTANCE_ALARM_DEFAULTS } from "./instance-alarm-defaults.js";
|
|
5
|
+
export { type AttachVolumeOptions } from "./instance-volume-attachments.js";
|
|
6
|
+
export { type VolumeAttachmentAlarmConfig } from "./instance-volume-attachment-config.js";
|
|
7
|
+
export { VOLUME_ATTACHMENT_ALARM_DEFAULTS } from "./instance-volume-attachment-defaults.js";
|
|
8
|
+
export { createVolumeBuilder, type IVolumeBuilder, type VolumeBuilderProps, type VolumeBuilderResult, } from "./volume-builder.js";
|
|
9
|
+
export { VOLUME_DEFAULTS } from "./volume-defaults.js";
|
|
10
|
+
export { type VolumeAlarmConfig } from "./volume-alarm-config.js";
|
|
11
|
+
export { VOLUME_ALARM_DEFAULTS } from "./volume-alarm-defaults.js";
|
|
12
|
+
export { createVpcBuilder, type FlowLogsConfig, type IVpcBuilder, type VpcBuilderProps, type VpcBuilderResult, } from "./vpc-builder.js";
|
|
13
|
+
export { VPC_DEFAULTS } from "./vpc-defaults.js";
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAE5F,OAAO,EACL,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EACL,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAItB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAGvE,OAAO,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAE5F,OAAO,EACL,mBAAmB,GAIpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EACL,gBAAgB,GAKjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|