@composurecdk/s3 0.6.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/alarm-config.d.ts.map +1 -0
- package/dist/commonjs/alarm-config.js +3 -0
- package/dist/{alarm-config.js.map → commonjs/alarm-config.js.map} +1 -1
- package/dist/commonjs/alarm-defaults.d.ts.map +1 -0
- package/dist/commonjs/alarm-defaults.js +27 -0
- package/dist/commonjs/alarm-defaults.js.map +1 -0
- package/dist/commonjs/bucket-alarms.d.ts.map +1 -0
- package/dist/commonjs/bucket-alarms.js +100 -0
- package/dist/commonjs/bucket-alarms.js.map +1 -0
- package/dist/{bucket-builder.d.ts → commonjs/bucket-builder.d.ts} +5 -2
- package/dist/commonjs/bucket-builder.d.ts.map +1 -0
- package/dist/commonjs/bucket-builder.js +118 -0
- package/dist/commonjs/bucket-builder.js.map +1 -0
- package/dist/{bucket-deployment-builder.d.ts → commonjs/bucket-deployment-builder.d.ts} +5 -2
- package/dist/commonjs/bucket-deployment-builder.d.ts.map +1 -0
- package/dist/commonjs/bucket-deployment-builder.js +116 -0
- package/dist/commonjs/bucket-deployment-builder.js.map +1 -0
- package/dist/commonjs/bucket-deployment-defaults.d.ts.map +1 -0
- package/dist/commonjs/bucket-deployment-defaults.js +68 -0
- package/dist/commonjs/bucket-deployment-defaults.js.map +1 -0
- package/dist/commonjs/bucket-deployment-props.d.ts.map +1 -0
- package/dist/commonjs/bucket-deployment-props.js +3 -0
- package/dist/commonjs/bucket-deployment-props.js.map +1 -0
- package/dist/commonjs/defaults.d.ts.map +1 -0
- package/dist/commonjs/defaults.js +118 -0
- package/dist/commonjs/defaults.js.map +1 -0
- package/dist/commonjs/index.d.ts.map +1 -0
- package/dist/commonjs/index.js +16 -0
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/esm/alarm-config.d.ts +48 -0
- package/dist/esm/alarm-config.d.ts.map +1 -0
- package/dist/esm/alarm-config.js.map +1 -0
- package/dist/esm/alarm-defaults.d.ts +14 -0
- package/dist/esm/alarm-defaults.d.ts.map +1 -0
- package/dist/esm/alarm-defaults.js.map +1 -0
- package/dist/esm/bucket-alarms.d.ts +34 -0
- package/dist/esm/bucket-alarms.d.ts.map +1 -0
- package/dist/esm/bucket-alarms.js.map +1 -0
- package/dist/esm/bucket-builder.d.ts +130 -0
- package/dist/esm/bucket-builder.d.ts.map +1 -0
- package/dist/{bucket-builder.js → esm/bucket-builder.js} +7 -2
- package/dist/esm/bucket-builder.js.map +1 -0
- package/dist/esm/bucket-deployment-builder.d.ts +113 -0
- package/dist/esm/bucket-deployment-builder.d.ts.map +1 -0
- package/dist/{bucket-deployment-builder.js → esm/bucket-deployment-builder.js} +8 -2
- package/dist/esm/bucket-deployment-builder.js.map +1 -0
- package/dist/esm/bucket-deployment-defaults.d.ts +51 -0
- package/dist/esm/bucket-deployment-defaults.d.ts.map +1 -0
- package/dist/esm/bucket-deployment-defaults.js.map +1 -0
- package/dist/esm/bucket-deployment-props.d.ts +18 -0
- package/dist/esm/bucket-deployment-props.d.ts.map +1 -0
- package/dist/esm/bucket-deployment-props.js.map +1 -0
- package/dist/esm/defaults.d.ts +28 -0
- package/dist/esm/defaults.d.ts.map +1 -0
- package/dist/esm/defaults.js.map +1 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/package.json +36 -17
- package/dist/alarm-config.d.ts.map +0 -1
- package/dist/alarm-defaults.d.ts.map +0 -1
- package/dist/alarm-defaults.js.map +0 -1
- package/dist/bucket-alarms.d.ts.map +0 -1
- package/dist/bucket-alarms.js.map +0 -1
- package/dist/bucket-builder.d.ts.map +0 -1
- package/dist/bucket-builder.js.map +0 -1
- package/dist/bucket-deployment-builder.d.ts.map +0 -1
- package/dist/bucket-deployment-builder.js.map +0 -1
- package/dist/bucket-deployment-defaults.d.ts.map +0 -1
- package/dist/bucket-deployment-defaults.js.map +0 -1
- package/dist/bucket-deployment-props.d.ts.map +0 -1
- package/dist/bucket-deployment-props.js.map +0 -1
- package/dist/defaults.d.ts.map +0 -1
- package/dist/defaults.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- /package/dist/{alarm-config.d.ts → commonjs/alarm-config.d.ts} +0 -0
- /package/dist/{alarm-defaults.d.ts → commonjs/alarm-defaults.d.ts} +0 -0
- /package/dist/{bucket-alarms.d.ts → commonjs/bucket-alarms.d.ts} +0 -0
- /package/dist/{bucket-deployment-defaults.d.ts → commonjs/bucket-deployment-defaults.d.ts} +0 -0
- /package/dist/{bucket-deployment-props.d.ts → commonjs/bucket-deployment-props.d.ts} +0 -0
- /package/dist/{defaults.d.ts → commonjs/defaults.d.ts} +0 -0
- /package/dist/{index.d.ts → commonjs/index.d.ts} +0 -0
- /package/dist/{alarm-config.js → esm/alarm-config.js} +0 -0
- /package/dist/{alarm-defaults.js → esm/alarm-defaults.js} +0 -0
- /package/dist/{bucket-alarms.js → esm/bucket-alarms.js} +0 -0
- /package/dist/{bucket-deployment-defaults.js → esm/bucket-deployment-defaults.js} +0 -0
- /package/dist/{bucket-deployment-props.js → esm/bucket-deployment-props.js} +0 -0
- /package/dist/{defaults.js → esm/defaults.js} +0 -0
- /package/dist/{index.js → esm/index.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-config.d.ts","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAEnC;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CACpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-defaults.d.ts","sourceRoot":"","sources":["../../src/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;IAClC,YAAY,EAAE,mBAAmB,CAAC;CACnC;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,mBAkBnC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BUCKET_ALARM_DEFAULTS = void 0;
|
|
4
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
5
|
+
/**
|
|
6
|
+
* AWS-recommended default alarm configuration for S3 buckets.
|
|
7
|
+
*
|
|
8
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
|
|
9
|
+
*/
|
|
10
|
+
exports.BUCKET_ALARM_DEFAULTS = {
|
|
11
|
+
enabled: true,
|
|
12
|
+
/** Any server-side error is worth investigating; threshold 0. */
|
|
13
|
+
serverErrors: {
|
|
14
|
+
threshold: 0,
|
|
15
|
+
evaluationPeriods: 1,
|
|
16
|
+
datapointsToAlarm: 1,
|
|
17
|
+
treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING,
|
|
18
|
+
},
|
|
19
|
+
/** Any client-side error pattern is worth investigating; threshold 0. */
|
|
20
|
+
clientErrors: {
|
|
21
|
+
threshold: 0,
|
|
22
|
+
evaluationPeriods: 1,
|
|
23
|
+
datapointsToAlarm: 1,
|
|
24
|
+
treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=alarm-defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-defaults.js","sourceRoot":"","sources":["../../src/alarm-defaults.ts"],"names":[],"mappings":";;;AAAA,+DAA8D;AAS9D;;;;GAIG;AACU,QAAA,qBAAqB,GAAwB;IACxD,OAAO,EAAE,IAAI;IAEb,iEAAiE;IACjE,YAAY,EAAE;QACZ,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,iCAAgB,CAAC,aAAa;KACjD;IAED,yEAAyE;IACzE,YAAY,EAAE;QACZ,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,iCAAgB,CAAC,aAAa;KACjD;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-alarms.d.ts","sourceRoot":"","sources":["../../src/bucket-alarms.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAqC,MAAM,4BAA4B,CAAC;AAC3F,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAoC,MAAM,0BAA0B,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA2B3D;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB,GAAG,SAAS,EACrC,cAAc,EAAE,aAAa,EAAE,GAC9B,eAAe,EAAE,CAyCnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB,GAAG,KAAK,GAAG,SAAS,EAC7C,cAAc,EAAE,aAAa,EAAE,EAC/B,YAAY,GAAE,sBAAsB,CAAC,MAAM,CAAC,EAAO,GAClD,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAUvB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveBucketAlarmDefinitions = resolveBucketAlarmDefinitions;
|
|
4
|
+
exports.createBucketAlarms = createBucketAlarms;
|
|
5
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
7
|
+
const cloudwatch_1 = require("@composurecdk/cloudwatch");
|
|
8
|
+
const alarm_defaults_js_1 = require("./alarm-defaults.js");
|
|
9
|
+
const METRIC_PERIOD = aws_cdk_lib_1.Duration.minutes(5);
|
|
10
|
+
const METRIC_PERIOD_LABEL = `${String(METRIC_PERIOD.toMinutes())} minutes`;
|
|
11
|
+
/**
|
|
12
|
+
* Creates an S3 request metric with the correct namespace and dimensions.
|
|
13
|
+
*/
|
|
14
|
+
function s3RequestMetric(bucket, filterId, metricName, statistic) {
|
|
15
|
+
return new aws_cloudwatch_1.Metric({
|
|
16
|
+
namespace: "AWS/S3",
|
|
17
|
+
metricName,
|
|
18
|
+
dimensionsMap: {
|
|
19
|
+
BucketName: bucket.bucketName,
|
|
20
|
+
FilterId: filterId,
|
|
21
|
+
},
|
|
22
|
+
statistic,
|
|
23
|
+
period: METRIC_PERIOD,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolves the recommended alarm configuration into fully-resolved
|
|
28
|
+
* {@link AlarmDefinition}s for an S3 bucket.
|
|
29
|
+
*
|
|
30
|
+
* Creates alarms for each entry in `metricsConfigs`, keyed as
|
|
31
|
+
* `{alarmType}:{filterId}` (e.g. `serverErrors:EntireBucket`).
|
|
32
|
+
*/
|
|
33
|
+
function resolveBucketAlarmDefinitions(bucket, config, metricsConfigs) {
|
|
34
|
+
if (config?.enabled === false)
|
|
35
|
+
return [];
|
|
36
|
+
if (metricsConfigs.length === 0)
|
|
37
|
+
return [];
|
|
38
|
+
const definitions = [];
|
|
39
|
+
for (const metrics of metricsConfigs) {
|
|
40
|
+
const filterId = metrics.id;
|
|
41
|
+
if (config?.serverErrors !== false) {
|
|
42
|
+
const cfg = (0, cloudwatch_1.resolveAlarmConfig)(config?.serverErrors, alarm_defaults_js_1.BUCKET_ALARM_DEFAULTS.serverErrors);
|
|
43
|
+
definitions.push({
|
|
44
|
+
key: `serverErrors:${filterId}`,
|
|
45
|
+
alarmName: cfg.alarmName,
|
|
46
|
+
metric: s3RequestMetric(bucket, filterId, "5xxErrors", aws_cloudwatch_1.Stats.SUM),
|
|
47
|
+
threshold: cfg.threshold,
|
|
48
|
+
comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD,
|
|
49
|
+
evaluationPeriods: cfg.evaluationPeriods,
|
|
50
|
+
datapointsToAlarm: cfg.datapointsToAlarm,
|
|
51
|
+
treatMissingData: cfg.treatMissingData,
|
|
52
|
+
description: `S3 bucket is returning server-side errors (filter: ${filterId}). Threshold: > ${String(cfg.threshold)} 5xx errors in ${METRIC_PERIOD_LABEL}.`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (config?.clientErrors !== false) {
|
|
56
|
+
const cfg = (0, cloudwatch_1.resolveAlarmConfig)(config?.clientErrors, alarm_defaults_js_1.BUCKET_ALARM_DEFAULTS.clientErrors);
|
|
57
|
+
definitions.push({
|
|
58
|
+
key: `clientErrors:${filterId}`,
|
|
59
|
+
alarmName: cfg.alarmName,
|
|
60
|
+
metric: s3RequestMetric(bucket, filterId, "4xxErrors", aws_cloudwatch_1.Stats.SUM),
|
|
61
|
+
threshold: cfg.threshold,
|
|
62
|
+
comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD,
|
|
63
|
+
evaluationPeriods: cfg.evaluationPeriods,
|
|
64
|
+
datapointsToAlarm: cfg.datapointsToAlarm,
|
|
65
|
+
treatMissingData: cfg.treatMissingData,
|
|
66
|
+
description: `S3 bucket is returning client-side errors (filter: ${filterId}). Threshold: > ${String(cfg.threshold)} 4xx errors in ${METRIC_PERIOD_LABEL}.`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return definitions;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Creates AWS-recommended CloudWatch alarms for an S3 bucket,
|
|
74
|
+
* merging recommended definitions with any custom alarm builders.
|
|
75
|
+
*
|
|
76
|
+
* Alarms are created for each entry in `metricsConfigs` (from
|
|
77
|
+
* {@link BucketProps.metrics}). If no metrics configurations are
|
|
78
|
+
* provided, only custom alarms are created.
|
|
79
|
+
*
|
|
80
|
+
* @param scope - CDK construct scope for creating alarm constructs.
|
|
81
|
+
* @param id - Base identifier for alarm construct ids.
|
|
82
|
+
* @param bucket - The S3 bucket to create alarms for.
|
|
83
|
+
* @param config - User-provided alarm configuration, or `false` to disable all.
|
|
84
|
+
* @param metricsConfigs - The bucket's request metrics configurations.
|
|
85
|
+
* @param customAlarms - Custom alarm builders added via `addAlarm()`.
|
|
86
|
+
* @returns A record mapping alarm keys to their created Alarm constructs.
|
|
87
|
+
*
|
|
88
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
|
|
89
|
+
*/
|
|
90
|
+
function createBucketAlarms(scope, id, bucket, config, metricsConfigs, customAlarms = []) {
|
|
91
|
+
if (config === false)
|
|
92
|
+
return {};
|
|
93
|
+
const enabled = config?.enabled ?? alarm_defaults_js_1.BUCKET_ALARM_DEFAULTS.enabled;
|
|
94
|
+
if (!enabled)
|
|
95
|
+
return {};
|
|
96
|
+
const recommended = resolveBucketAlarmDefinitions(bucket, config, metricsConfigs);
|
|
97
|
+
const custom = customAlarms.map((b) => b.resolve(bucket));
|
|
98
|
+
return (0, cloudwatch_1.createAlarms)(scope, id, [...recommended, ...custom]);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=bucket-alarms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-alarms.js","sourceRoot":"","sources":["../../src/bucket-alarms.ts"],"names":[],"mappings":";;AAwCA,sEA6CC;AAoBD,gDAiBC;AA1HD,6CAAuC;AACvC,+DAA2F;AAG3F,yDAAoG;AAGpG,2DAA4D;AAE5D,MAAM,aAAa,GAAG,sBAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1C,MAAM,mBAAmB,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC;AAE3E;;GAEG;AACH,SAAS,eAAe,CACtB,MAAc,EACd,QAAgB,EAChB,UAAkB,EAClB,SAAiB;IAEjB,OAAO,IAAI,uBAAM,CAAC;QAChB,SAAS,EAAE,QAAQ;QACnB,UAAU;QACV,aAAa,EAAE;YACb,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,QAAQ;SACnB;QACD,SAAS;QACT,MAAM,EAAE,aAAa;KACtB,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,6BAA6B,CAC3C,MAAc,EACd,MAAqC,EACrC,cAA+B;IAE/B,IAAI,MAAM,EAAE,OAAO,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IACzC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE3C,MAAM,WAAW,GAAsB,EAAE,CAAC;IAE1C,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;QAE5B,IAAI,MAAM,EAAE,YAAY,KAAK,KAAK,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,IAAA,+BAAkB,EAAC,MAAM,EAAE,YAAY,EAAE,yCAAqB,CAAC,YAAY,CAAC,CAAC;YACzF,WAAW,CAAC,IAAI,CAAC;gBACf,GAAG,EAAE,gBAAgB,QAAQ,EAAE;gBAC/B,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAK,CAAC,GAAG,CAAC;gBACjE,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,kBAAkB,EAAE,mCAAkB,CAAC,sBAAsB;gBAC7D,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;gBACxC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;gBACxC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;gBACtC,WAAW,EAAE,sDAAsD,QAAQ,mBAAmB,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,mBAAmB,GAAG;aAC5J,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,EAAE,YAAY,KAAK,KAAK,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,IAAA,+BAAkB,EAAC,MAAM,EAAE,YAAY,EAAE,yCAAqB,CAAC,YAAY,CAAC,CAAC;YACzF,WAAW,CAAC,IAAI,CAAC;gBACf,GAAG,EAAE,gBAAgB,QAAQ,EAAE;gBAC/B,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAK,CAAC,GAAG,CAAC;gBACjE,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,kBAAkB,EAAE,mCAAkB,CAAC,sBAAsB;gBAC7D,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;gBACxC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;gBACxC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;gBACtC,WAAW,EAAE,sDAAsD,QAAQ,mBAAmB,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,mBAAmB,GAAG;aAC5J,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,kBAAkB,CAChC,KAAiB,EACjB,EAAU,EACV,MAAc,EACd,MAA6C,EAC7C,cAA+B,EAC/B,eAAiD,EAAE;IAEnD,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,yCAAqB,CAAC,OAAO,CAAC;IACjE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,WAAW,GAAG,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAE1D,OAAO,IAAA,yBAAY,EAAC,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type Alarm } from "aws-cdk-lib/aws-cloudwatch";
|
|
2
2
|
import { Bucket, type BucketProps, type IBucket } from "aws-cdk-lib/aws-s3";
|
|
3
3
|
import { type IConstruct } from "constructs";
|
|
4
|
-
import {
|
|
4
|
+
import { COPY_STATE, type Lifecycle } from "@composurecdk/core";
|
|
5
|
+
import { type ITaggedBuilder } from "@composurecdk/cloudformation";
|
|
5
6
|
import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
|
|
6
7
|
import type { BucketAlarmConfig } from "./alarm-config.js";
|
|
7
8
|
/**
|
|
@@ -90,11 +91,13 @@ export interface BucketBuilderResult {
|
|
|
90
91
|
* .versioned(false);
|
|
91
92
|
* ```
|
|
92
93
|
*/
|
|
93
|
-
export type IBucketBuilder =
|
|
94
|
+
export type IBucketBuilder = ITaggedBuilder<BucketBuilderProps, BucketBuilder>;
|
|
94
95
|
declare class BucketBuilder implements Lifecycle<BucketBuilderResult> {
|
|
95
96
|
#private;
|
|
96
97
|
props: Partial<BucketBuilderProps>;
|
|
97
98
|
addAlarm(key: string, configure: (alarm: AlarmDefinitionBuilder<Bucket>) => AlarmDefinitionBuilder<Bucket>): this;
|
|
99
|
+
/** @internal — see ADR-0005. */
|
|
100
|
+
[COPY_STATE](target: BucketBuilder): void;
|
|
98
101
|
build(scope: IConstruct, id: string): BucketBuilderResult;
|
|
99
102
|
}
|
|
100
103
|
/**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-builder.d.ts","sourceRoot":"","sources":["../../src/bucket-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D;;;;;;;GAOG;AACH,MAAM,MAAM,sBAAsB,GAC9B,KAAK,GACL;IACE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,cAAc,CAAC;CACnD,CAAC;AAEN;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAC9C,WAAW,EACX,wBAAwB,GAAG,wBAAwB,CACpD;IACC,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAE1C;;;;;;;;;;;;;OAaG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAC;CAC/C;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;;;;;;OAWG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;GAkBG;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;IAGxC,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;IAIzC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,mBAAmB;CA+B1D;AAgED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,CAEpD"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createBucketBuilder = createBucketBuilder;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
6
|
+
const core_1 = require("@composurecdk/core");
|
|
7
|
+
const cloudformation_1 = require("@composurecdk/cloudformation");
|
|
8
|
+
const cloudwatch_1 = require("@composurecdk/cloudwatch");
|
|
9
|
+
const bucket_alarms_js_1 = require("./bucket-alarms.js");
|
|
10
|
+
const defaults_js_1 = require("./defaults.js");
|
|
11
|
+
class BucketBuilder {
|
|
12
|
+
props = {};
|
|
13
|
+
#customAlarms = [];
|
|
14
|
+
addAlarm(key, configure) {
|
|
15
|
+
this.#customAlarms.push(configure(new cloudwatch_1.AlarmDefinitionBuilder(key)));
|
|
16
|
+
return this;
|
|
17
|
+
}
|
|
18
|
+
/** @internal — see ADR-0005. */
|
|
19
|
+
[core_1.COPY_STATE](target) {
|
|
20
|
+
target.#customAlarms.push(...this.#customAlarms);
|
|
21
|
+
}
|
|
22
|
+
build(scope, id) {
|
|
23
|
+
const { serverAccessLogs, recommendedAlarms: alarmConfig, ...bucketProps } = this.props;
|
|
24
|
+
const { serverAccessLogs: defaultServerAccessLogs, ...cdkDefaults } = defaults_js_1.BUCKET_DEFAULTS;
|
|
25
|
+
const cfg = serverAccessLogs ?? defaultServerAccessLogs;
|
|
26
|
+
const { accessLogsBucket, accessLogProps } = resolveAccessLogs(scope, id, cfg);
|
|
27
|
+
const mergedProps = {
|
|
28
|
+
...cdkDefaults,
|
|
29
|
+
...accessLogProps,
|
|
30
|
+
...bucketProps,
|
|
31
|
+
...autoDeleteProps(bucketProps, defaults_js_1.BUCKET_DEFAULTS),
|
|
32
|
+
};
|
|
33
|
+
const bucket = new aws_s3_1.Bucket(scope, id, mergedProps);
|
|
34
|
+
const alarms = (0, bucket_alarms_js_1.createBucketAlarms)(scope, id, bucket, alarmConfig, bucketProps.metrics ?? [], this.#customAlarms);
|
|
35
|
+
return {
|
|
36
|
+
bucket,
|
|
37
|
+
accessLogsBucket,
|
|
38
|
+
alarms,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function resolveAccessLogs(scope, id, cfg) {
|
|
43
|
+
if (cfg === false || cfg === undefined) {
|
|
44
|
+
return { accessLogProps: {} };
|
|
45
|
+
}
|
|
46
|
+
if (cfg.destination !== undefined) {
|
|
47
|
+
if (cfg.configure !== undefined) {
|
|
48
|
+
throw new Error("serverAccessLogs: 'configure' cannot be combined with 'destination' — " +
|
|
49
|
+
"the destination bucket is user-managed and not built by this builder.");
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
accessLogProps: {
|
|
53
|
+
serverAccessLogsBucket: cfg.destination,
|
|
54
|
+
...(cfg.prefix !== undefined ? { serverAccessLogsPrefix: cfg.prefix } : {}),
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
let subBuilder = createBucketBuilder()
|
|
59
|
+
.serverAccessLogs(false)
|
|
60
|
+
.versioned(false)
|
|
61
|
+
.removalPolicy(aws_cdk_lib_1.RemovalPolicy.RETAIN)
|
|
62
|
+
.lifecycleRules(defaults_js_1.DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES);
|
|
63
|
+
if (cfg.configure) {
|
|
64
|
+
subBuilder = cfg.configure(subBuilder);
|
|
65
|
+
}
|
|
66
|
+
const accessLogsBucket = subBuilder.build(scope, `${id}AccessLogs`).bucket;
|
|
67
|
+
return {
|
|
68
|
+
accessLogsBucket,
|
|
69
|
+
accessLogProps: {
|
|
70
|
+
serverAccessLogsBucket: accessLogsBucket,
|
|
71
|
+
...(cfg.prefix !== undefined ? { serverAccessLogsPrefix: cfg.prefix } : {}),
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Returns `{ autoDeleteObjects: true }` when the effective removal policy is
|
|
77
|
+
* `DESTROY` and the user has not explicitly set `autoDeleteObjects`.
|
|
78
|
+
*
|
|
79
|
+
* CDK requires `autoDeleteObjects` to be paired with `removalPolicy: DESTROY`,
|
|
80
|
+
* but forgetting it causes a non-empty-bucket error on stack deletion. This
|
|
81
|
+
* helper bridges that gap so that switching to `DESTROY` Just Works.
|
|
82
|
+
*/
|
|
83
|
+
function autoDeleteProps(userProps, defaults) {
|
|
84
|
+
const effectivePolicy = userProps.removalPolicy ?? defaults.removalPolicy;
|
|
85
|
+
if (effectivePolicy === aws_cdk_lib_1.RemovalPolicy.DESTROY && userProps.autoDeleteObjects === undefined) {
|
|
86
|
+
return { autoDeleteObjects: true };
|
|
87
|
+
}
|
|
88
|
+
return {};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Creates a new {@link IBucketBuilder} for configuring an Amazon S3 bucket.
|
|
92
|
+
*
|
|
93
|
+
* This is the entry point for defining an S3 bucket component. The returned
|
|
94
|
+
* builder exposes every {@link BucketProps} property as a fluent setter/getter
|
|
95
|
+
* and implements {@link Lifecycle} for use with {@link compose}.
|
|
96
|
+
*
|
|
97
|
+
* @returns A fluent builder for an Amazon S3 bucket.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```ts
|
|
101
|
+
* const site = createBucketBuilder()
|
|
102
|
+
* .bucketName("my-site")
|
|
103
|
+
* .versioned(false);
|
|
104
|
+
*
|
|
105
|
+
* // Use standalone:
|
|
106
|
+
* const result = site.build(stack, "SiteBucket");
|
|
107
|
+
*
|
|
108
|
+
* // Or compose into a system:
|
|
109
|
+
* const system = compose(
|
|
110
|
+
* { site, cdn: createDistributionBuilder() },
|
|
111
|
+
* { site: [], cdn: ["site"] },
|
|
112
|
+
* );
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
function createBucketBuilder() {
|
|
116
|
+
return (0, cloudformation_1.taggedBuilder)(BucketBuilder);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=bucket-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-builder.js","sourceRoot":"","sources":["../../src/bucket-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,8 @@ import { type IBucket } from "aws-cdk-lib/aws-s3";
|
|
|
3
3
|
import { type IDistribution } from "aws-cdk-lib/aws-cloudfront";
|
|
4
4
|
import type { LogGroup } from "aws-cdk-lib/aws-logs";
|
|
5
5
|
import { type IConstruct } from "constructs";
|
|
6
|
-
import {
|
|
6
|
+
import { COPY_STATE, type Lifecycle, type Resolvable } from "@composurecdk/core";
|
|
7
|
+
import { type ITaggedBuilder } from "@composurecdk/cloudformation";
|
|
7
8
|
import { type BucketDeploymentBuilderProps } from "./bucket-deployment-props.js";
|
|
8
9
|
/**
|
|
9
10
|
* The build output of a {@link IBucketDeploymentBuilder}.
|
|
@@ -47,7 +48,7 @@ export interface BucketDeploymentBuilderResult {
|
|
|
47
48
|
* .distributionPaths(["/*"]);
|
|
48
49
|
* ```
|
|
49
50
|
*/
|
|
50
|
-
export type IBucketDeploymentBuilder =
|
|
51
|
+
export type IBucketDeploymentBuilder = ITaggedBuilder<BucketDeploymentBuilderProps, BucketDeploymentBuilder>;
|
|
51
52
|
declare class BucketDeploymentBuilder implements Lifecycle<BucketDeploymentBuilderResult> {
|
|
52
53
|
#private;
|
|
53
54
|
props: Partial<BucketDeploymentBuilderProps>;
|
|
@@ -72,6 +73,8 @@ declare class BucketDeploymentBuilder implements Lifecycle<BucketDeploymentBuild
|
|
|
72
73
|
* @returns This builder for chaining.
|
|
73
74
|
*/
|
|
74
75
|
distribution(distribution: Resolvable<IDistribution>): this;
|
|
76
|
+
/** @internal — see ADR-0005. */
|
|
77
|
+
[COPY_STATE](target: BucketDeploymentBuilder): void;
|
|
75
78
|
build(scope: IConstruct, id: string, context?: Record<string, object>): BucketDeploymentBuilderResult;
|
|
76
79
|
}
|
|
77
80
|
/**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-deployment-builder.d.ts","sourceRoot":"","sources":["../../src/bucket-deployment-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA8B,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,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,OAAO,EAAE,KAAK,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAEjF;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,iEAAiE;IACjE,UAAU,EAAE,gBAAgB,CAAC;IAE7B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,wBAAwB,GAAG,cAAc,CACnD,4BAA4B,EAC5B,uBAAuB,CACxB,CAAC;AAEF,cAAM,uBAAwB,YAAW,SAAS,CAAC,6BAA6B,CAAC;;IAC/E,KAAK,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAM;IAIlD;;;;;;;;OAQG;IACH,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI;IAKpD;;;;;;;;;OASG;IACH,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,IAAI;IAK3D,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAKnD,KAAK,CACH,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,6BAA6B;CAiDjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,6BAA6B,IAAI,wBAAwB,CAIxE"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createBucketDeploymentBuilder = createBucketDeploymentBuilder;
|
|
4
|
+
const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
|
|
5
|
+
const core_1 = require("@composurecdk/core");
|
|
6
|
+
const cloudformation_1 = require("@composurecdk/cloudformation");
|
|
7
|
+
const logs_1 = require("@composurecdk/logs");
|
|
8
|
+
const bucket_deployment_defaults_js_1 = require("./bucket-deployment-defaults.js");
|
|
9
|
+
class BucketDeploymentBuilder {
|
|
10
|
+
props = {};
|
|
11
|
+
#destinationBucket;
|
|
12
|
+
#distribution;
|
|
13
|
+
/**
|
|
14
|
+
* Sets the destination bucket for the deployment.
|
|
15
|
+
*
|
|
16
|
+
* Accepts a concrete {@link IBucket} or a {@link Ref} that resolves to one
|
|
17
|
+
* at build time.
|
|
18
|
+
*
|
|
19
|
+
* @param bucket - The bucket or a Ref to one.
|
|
20
|
+
* @returns This builder for chaining.
|
|
21
|
+
*/
|
|
22
|
+
destinationBucket(bucket) {
|
|
23
|
+
this.#destinationBucket = bucket;
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Sets the CloudFront distribution to invalidate on deployment.
|
|
28
|
+
*
|
|
29
|
+
* Accepts a concrete {@link IDistribution} or a {@link Ref} that resolves
|
|
30
|
+
* to one at build time. This is optional — deployments can target a bucket
|
|
31
|
+
* without CloudFront invalidation.
|
|
32
|
+
*
|
|
33
|
+
* @param distribution - The distribution or a Ref to one.
|
|
34
|
+
* @returns This builder for chaining.
|
|
35
|
+
*/
|
|
36
|
+
distribution(distribution) {
|
|
37
|
+
this.#distribution = distribution;
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
/** @internal — see ADR-0005. */
|
|
41
|
+
[core_1.COPY_STATE](target) {
|
|
42
|
+
target.#destinationBucket = this.#destinationBucket;
|
|
43
|
+
target.#distribution = this.#distribution;
|
|
44
|
+
}
|
|
45
|
+
build(scope, id, context) {
|
|
46
|
+
const ctx = context ?? {};
|
|
47
|
+
const resolvedBucket = this.#destinationBucket
|
|
48
|
+
? (0, core_1.resolve)(this.#destinationBucket, ctx)
|
|
49
|
+
: undefined;
|
|
50
|
+
if (!resolvedBucket) {
|
|
51
|
+
throw new Error(`BucketDeploymentBuilder "${id}" requires a destination bucket. ` +
|
|
52
|
+
`Call .destinationBucket() with an IBucket or a Ref to one.`);
|
|
53
|
+
}
|
|
54
|
+
const { sources, ...deployProps } = this.props;
|
|
55
|
+
if (!sources || sources.length === 0) {
|
|
56
|
+
throw new Error(`BucketDeploymentBuilder "${id}" requires at least one source. ` +
|
|
57
|
+
`Call .sources() with an array of ISource.`);
|
|
58
|
+
}
|
|
59
|
+
const resolvedDistribution = this.#distribution ? (0, core_1.resolve)(this.#distribution, ctx) : undefined;
|
|
60
|
+
// Auto-create a managed LogGroup for the deployment's backing Lambda
|
|
61
|
+
// unless the user supplied their own, matching the Lambda builder pattern.
|
|
62
|
+
let logGroup;
|
|
63
|
+
let logGroupProps = {};
|
|
64
|
+
if (!deployProps.logGroup) {
|
|
65
|
+
logGroup = (0, logs_1.createLogGroupBuilder)().build(scope, `${id}LogGroup`).logGroup;
|
|
66
|
+
logGroupProps = { logGroup };
|
|
67
|
+
}
|
|
68
|
+
const mergedProps = {
|
|
69
|
+
...(0, bucket_deployment_defaults_js_1.effectiveDefaults)(!!resolvedDistribution),
|
|
70
|
+
...logGroupProps,
|
|
71
|
+
...deployProps,
|
|
72
|
+
...(resolvedDistribution ? { distribution: resolvedDistribution } : {}),
|
|
73
|
+
sources,
|
|
74
|
+
destinationBucket: resolvedBucket,
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
deployment: new aws_s3_deployment_1.BucketDeployment(scope, id, mergedProps),
|
|
78
|
+
logGroup,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Creates a new {@link IBucketDeploymentBuilder} for deploying content to an
|
|
84
|
+
* S3 bucket with optional CloudFront cache invalidation.
|
|
85
|
+
*
|
|
86
|
+
* This is the entry point for defining an S3 deployment component. The
|
|
87
|
+
* returned builder exposes {@link BucketDeploymentBuilderProps} properties as
|
|
88
|
+
* fluent setters/getters, plus {@link IBucketDeploymentBuilder.destinationBucket | destinationBucket()}
|
|
89
|
+
* and {@link IBucketDeploymentBuilder.distribution | distribution()} for
|
|
90
|
+
* cross-component wiring with Ref support. It implements {@link Lifecycle}
|
|
91
|
+
* for use with {@link compose}.
|
|
92
|
+
*
|
|
93
|
+
* @returns A fluent builder for an S3 BucketDeployment.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* const deploy = createBucketDeploymentBuilder()
|
|
98
|
+
* .sources([Source.asset("./site")])
|
|
99
|
+
* .destinationBucket(ref("site", (r: BucketBuilderResult) => r.bucket))
|
|
100
|
+
* .distribution(ref("cdn", (r: DistributionBuilderResult) => r.distribution))
|
|
101
|
+
* .distributionPaths(["/*"]);
|
|
102
|
+
*
|
|
103
|
+
* // Use standalone:
|
|
104
|
+
* const result = deploy.build(stack, "Deploy");
|
|
105
|
+
*
|
|
106
|
+
* // Or compose into a system:
|
|
107
|
+
* const system = compose(
|
|
108
|
+
* { site: createBucketBuilder(), cdn: createDistributionBuilder(), deploy },
|
|
109
|
+
* { site: [], cdn: ["site"], deploy: ["site", "cdn"] },
|
|
110
|
+
* );
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
function createBucketDeploymentBuilder() {
|
|
114
|
+
return (0, cloudformation_1.taggedBuilder)(BucketDeploymentBuilder);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=bucket-deployment-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-deployment-builder.js","sourceRoot":"","sources":["../../src/bucket-deployment-builder.ts"],"names":[],"mappings":";;AA0LA,sEAIC;AA9LD,qEAA6F;AAK7F,6CAA0F;AAC1F,iEAAkF;AAClF,6CAA2D;AAC3D,mFAAoE;AAoDpE,MAAM,uBAAuB;IAC3B,KAAK,GAA0C,EAAE,CAAC;IAClD,kBAAkB,CAAuB;IACzC,aAAa,CAA6B;IAE1C;;;;;;;;OAQG;IACH,iBAAiB,CAAC,MAA2B;QAC3C,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;OASG;IACH,YAAY,CAAC,YAAuC;QAClD,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,iBAAU,CAAC,CAAC,MAA+B;QAC1C,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACpD,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IAC5C,CAAC;IAED,KAAK,CACH,KAAiB,EACjB,EAAU,EACV,OAAgC;QAEhC,MAAM,GAAG,GAAG,OAAO,IAAI,EAAE,CAAC;QAE1B,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB;YAC5C,CAAC,CAAC,IAAA,cAAO,EAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC;YACvC,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,4BAA4B,EAAE,mCAAmC;gBAC/D,4DAA4D,CAC/D,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE/C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,4BAA4B,EAAE,kCAAkC;gBAC9D,2CAA2C,CAC9C,CAAC;QACJ,CAAC;QAED,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAA,cAAO,EAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE/F,qEAAqE;QACrE,2EAA2E;QAC3E,IAAI,QAA8B,CAAC;QACnC,IAAI,aAAa,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1B,QAAQ,GAAG,IAAA,4BAAqB,GAAE,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC;YAC1E,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,WAAW,GAAG;YAClB,GAAG,IAAA,iDAAiB,EAAC,CAAC,CAAC,oBAAoB,CAAC;YAC5C,GAAG,aAAa;YAChB,GAAG,WAAW;YACd,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,OAAO;YACP,iBAAiB,EAAE,cAAc;SACT,CAAC;QAE3B,OAAO;YACL,UAAU,EAAE,IAAI,oCAAgB,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC;YACxD,QAAQ;SACT,CAAC;IACJ,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,SAAgB,6BAA6B;IAC3C,OAAO,IAAA,8BAAa,EAClB,uBAAuB,CACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-deployment-defaults.d.ts","sourceRoot":"","sources":["../../src/bucket-deployment-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAmDjF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGtC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,OAAO,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAEjG"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BUCKET_DEPLOYMENT_DEFAULTS = void 0;
|
|
4
|
+
exports.effectiveDefaults = effectiveDefaults;
|
|
5
|
+
/**
|
|
6
|
+
* Defaults that apply regardless of whether a CloudFront distribution is
|
|
7
|
+
* present. Split from distribution-specific defaults so the builder can
|
|
8
|
+
* merge without runtime filtering.
|
|
9
|
+
*/
|
|
10
|
+
const BASE_DEFAULTS = {
|
|
11
|
+
/**
|
|
12
|
+
* Remove files from the destination bucket that are not present in the
|
|
13
|
+
* source, keeping the bucket in sync with the deployed assets and
|
|
14
|
+
* preventing stale content from being served.
|
|
15
|
+
* @see https://docs.aws.amazon.com/wellarchitected/latest/operational-excellence-pillar/ops_evolve_ops_learned_from_experience.html
|
|
16
|
+
*/
|
|
17
|
+
prune: true,
|
|
18
|
+
/**
|
|
19
|
+
* Allocate 256 MiB to the deployment Lambda. The CDK default of 128 MiB
|
|
20
|
+
* is insufficient for deployments with more than a handful of files and
|
|
21
|
+
* can cause silent failures or timeouts.
|
|
22
|
+
* @see https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_withstand_component_failures_avoid_hard_coded_limits.html
|
|
23
|
+
* @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_deployment-readme.html#memory-limit
|
|
24
|
+
*/
|
|
25
|
+
memoryLimit: 256,
|
|
26
|
+
/**
|
|
27
|
+
* Do not retain deployed files when the stack is deleted. This aligns
|
|
28
|
+
* with `prune: true` semantics — the deployment keeps the bucket in
|
|
29
|
+
* sync with the source, so retaining stale files on deletion is
|
|
30
|
+
* inconsistent. The destination bucket's own removal policy governs
|
|
31
|
+
* whether the bucket itself is retained.
|
|
32
|
+
* @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_deployment.BucketDeploymentProps.html#retainondelete
|
|
33
|
+
*/
|
|
34
|
+
retainOnDelete: false,
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Defaults that only apply when a CloudFront distribution is configured.
|
|
38
|
+
* CDK throws if `distributionPaths` is set without a distribution.
|
|
39
|
+
*/
|
|
40
|
+
const DISTRIBUTION_DEFAULTS = {
|
|
41
|
+
/**
|
|
42
|
+
* Invalidate all paths by default so that deployed content is immediately
|
|
43
|
+
* visible through CloudFront. Uses a wildcard path which counts as a
|
|
44
|
+
* single invalidation path. For deployments that only change a subset of
|
|
45
|
+
* files, override with specific paths to reduce origin fetches.
|
|
46
|
+
* @see https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_withstand_component_failures_static_stability.html
|
|
47
|
+
*/
|
|
48
|
+
distributionPaths: ["/*"],
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Secure, AWS-recommended defaults applied to every S3 BucketDeployment
|
|
52
|
+
* built with {@link createBucketDeploymentBuilder}. Each property can be
|
|
53
|
+
* individually overridden via the builder's fluent API.
|
|
54
|
+
*/
|
|
55
|
+
exports.BUCKET_DEPLOYMENT_DEFAULTS = {
|
|
56
|
+
...BASE_DEFAULTS,
|
|
57
|
+
...DISTRIBUTION_DEFAULTS,
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Returns the appropriate defaults based on whether a CloudFront
|
|
61
|
+
* distribution is present. CDK throws if `distributionPaths` is set
|
|
62
|
+
* without a distribution, so distribution-specific defaults are only
|
|
63
|
+
* included when applicable.
|
|
64
|
+
*/
|
|
65
|
+
function effectiveDefaults(hasDistribution) {
|
|
66
|
+
return hasDistribution ? { ...BASE_DEFAULTS, ...DISTRIBUTION_DEFAULTS } : BASE_DEFAULTS;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=bucket-deployment-defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-deployment-defaults.js","sourceRoot":"","sources":["../../src/bucket-deployment-defaults.ts"],"names":[],"mappings":";;;AAmEA,8CAEC;AAnED;;;;GAIG;AACH,MAAM,aAAa,GAA0C;IAC3D;;;;;OAKG;IACH,KAAK,EAAE,IAAI;IAEX;;;;;;OAMG;IACH,WAAW,EAAE,GAAG;IAEhB;;;;;;;OAOG;IACH,cAAc,EAAE,KAAK;CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,qBAAqB,GAA0C;IACnE;;;;;;OAMG;IACH,iBAAiB,EAAE,CAAC,IAAI,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACU,QAAA,0BAA0B,GAAG;IACxC,GAAG,aAAa;IAChB,GAAG,qBAAqB;CACzB,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,eAAwB;IACxD,OAAO,eAAe,CAAC,CAAC,CAAC,EAAE,GAAG,aAAa,EAAE,GAAG,qBAAqB,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;AAC1F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-deployment-props.d.ts","sourceRoot":"","sources":["../../src/bucket-deployment-props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAEpF;;;;;;;;GAQG;AACH,MAAM,WAAW,4BAA6B,SAAQ,IAAI,CACxD,qBAAqB,EACrB,SAAS,GAAG,mBAAmB,GAAG,cAAc,CACjD;IACC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-deployment-props.js","sourceRoot":"","sources":["../../src/bucket-deployment-props.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAe9D;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B,EAAE,aAAa,EAczD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,yCAAyC,EAAE,aAAa,EAMpE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,kBAAkB,CA6DvD,CAAC"}
|