@composurecdk/s3 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.
Files changed (92) hide show
  1. package/dist/commonjs/alarm-config.d.ts.map +1 -0
  2. package/dist/commonjs/alarm-config.js +3 -0
  3. package/dist/{alarm-config.js.map → commonjs/alarm-config.js.map} +1 -1
  4. package/dist/commonjs/alarm-defaults.d.ts.map +1 -0
  5. package/dist/commonjs/alarm-defaults.js +27 -0
  6. package/dist/commonjs/alarm-defaults.js.map +1 -0
  7. package/dist/commonjs/bucket-alarms.d.ts.map +1 -0
  8. package/dist/commonjs/bucket-alarms.js +100 -0
  9. package/dist/commonjs/bucket-alarms.js.map +1 -0
  10. package/dist/commonjs/bucket-builder.d.ts.map +1 -0
  11. package/dist/commonjs/bucket-builder.js +118 -0
  12. package/dist/commonjs/bucket-builder.js.map +1 -0
  13. package/dist/commonjs/bucket-deployment-builder.d.ts.map +1 -0
  14. package/dist/commonjs/bucket-deployment-builder.js +116 -0
  15. package/dist/commonjs/bucket-deployment-builder.js.map +1 -0
  16. package/dist/commonjs/bucket-deployment-defaults.d.ts.map +1 -0
  17. package/dist/commonjs/bucket-deployment-defaults.js +68 -0
  18. package/dist/commonjs/bucket-deployment-defaults.js.map +1 -0
  19. package/dist/commonjs/bucket-deployment-props.d.ts.map +1 -0
  20. package/dist/commonjs/bucket-deployment-props.js +3 -0
  21. package/dist/commonjs/bucket-deployment-props.js.map +1 -0
  22. package/dist/commonjs/defaults.d.ts.map +1 -0
  23. package/dist/commonjs/defaults.js +118 -0
  24. package/dist/commonjs/defaults.js.map +1 -0
  25. package/dist/commonjs/index.d.ts.map +1 -0
  26. package/dist/commonjs/index.js +16 -0
  27. package/dist/commonjs/index.js.map +1 -0
  28. package/dist/commonjs/package.json +3 -0
  29. package/dist/esm/alarm-config.d.ts +48 -0
  30. package/dist/esm/alarm-config.d.ts.map +1 -0
  31. package/dist/esm/alarm-config.js.map +1 -0
  32. package/dist/esm/alarm-defaults.d.ts +14 -0
  33. package/dist/esm/alarm-defaults.d.ts.map +1 -0
  34. package/dist/esm/alarm-defaults.js.map +1 -0
  35. package/dist/esm/bucket-alarms.d.ts +34 -0
  36. package/dist/esm/bucket-alarms.d.ts.map +1 -0
  37. package/dist/esm/bucket-alarms.js.map +1 -0
  38. package/dist/esm/bucket-builder.d.ts +130 -0
  39. package/dist/esm/bucket-builder.d.ts.map +1 -0
  40. package/dist/esm/bucket-builder.js.map +1 -0
  41. package/dist/esm/bucket-deployment-builder.d.ts +113 -0
  42. package/dist/esm/bucket-deployment-builder.d.ts.map +1 -0
  43. package/dist/esm/bucket-deployment-builder.js.map +1 -0
  44. package/dist/esm/bucket-deployment-defaults.d.ts +51 -0
  45. package/dist/esm/bucket-deployment-defaults.d.ts.map +1 -0
  46. package/dist/esm/bucket-deployment-defaults.js.map +1 -0
  47. package/dist/esm/bucket-deployment-props.d.ts +18 -0
  48. package/dist/esm/bucket-deployment-props.d.ts.map +1 -0
  49. package/dist/esm/bucket-deployment-props.js.map +1 -0
  50. package/dist/esm/defaults.d.ts +28 -0
  51. package/dist/esm/defaults.d.ts.map +1 -0
  52. package/dist/esm/defaults.js.map +1 -0
  53. package/dist/esm/index.d.ts +8 -0
  54. package/dist/esm/index.d.ts.map +1 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/esm/package.json +3 -0
  57. package/package.json +36 -18
  58. package/dist/alarm-config.d.ts.map +0 -1
  59. package/dist/alarm-defaults.d.ts.map +0 -1
  60. package/dist/alarm-defaults.js.map +0 -1
  61. package/dist/bucket-alarms.d.ts.map +0 -1
  62. package/dist/bucket-alarms.js.map +0 -1
  63. package/dist/bucket-builder.d.ts.map +0 -1
  64. package/dist/bucket-builder.js.map +0 -1
  65. package/dist/bucket-deployment-builder.d.ts.map +0 -1
  66. package/dist/bucket-deployment-builder.js.map +0 -1
  67. package/dist/bucket-deployment-defaults.d.ts.map +0 -1
  68. package/dist/bucket-deployment-defaults.js.map +0 -1
  69. package/dist/bucket-deployment-props.d.ts.map +0 -1
  70. package/dist/bucket-deployment-props.js.map +0 -1
  71. package/dist/defaults.d.ts.map +0 -1
  72. package/dist/defaults.js.map +0 -1
  73. package/dist/index.d.ts.map +0 -1
  74. package/dist/index.js.map +0 -1
  75. /package/dist/{alarm-config.d.ts → commonjs/alarm-config.d.ts} +0 -0
  76. /package/dist/{alarm-defaults.d.ts → commonjs/alarm-defaults.d.ts} +0 -0
  77. /package/dist/{bucket-alarms.d.ts → commonjs/bucket-alarms.d.ts} +0 -0
  78. /package/dist/{bucket-builder.d.ts → commonjs/bucket-builder.d.ts} +0 -0
  79. /package/dist/{bucket-deployment-builder.d.ts → commonjs/bucket-deployment-builder.d.ts} +0 -0
  80. /package/dist/{bucket-deployment-defaults.d.ts → commonjs/bucket-deployment-defaults.d.ts} +0 -0
  81. /package/dist/{bucket-deployment-props.d.ts → commonjs/bucket-deployment-props.d.ts} +0 -0
  82. /package/dist/{defaults.d.ts → commonjs/defaults.d.ts} +0 -0
  83. /package/dist/{index.d.ts → commonjs/index.d.ts} +0 -0
  84. /package/dist/{alarm-config.js → esm/alarm-config.js} +0 -0
  85. /package/dist/{alarm-defaults.js → esm/alarm-defaults.js} +0 -0
  86. /package/dist/{bucket-alarms.js → esm/bucket-alarms.js} +0 -0
  87. /package/dist/{bucket-builder.js → esm/bucket-builder.js} +0 -0
  88. /package/dist/{bucket-deployment-builder.js → esm/bucket-deployment-builder.js} +0 -0
  89. /package/dist/{bucket-deployment-defaults.js → esm/bucket-deployment-defaults.js} +0 -0
  90. /package/dist/{bucket-deployment-props.js → esm/bucket-deployment-props.js} +0 -0
  91. /package/dist/{defaults.js → esm/defaults.js} +0 -0
  92. /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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=alarm-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../src/alarm-config.ts"],"names":[],"mappings":""}
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":"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"}
@@ -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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"}
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=bucket-deployment-props.js.map
@@ -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"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BUCKET_DEFAULTS = exports.DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES = exports.DEFAULT_BUCKET_LIFECYCLE_RULES = void 0;
4
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ /**
7
+ * Aborts multipart uploads that have not completed within 7 days. AWS recommends
8
+ * this rule on every bucket — orphaned upload parts are billed as storage but
9
+ * never become objects, so the rule is pure cost hygiene with no functional
10
+ * downside.
11
+ *
12
+ * @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html
13
+ */
14
+ const ABORT_INCOMPLETE_MULTIPART_UPLOADS = {
15
+ id: "AbortIncompleteMultipartUploadAfter7Days",
16
+ abortIncompleteMultipartUploadAfter: aws_cdk_lib_1.Duration.days(7),
17
+ };
18
+ /**
19
+ * Lifecycle rules applied to general-purpose buckets built with
20
+ * {@link createBucketBuilder}. Bounds storage cost from orphaned multipart
21
+ * parts and from accumulated noncurrent versions of objects in versioned
22
+ * buckets, while preserving a generous recovery window.
23
+ *
24
+ * Users who need different rules can override the entire set via the
25
+ * `.lifecycleRules([...])` builder method.
26
+ */
27
+ exports.DEFAULT_BUCKET_LIFECYCLE_RULES = [
28
+ ABORT_INCOMPLETE_MULTIPART_UPLOADS,
29
+ {
30
+ /**
31
+ * Buckets default to `versioned: true`, so replaced and deleted objects
32
+ * accumulate as noncurrent versions indefinitely. Expiring them after a
33
+ * year preserves a long recovery window for "oops" deletions while
34
+ * preventing unbounded storage growth.
35
+ *
36
+ * @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-configuration-examples.html
37
+ */
38
+ id: "ExpireNoncurrentVersionsAfter365Days",
39
+ noncurrentVersionExpiration: aws_cdk_lib_1.Duration.days(365),
40
+ },
41
+ ];
42
+ /**
43
+ * Lifecycle rules applied to auto-created S3 server access log buckets and
44
+ * CloudFront access log buckets. Mirrors the 2-year retention used by
45
+ * {@link LOG_GROUP_DEFAULTS} so the audit window is consistent across log
46
+ * destinations in the library.
47
+ *
48
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/sec_detect_investigate_events_app_service_logging.html
49
+ */
50
+ exports.DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES = [
51
+ ABORT_INCOMPLETE_MULTIPART_UPLOADS,
52
+ {
53
+ id: "ExpireAccessLogsAfter2Years",
54
+ expiration: aws_cdk_lib_1.Duration.days(731),
55
+ },
56
+ ];
57
+ /**
58
+ * Secure, AWS-recommended defaults applied to every S3 bucket built
59
+ * with {@link createBucketBuilder}. Each property can be individually
60
+ * overridden via the builder's fluent API.
61
+ */
62
+ exports.BUCKET_DEFAULTS = {
63
+ /**
64
+ * Auto-create a dedicated logging bucket and write S3 server access logs
65
+ * to it under the `logs/` prefix. Access logging provides an audit trail
66
+ * of all object-level operations for security monitoring and
67
+ * troubleshooting.
68
+ *
69
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/sec_detect_investigate_events_app_service_logging.html
70
+ */
71
+ serverAccessLogs: { prefix: "logs/" },
72
+ /**
73
+ * Block all public access to the bucket. S3 buckets should not be
74
+ * publicly accessible unless explicitly required (e.g. static website
75
+ * hosting via CloudFront OAC).
76
+ * @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html
77
+ */
78
+ blockPublicAccess: aws_s3_1.BlockPublicAccess.BLOCK_ALL,
79
+ /**
80
+ * Enable server-side encryption with S3-managed keys (SSE-S3).
81
+ * This is the default and lowest-cost encryption option.
82
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/protecting-data-at-rest.html
83
+ */
84
+ encryption: aws_s3_1.BucketEncryption.S3_MANAGED,
85
+ /**
86
+ * Enforce SSL/TLS for all requests to the bucket.
87
+ * @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-best-practices.html
88
+ */
89
+ enforceSSL: true,
90
+ /**
91
+ * Enable versioning to protect against accidental deletions and
92
+ * support rollback.
93
+ * @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html
94
+ */
95
+ versioned: true,
96
+ /**
97
+ * Bound storage cost on every bucket: abort orphaned multipart uploads
98
+ * after 7 days and expire noncurrent object versions after 365 days.
99
+ *
100
+ * Override with `.lifecycleRules([...])` to supply your own rule set —
101
+ * the array is replaced wholesale, consistent with how every other
102
+ * builder default is overridden.
103
+ *
104
+ * @see {@link DEFAULT_BUCKET_LIFECYCLE_RULES}
105
+ */
106
+ lifecycleRules: exports.DEFAULT_BUCKET_LIFECYCLE_RULES,
107
+ /**
108
+ * Retain the bucket on stack deletion to prevent data loss.
109
+ *
110
+ * When overridden to `RemovalPolicy.DESTROY`, the builder automatically
111
+ * enables `autoDeleteObjects` (unless explicitly set to `false`) so that
112
+ * non-empty buckets can be cleanly removed during stack deletion.
113
+ *
114
+ * @see https://docs.aws.amazon.com/cdk/v2/guide/resources.html#resources_removal
115
+ */
116
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.RETAIN,
117
+ };
118
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":";;;AAAA,+CAA6F;AAC7F,6CAAsD;AAGtD;;;;;;;GAOG;AACH,MAAM,kCAAkC,GAAkB;IACxD,EAAE,EAAE,0CAA0C;IAC9C,mCAAmC,EAAE,sBAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;;;;GAQG;AACU,QAAA,8BAA8B,GAAoB;IAC7D,kCAAkC;IAClC;QACE;;;;;;;WAOG;QACH,EAAE,EAAE,sCAAsC;QAC1C,2BAA2B,EAAE,sBAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;KAChD;CACF,CAAC;AAEF;;;;;;;GAOG;AACU,QAAA,yCAAyC,GAAoB;IACxE,kCAAkC;IAClC;QACE,EAAE,EAAE,6BAA6B;QACjC,UAAU,EAAE,sBAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;KAC/B;CACF,CAAC;AAEF;;;;GAIG;AACU,QAAA,eAAe,GAAgC;IAC1D;;;;;;;OAOG;IACH,gBAAgB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;IAErC;;;;;OAKG;IACH,iBAAiB,EAAE,0BAAiB,CAAC,SAAS;IAE9C;;;;OAIG;IACH,UAAU,EAAE,yBAAgB,CAAC,UAAU;IAEvC;;;OAGG;IACH,UAAU,EAAE,IAAI;IAEhB;;;;OAIG;IACH,SAAS,EAAE,IAAI;IAEf;;;;;;;;;OASG;IACH,cAAc,EAAE,sCAA8B;IAE9C;;;;;;;;OAQG;IACH,aAAa,EAAE,2BAAa,CAAC,MAAM;CACpC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,yCAAyC,EACzC,8BAA8B,GAC/B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,6BAA6B,EAC7B,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,GAC9B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC"}