@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,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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BUCKET_DEPLOYMENT_DEFAULTS = exports.createBucketDeploymentBuilder = exports.BUCKET_ALARM_DEFAULTS = exports.DEFAULT_BUCKET_LIFECYCLE_RULES = exports.DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES = exports.BUCKET_DEFAULTS = exports.createBucketBuilder = void 0;
|
|
4
|
+
var bucket_builder_js_1 = require("./bucket-builder.js");
|
|
5
|
+
Object.defineProperty(exports, "createBucketBuilder", { enumerable: true, get: function () { return bucket_builder_js_1.createBucketBuilder; } });
|
|
6
|
+
var defaults_js_1 = require("./defaults.js");
|
|
7
|
+
Object.defineProperty(exports, "BUCKET_DEFAULTS", { enumerable: true, get: function () { return defaults_js_1.BUCKET_DEFAULTS; } });
|
|
8
|
+
Object.defineProperty(exports, "DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES", { enumerable: true, get: function () { return defaults_js_1.DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES; } });
|
|
9
|
+
Object.defineProperty(exports, "DEFAULT_BUCKET_LIFECYCLE_RULES", { enumerable: true, get: function () { return defaults_js_1.DEFAULT_BUCKET_LIFECYCLE_RULES; } });
|
|
10
|
+
var alarm_defaults_js_1 = require("./alarm-defaults.js");
|
|
11
|
+
Object.defineProperty(exports, "BUCKET_ALARM_DEFAULTS", { enumerable: true, get: function () { return alarm_defaults_js_1.BUCKET_ALARM_DEFAULTS; } });
|
|
12
|
+
var bucket_deployment_builder_js_1 = require("./bucket-deployment-builder.js");
|
|
13
|
+
Object.defineProperty(exports, "createBucketDeploymentBuilder", { enumerable: true, get: function () { return bucket_deployment_builder_js_1.createBucketDeploymentBuilder; } });
|
|
14
|
+
var bucket_deployment_defaults_js_1 = require("./bucket-deployment-defaults.js");
|
|
15
|
+
Object.defineProperty(exports, "BUCKET_DEPLOYMENT_DEFAULTS", { enumerable: true, get: function () { return bucket_deployment_defaults_js_1.BUCKET_DEPLOYMENT_DEFAULTS; } });
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yDAM6B;AAL3B,wHAAA,mBAAmB,OAAA;AAMrB,6CAIuB;AAHrB,8GAAA,eAAe,OAAA;AACf,wIAAA,yCAAyC,OAAA;AACzC,6HAAA,8BAA8B,OAAA;AAGhC,yDAA4D;AAAnD,0HAAA,qBAAqB,OAAA;AAC9B,+EAIwC;AAHtC,6IAAA,6BAA6B,OAAA;AAK/B,iFAA6E;AAApE,2IAAA,0BAA0B,OAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { AlarmConfig } from "@composurecdk/cloudwatch";
|
|
2
|
+
/**
|
|
3
|
+
* Controls which recommended alarms are created for an S3 bucket.
|
|
4
|
+
* All applicable alarms are enabled by default with AWS-recommended thresholds.
|
|
5
|
+
* Set individual alarms to `false` to disable them, or provide an
|
|
6
|
+
* {@link AlarmConfig} to tune thresholds.
|
|
7
|
+
*
|
|
8
|
+
* S3 request metric alarms (5xxErrors, 4xxErrors) require
|
|
9
|
+
* [CloudWatch request metrics](https://docs.aws.amazon.com/AmazonS3/latest/userguide/configure-request-metrics-bucket.html)
|
|
10
|
+
* to be enabled on the bucket. Alarms are automatically created for each
|
|
11
|
+
* entry in the bucket's {@link BucketProps.metrics} array, keyed by the
|
|
12
|
+
* metrics configuration ID (e.g. `serverErrors:EntireBucket`).
|
|
13
|
+
*
|
|
14
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
|
|
15
|
+
*/
|
|
16
|
+
export interface BucketAlarmConfig {
|
|
17
|
+
/**
|
|
18
|
+
* Master switch: set to `false` to disable all recommended alarms.
|
|
19
|
+
* Individual alarms can also be disabled via their own entry.
|
|
20
|
+
* @default true
|
|
21
|
+
*/
|
|
22
|
+
enabled?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Alarm when S3 returns server-side errors (5xx HTTP status codes).
|
|
25
|
+
*
|
|
26
|
+
* Metric: `AWS/S3 5xxErrors`, statistic Sum, period 5 minutes.
|
|
27
|
+
* Default threshold: > 0 errors.
|
|
28
|
+
*
|
|
29
|
+
* Only created when the bucket has request metrics configured via
|
|
30
|
+
* {@link BucketProps.metrics}. One alarm per metrics configuration.
|
|
31
|
+
*
|
|
32
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
|
|
33
|
+
*/
|
|
34
|
+
serverErrors?: AlarmConfig | false;
|
|
35
|
+
/**
|
|
36
|
+
* Alarm when S3 returns client-side errors (4xx HTTP status codes).
|
|
37
|
+
*
|
|
38
|
+
* Metric: `AWS/S3 4xxErrors`, statistic Sum, period 5 minutes.
|
|
39
|
+
* Default threshold: > 0 errors.
|
|
40
|
+
*
|
|
41
|
+
* Only created when the bucket has request metrics configured via
|
|
42
|
+
* {@link BucketProps.metrics}. One alarm per metrics configuration.
|
|
43
|
+
*
|
|
44
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
|
|
45
|
+
*/
|
|
46
|
+
clientErrors?: AlarmConfig | false;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=alarm-config.d.ts.map
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AlarmConfigDefaults } from "@composurecdk/cloudwatch";
|
|
2
|
+
interface BucketAlarmDefaults {
|
|
3
|
+
enabled: true;
|
|
4
|
+
serverErrors: AlarmConfigDefaults;
|
|
5
|
+
clientErrors: AlarmConfigDefaults;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* AWS-recommended default alarm configuration for S3 buckets.
|
|
9
|
+
*
|
|
10
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
|
|
11
|
+
*/
|
|
12
|
+
export declare const BUCKET_ALARM_DEFAULTS: BucketAlarmDefaults;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=alarm-defaults.d.ts.map
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-defaults.js","sourceRoot":"","sources":["../../src/alarm-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAS9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,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,gBAAgB,CAAC,aAAa;KACjD;IAED,yEAAyE;IACzE,YAAY,EAAE;QACZ,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;CACF,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type Alarm } from "aws-cdk-lib/aws-cloudwatch";
|
|
2
|
+
import type { Bucket, BucketMetrics } from "aws-cdk-lib/aws-s3";
|
|
3
|
+
import type { IConstruct } from "constructs";
|
|
4
|
+
import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
|
|
5
|
+
import type { AlarmDefinition } from "@composurecdk/cloudwatch";
|
|
6
|
+
import type { BucketAlarmConfig } from "./alarm-config.js";
|
|
7
|
+
/**
|
|
8
|
+
* Resolves the recommended alarm configuration into fully-resolved
|
|
9
|
+
* {@link AlarmDefinition}s for an S3 bucket.
|
|
10
|
+
*
|
|
11
|
+
* Creates alarms for each entry in `metricsConfigs`, keyed as
|
|
12
|
+
* `{alarmType}:{filterId}` (e.g. `serverErrors:EntireBucket`).
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveBucketAlarmDefinitions(bucket: Bucket, config: BucketAlarmConfig | undefined, metricsConfigs: BucketMetrics[]): AlarmDefinition[];
|
|
15
|
+
/**
|
|
16
|
+
* Creates AWS-recommended CloudWatch alarms for an S3 bucket,
|
|
17
|
+
* merging recommended definitions with any custom alarm builders.
|
|
18
|
+
*
|
|
19
|
+
* Alarms are created for each entry in `metricsConfigs` (from
|
|
20
|
+
* {@link BucketProps.metrics}). If no metrics configurations are
|
|
21
|
+
* provided, only custom alarms are created.
|
|
22
|
+
*
|
|
23
|
+
* @param scope - CDK construct scope for creating alarm constructs.
|
|
24
|
+
* @param id - Base identifier for alarm construct ids.
|
|
25
|
+
* @param bucket - The S3 bucket to create alarms for.
|
|
26
|
+
* @param config - User-provided alarm configuration, or `false` to disable all.
|
|
27
|
+
* @param metricsConfigs - The bucket's request metrics configurations.
|
|
28
|
+
* @param customAlarms - Custom alarm builders added via `addAlarm()`.
|
|
29
|
+
* @returns A record mapping alarm keys to their created Alarm constructs.
|
|
30
|
+
*
|
|
31
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
|
|
32
|
+
*/
|
|
33
|
+
export declare function createBucketAlarms(scope: IConstruct, id: string, bucket: Bucket, config: BucketAlarmConfig | false | undefined, metricsConfigs: BucketMetrics[], customAlarms?: AlarmDefinitionBuilder<Bucket>[]): Record<string, Alarm>;
|
|
34
|
+
//# sourceMappingURL=bucket-alarms.d.ts.map
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-alarms.js","sourceRoot":"","sources":["../../src/bucket-alarms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { type Alarm } from "aws-cdk-lib/aws-cloudwatch";
|
|
2
|
+
import { Bucket, type BucketProps, type IBucket } from "aws-cdk-lib/aws-s3";
|
|
3
|
+
import { type IConstruct } from "constructs";
|
|
4
|
+
import { COPY_STATE, type Lifecycle } from "@composurecdk/core";
|
|
5
|
+
import { type ITaggedBuilder } from "@composurecdk/cloudformation";
|
|
6
|
+
import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
|
|
7
|
+
import type { BucketAlarmConfig } from "./alarm-config.js";
|
|
8
|
+
/**
|
|
9
|
+
* Configures how server access logs are handled. Pass `false` to disable
|
|
10
|
+
* logging; pass an object to wire a destination, prefix, or customize the
|
|
11
|
+
* auto-created sub-builder.
|
|
12
|
+
*
|
|
13
|
+
* `configure` cannot be combined with `destination` — a user-managed
|
|
14
|
+
* destination is not built by this builder.
|
|
15
|
+
*/
|
|
16
|
+
export type ServerAccessLogsConfig = false | {
|
|
17
|
+
destination?: IBucket;
|
|
18
|
+
prefix?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Customize the auto-created logging sub-builder. Receives a builder
|
|
21
|
+
* pre-seeded with `versioned: false`, `removalPolicy: RETAIN`, and
|
|
22
|
+
* recursive access logging disabled.
|
|
23
|
+
*/
|
|
24
|
+
configure?: (b: IBucketBuilder) => IBucketBuilder;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Configuration properties for the S3 bucket builder. Extends CDK
|
|
28
|
+
* {@link BucketProps} with builder-specific options.
|
|
29
|
+
*/
|
|
30
|
+
export interface BucketBuilderProps extends Omit<BucketProps, "serverAccessLogsBucket" | "serverAccessLogsPrefix"> {
|
|
31
|
+
/** See {@link ServerAccessLogsConfig}. Defaults to `{ prefix: "logs/" }`. */
|
|
32
|
+
serverAccessLogs?: ServerAccessLogsConfig;
|
|
33
|
+
/**
|
|
34
|
+
* Configuration for AWS-recommended CloudWatch alarms.
|
|
35
|
+
*
|
|
36
|
+
* S3 request metric alarms (5xxErrors, 4xxErrors) require
|
|
37
|
+
* [CloudWatch request metrics](https://docs.aws.amazon.com/AmazonS3/latest/userguide/configure-request-metrics-bucket.html)
|
|
38
|
+
* to be enabled on the bucket. Set {@link BucketAlarmConfig.requestMetricsFilterId}
|
|
39
|
+
* to the ID of the request metrics configuration to create these alarms.
|
|
40
|
+
*
|
|
41
|
+
* No alarm actions are configured by default since notification
|
|
42
|
+
* methods are user-specific. Access alarms from the build result
|
|
43
|
+
* or use an `afterBuild` hook to apply actions.
|
|
44
|
+
*
|
|
45
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
|
|
46
|
+
*/
|
|
47
|
+
recommendedAlarms?: BucketAlarmConfig | false;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The build output of a {@link IBucketBuilder}. Contains the CDK constructs
|
|
51
|
+
* created during {@link Lifecycle.build}, keyed by role.
|
|
52
|
+
*/
|
|
53
|
+
export interface BucketBuilderResult {
|
|
54
|
+
/** The S3 bucket construct created by the builder. */
|
|
55
|
+
bucket: Bucket;
|
|
56
|
+
/**
|
|
57
|
+
* The S3 bucket created for access logging, or `undefined` if access
|
|
58
|
+
* logging was disabled or the user provided their own destination.
|
|
59
|
+
*/
|
|
60
|
+
accessLogsBucket?: Bucket;
|
|
61
|
+
/**
|
|
62
|
+
* CloudWatch alarms created for the bucket, keyed by alarm name.
|
|
63
|
+
*
|
|
64
|
+
* Includes both AWS-recommended alarms and any custom alarms added
|
|
65
|
+
* via {@link IBucketBuilder.addAlarm}. Access individual alarms
|
|
66
|
+
* by key (e.g., `result.alarms.serverErrors`).
|
|
67
|
+
*
|
|
68
|
+
* No alarm actions are configured — apply them via the result or an
|
|
69
|
+
* `afterBuild` hook.
|
|
70
|
+
*
|
|
71
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
|
|
72
|
+
*/
|
|
73
|
+
alarms: Record<string, Alarm>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* A fluent builder for configuring and creating an Amazon S3 bucket.
|
|
77
|
+
*
|
|
78
|
+
* Each configuration property from the CDK {@link BucketProps} is exposed
|
|
79
|
+
* as an overloaded method: call with a value to set it (returns the builder
|
|
80
|
+
* for chaining), or call with no arguments to read the current value.
|
|
81
|
+
*
|
|
82
|
+
* The builder implements {@link Lifecycle}, so it can be used directly as a
|
|
83
|
+
* component in a {@link compose | composed system}. When built, it creates
|
|
84
|
+
* an S3 bucket with the configured properties and returns a
|
|
85
|
+
* {@link BucketBuilderResult}.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```ts
|
|
89
|
+
* const site = createBucketBuilder()
|
|
90
|
+
* .bucketName("my-website-bucket")
|
|
91
|
+
* .versioned(false);
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export type IBucketBuilder = ITaggedBuilder<BucketBuilderProps, BucketBuilder>;
|
|
95
|
+
declare class BucketBuilder implements Lifecycle<BucketBuilderResult> {
|
|
96
|
+
#private;
|
|
97
|
+
props: Partial<BucketBuilderProps>;
|
|
98
|
+
addAlarm(key: string, configure: (alarm: AlarmDefinitionBuilder<Bucket>) => AlarmDefinitionBuilder<Bucket>): this;
|
|
99
|
+
/** @internal — see ADR-0005. */
|
|
100
|
+
[COPY_STATE](target: BucketBuilder): void;
|
|
101
|
+
build(scope: IConstruct, id: string): BucketBuilderResult;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Creates a new {@link IBucketBuilder} for configuring an Amazon S3 bucket.
|
|
105
|
+
*
|
|
106
|
+
* This is the entry point for defining an S3 bucket component. The returned
|
|
107
|
+
* builder exposes every {@link BucketProps} property as a fluent setter/getter
|
|
108
|
+
* and implements {@link Lifecycle} for use with {@link compose}.
|
|
109
|
+
*
|
|
110
|
+
* @returns A fluent builder for an Amazon S3 bucket.
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```ts
|
|
114
|
+
* const site = createBucketBuilder()
|
|
115
|
+
* .bucketName("my-site")
|
|
116
|
+
* .versioned(false);
|
|
117
|
+
*
|
|
118
|
+
* // Use standalone:
|
|
119
|
+
* const result = site.build(stack, "SiteBucket");
|
|
120
|
+
*
|
|
121
|
+
* // Or compose into a system:
|
|
122
|
+
* const system = compose(
|
|
123
|
+
* { site, cdn: createDistributionBuilder() },
|
|
124
|
+
* { site: [], cdn: ["site"] },
|
|
125
|
+
* );
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
export declare function createBucketBuilder(): IBucketBuilder;
|
|
129
|
+
export {};
|
|
130
|
+
//# sourceMappingURL=bucket-builder.d.ts.map
|
|
@@ -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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { RemovalPolicy } from "aws-cdk-lib";
|
|
2
2
|
import { Bucket } from "aws-cdk-lib/aws-s3";
|
|
3
|
-
import {
|
|
3
|
+
import { COPY_STATE } from "@composurecdk/core";
|
|
4
|
+
import { taggedBuilder } from "@composurecdk/cloudformation";
|
|
4
5
|
import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
|
|
5
6
|
import { createBucketAlarms } from "./bucket-alarms.js";
|
|
6
7
|
import { DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES, BUCKET_DEFAULTS } from "./defaults.js";
|
|
@@ -11,6 +12,10 @@ class BucketBuilder {
|
|
|
11
12
|
this.#customAlarms.push(configure(new AlarmDefinitionBuilder(key)));
|
|
12
13
|
return this;
|
|
13
14
|
}
|
|
15
|
+
/** @internal — see ADR-0005. */
|
|
16
|
+
[COPY_STATE](target) {
|
|
17
|
+
target.#customAlarms.push(...this.#customAlarms);
|
|
18
|
+
}
|
|
14
19
|
build(scope, id) {
|
|
15
20
|
const { serverAccessLogs, recommendedAlarms: alarmConfig, ...bucketProps } = this.props;
|
|
16
21
|
const { serverAccessLogs: defaultServerAccessLogs, ...cdkDefaults } = BUCKET_DEFAULTS;
|
|
@@ -105,6 +110,6 @@ function autoDeleteProps(userProps, defaults) {
|
|
|
105
110
|
* ```
|
|
106
111
|
*/
|
|
107
112
|
export function createBucketBuilder() {
|
|
108
|
-
return
|
|
113
|
+
return taggedBuilder(BucketBuilder);
|
|
109
114
|
}
|
|
110
115
|
//# 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,113 @@
|
|
|
1
|
+
import { BucketDeployment } from "aws-cdk-lib/aws-s3-deployment";
|
|
2
|
+
import { type IBucket } from "aws-cdk-lib/aws-s3";
|
|
3
|
+
import { type IDistribution } from "aws-cdk-lib/aws-cloudfront";
|
|
4
|
+
import type { LogGroup } from "aws-cdk-lib/aws-logs";
|
|
5
|
+
import { type IConstruct } from "constructs";
|
|
6
|
+
import { COPY_STATE, type Lifecycle, type Resolvable } from "@composurecdk/core";
|
|
7
|
+
import { type ITaggedBuilder } from "@composurecdk/cloudformation";
|
|
8
|
+
import { type BucketDeploymentBuilderProps } from "./bucket-deployment-props.js";
|
|
9
|
+
/**
|
|
10
|
+
* The build output of a {@link IBucketDeploymentBuilder}.
|
|
11
|
+
*/
|
|
12
|
+
export interface BucketDeploymentBuilderResult {
|
|
13
|
+
/** The CDK BucketDeployment construct created by the builder. */
|
|
14
|
+
deployment: BucketDeployment;
|
|
15
|
+
/**
|
|
16
|
+
* The CloudWatch LogGroup created for the deployment's backing Lambda,
|
|
17
|
+
* or `undefined` if the user provided their own via the `logGroup`
|
|
18
|
+
* property.
|
|
19
|
+
*
|
|
20
|
+
* By default the builder creates a managed LogGroup using
|
|
21
|
+
* {@link createLogGroupBuilder} with well-architected defaults (retention
|
|
22
|
+
* policy, removal policy). This prevents the backing Lambda from
|
|
23
|
+
* creating an auto-managed log group with infinite retention.
|
|
24
|
+
*
|
|
25
|
+
* @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_deployment.BucketDeploymentProps.html#loggroup
|
|
26
|
+
*/
|
|
27
|
+
logGroup?: LogGroup;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A fluent builder for configuring and creating an S3 BucketDeployment.
|
|
31
|
+
*
|
|
32
|
+
* Each configuration property from the CDK {@link BucketDeploymentProps} is
|
|
33
|
+
* exposed as an overloaded method: call with a value to set it (returns the
|
|
34
|
+
* builder for chaining), or call with no arguments to read the current value.
|
|
35
|
+
*
|
|
36
|
+
* The `destinationBucket` and `distribution` are set via dedicated methods
|
|
37
|
+
* that accept {@link Resolvable} values for cross-component wiring.
|
|
38
|
+
*
|
|
39
|
+
* The builder implements {@link Lifecycle}, so it can be used directly as a
|
|
40
|
+
* component in a {@link compose | composed system}.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* const deploy = createBucketDeploymentBuilder()
|
|
45
|
+
* .sources([Source.asset("./site")])
|
|
46
|
+
* .destinationBucket(ref("site", (r: BucketBuilderResult) => r.bucket))
|
|
47
|
+
* .distribution(ref("cdn", (r: DistributionBuilderResult) => r.distribution))
|
|
48
|
+
* .distributionPaths(["/*"]);
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export type IBucketDeploymentBuilder = ITaggedBuilder<BucketDeploymentBuilderProps, BucketDeploymentBuilder>;
|
|
52
|
+
declare class BucketDeploymentBuilder implements Lifecycle<BucketDeploymentBuilderResult> {
|
|
53
|
+
#private;
|
|
54
|
+
props: Partial<BucketDeploymentBuilderProps>;
|
|
55
|
+
/**
|
|
56
|
+
* Sets the destination bucket for the deployment.
|
|
57
|
+
*
|
|
58
|
+
* Accepts a concrete {@link IBucket} or a {@link Ref} that resolves to one
|
|
59
|
+
* at build time.
|
|
60
|
+
*
|
|
61
|
+
* @param bucket - The bucket or a Ref to one.
|
|
62
|
+
* @returns This builder for chaining.
|
|
63
|
+
*/
|
|
64
|
+
destinationBucket(bucket: Resolvable<IBucket>): this;
|
|
65
|
+
/**
|
|
66
|
+
* Sets the CloudFront distribution to invalidate on deployment.
|
|
67
|
+
*
|
|
68
|
+
* Accepts a concrete {@link IDistribution} or a {@link Ref} that resolves
|
|
69
|
+
* to one at build time. This is optional — deployments can target a bucket
|
|
70
|
+
* without CloudFront invalidation.
|
|
71
|
+
*
|
|
72
|
+
* @param distribution - The distribution or a Ref to one.
|
|
73
|
+
* @returns This builder for chaining.
|
|
74
|
+
*/
|
|
75
|
+
distribution(distribution: Resolvable<IDistribution>): this;
|
|
76
|
+
/** @internal — see ADR-0005. */
|
|
77
|
+
[COPY_STATE](target: BucketDeploymentBuilder): void;
|
|
78
|
+
build(scope: IConstruct, id: string, context?: Record<string, object>): BucketDeploymentBuilderResult;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Creates a new {@link IBucketDeploymentBuilder} for deploying content to an
|
|
82
|
+
* S3 bucket with optional CloudFront cache invalidation.
|
|
83
|
+
*
|
|
84
|
+
* This is the entry point for defining an S3 deployment component. The
|
|
85
|
+
* returned builder exposes {@link BucketDeploymentBuilderProps} properties as
|
|
86
|
+
* fluent setters/getters, plus {@link IBucketDeploymentBuilder.destinationBucket | destinationBucket()}
|
|
87
|
+
* and {@link IBucketDeploymentBuilder.distribution | distribution()} for
|
|
88
|
+
* cross-component wiring with Ref support. It implements {@link Lifecycle}
|
|
89
|
+
* for use with {@link compose}.
|
|
90
|
+
*
|
|
91
|
+
* @returns A fluent builder for an S3 BucketDeployment.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* const deploy = createBucketDeploymentBuilder()
|
|
96
|
+
* .sources([Source.asset("./site")])
|
|
97
|
+
* .destinationBucket(ref("site", (r: BucketBuilderResult) => r.bucket))
|
|
98
|
+
* .distribution(ref("cdn", (r: DistributionBuilderResult) => r.distribution))
|
|
99
|
+
* .distributionPaths(["/*"]);
|
|
100
|
+
*
|
|
101
|
+
* // Use standalone:
|
|
102
|
+
* const result = deploy.build(stack, "Deploy");
|
|
103
|
+
*
|
|
104
|
+
* // Or compose into a system:
|
|
105
|
+
* const system = compose(
|
|
106
|
+
* { site: createBucketBuilder(), cdn: createDistributionBuilder(), deploy },
|
|
107
|
+
* { site: [], cdn: ["site"], deploy: ["site", "cdn"] },
|
|
108
|
+
* );
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export declare function createBucketDeploymentBuilder(): IBucketDeploymentBuilder;
|
|
112
|
+
export {};
|
|
113
|
+
//# sourceMappingURL=bucket-deployment-builder.d.ts.map
|
|
@@ -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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BucketDeployment } from "aws-cdk-lib/aws-s3-deployment";
|
|
2
|
-
import {
|
|
2
|
+
import { COPY_STATE, resolve } from "@composurecdk/core";
|
|
3
|
+
import { taggedBuilder } from "@composurecdk/cloudformation";
|
|
3
4
|
import { createLogGroupBuilder } from "@composurecdk/logs";
|
|
4
5
|
import { effectiveDefaults } from "./bucket-deployment-defaults.js";
|
|
5
6
|
class BucketDeploymentBuilder {
|
|
@@ -33,6 +34,11 @@ class BucketDeploymentBuilder {
|
|
|
33
34
|
this.#distribution = distribution;
|
|
34
35
|
return this;
|
|
35
36
|
}
|
|
37
|
+
/** @internal — see ADR-0005. */
|
|
38
|
+
[COPY_STATE](target) {
|
|
39
|
+
target.#destinationBucket = this.#destinationBucket;
|
|
40
|
+
target.#distribution = this.#distribution;
|
|
41
|
+
}
|
|
36
42
|
build(scope, id, context) {
|
|
37
43
|
const ctx = context ?? {};
|
|
38
44
|
const resolvedBucket = this.#destinationBucket
|
|
@@ -102,6 +108,6 @@ class BucketDeploymentBuilder {
|
|
|
102
108
|
* ```
|
|
103
109
|
*/
|
|
104
110
|
export function createBucketDeploymentBuilder() {
|
|
105
|
-
return
|
|
111
|
+
return taggedBuilder(BucketDeploymentBuilder);
|
|
106
112
|
}
|
|
107
113
|
//# 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":"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"}
|