s3-secure-bucket 0.3.6 → 0.4.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/.jsii +20 -19
- package/API.md +8 -4
- package/lib/bucket-policies/access-log-bucket-policy.d.ts +15 -0
- package/lib/bucket-policies/access-log-bucket-policy.js +118 -0
- package/lib/bucket-policies/cloud-watch-log-archive-policy.d.ts +15 -0
- package/lib/bucket-policies/cloud-watch-log-archive-policy.js +89 -0
- package/lib/bucket-policies/deployment-pipeline-artifact-policy.d.ts +11 -0
- package/lib/bucket-policies/deployment-pipeline-artifact-policy.js +69 -0
- package/lib/bucket-policies/index.d.ts +18 -0
- package/lib/bucket-policies/index.js +36 -0
- package/lib/bucket-policies/types.d.ts +22 -0
- package/lib/bucket-policies/types.js +3 -0
- package/lib/bucket-types/bucket-type.d.ts +48 -0
- package/lib/bucket-types/bucket-type.js +48 -0
- package/lib/bucket-types/encryption-default.d.ts +14 -0
- package/lib/bucket-types/encryption-default.js +59 -0
- package/lib/bucket-types/index.d.ts +8 -0
- package/lib/bucket-types/index.js +13 -0
- package/lib/bucket-types/props.d.ts +16 -0
- package/lib/bucket-types/props.js +37 -0
- package/lib/index.d.ts +5 -80
- package/lib/index.js +8 -255
- package/lib/s3-secure-bucket.d.ts +43 -0
- package/lib/s3-secure-bucket.js +118 -0
- package/package.json +6 -7
package/.jsii
CHANGED
|
@@ -8440,7 +8440,7 @@
|
|
|
8440
8440
|
"stability": "stable"
|
|
8441
8441
|
},
|
|
8442
8442
|
"homepage": "https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket.git",
|
|
8443
|
-
"jsiiVersion": "
|
|
8443
|
+
"jsiiVersion": "6.0.4 (build 308d98d)",
|
|
8444
8444
|
"keywords": [
|
|
8445
8445
|
"cdk"
|
|
8446
8446
|
],
|
|
@@ -8473,7 +8473,7 @@
|
|
|
8473
8473
|
"base": "aws-cdk-lib.aws_s3.Bucket",
|
|
8474
8474
|
"docs": {
|
|
8475
8475
|
"custom": {
|
|
8476
|
-
"remarks": "- {@link S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET }: may attach a deploy-role policy when a non-default bootstrap qualifier is present.\n- {@link S3SecureBucketType.ACCESS_LOG_BUCKET }: adds log-writer principals; see {@link
|
|
8476
|
+
"remarks": "Secure defaults applied regardless of `props`:\n- `removalPolicy`: {@link RemovalPolicy.RETAIN }\n- `publicReadAccess`: `false`\n- `blockPublicAccess`: {@link s3.BlockPublicAccess.BLOCK_ALL }\n- `enforceSSL`: `true`\n- `versioned`: `true` unless explicitly set in `props`\n- `objectOwnership`: {@link s3.ObjectOwnership.BUCKET_OWNER_ENFORCED } unless overridden\n- `accessControl`: {@link s3.BucketAccessControl.PRIVATE } unless overridden\n\nBucket-type-specific behavior:\n- {@link S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET }: may attach a deploy-role policy when a non-default bootstrap qualifier is present.\n- {@link S3SecureBucketType.ACCESS_LOG_BUCKET }: adds log-writer principals; see {@link S3SecureBucket#accessLogBucketPolicyDependable }.\n- {@link S3SecureBucketType.CLOUD_WATCH_LOG_ARCHIVE_BUCKET }: adds CloudWatch Logs export principals (`logs.<region>.amazonaws.com`)."
|
|
8477
8477
|
},
|
|
8478
8478
|
"remarks": "KMS-managed by default otherwise).",
|
|
8479
8479
|
"stability": "stable",
|
|
@@ -8486,8 +8486,8 @@
|
|
|
8486
8486
|
"summary": "Creates a secure S3 bucket according to `bucketType` and merged `props`."
|
|
8487
8487
|
},
|
|
8488
8488
|
"locationInModule": {
|
|
8489
|
-
"filename": "src/
|
|
8490
|
-
"line":
|
|
8489
|
+
"filename": "src/s3-secure-bucket.ts",
|
|
8490
|
+
"line": 50
|
|
8491
8491
|
},
|
|
8492
8492
|
"parameters": [
|
|
8493
8493
|
{
|
|
@@ -8510,7 +8510,8 @@
|
|
|
8510
8510
|
},
|
|
8511
8511
|
{
|
|
8512
8512
|
"docs": {
|
|
8513
|
-
"
|
|
8513
|
+
"remarks": "secure defaults override several {@link s3.BucketProps} fields.\nWhen `eventBridgeEnabled` is `true`, EventBridge notification is enabled via an L1 property override.",
|
|
8514
|
+
"summary": "- Optional {@link S3SecureBucketProps};"
|
|
8514
8515
|
},
|
|
8515
8516
|
"name": "props",
|
|
8516
8517
|
"optional": true,
|
|
@@ -8522,8 +8523,8 @@
|
|
|
8522
8523
|
},
|
|
8523
8524
|
"kind": "class",
|
|
8524
8525
|
"locationInModule": {
|
|
8525
|
-
"filename": "src/
|
|
8526
|
-
"line":
|
|
8526
|
+
"filename": "src/s3-secure-bucket.ts",
|
|
8527
|
+
"line": 30
|
|
8527
8528
|
},
|
|
8528
8529
|
"name": "S3SecureBucket",
|
|
8529
8530
|
"properties": [
|
|
@@ -8536,8 +8537,8 @@
|
|
|
8536
8537
|
},
|
|
8537
8538
|
"immutable": true,
|
|
8538
8539
|
"locationInModule": {
|
|
8539
|
-
"filename": "src/
|
|
8540
|
-
"line":
|
|
8540
|
+
"filename": "src/s3-secure-bucket.ts",
|
|
8541
|
+
"line": 40
|
|
8541
8542
|
},
|
|
8542
8543
|
"name": "accessLogBucketPolicyDependable",
|
|
8543
8544
|
"optional": true,
|
|
@@ -8546,15 +8547,15 @@
|
|
|
8546
8547
|
}
|
|
8547
8548
|
}
|
|
8548
8549
|
],
|
|
8549
|
-
"symbolId": "src/
|
|
8550
|
+
"symbolId": "src/s3-secure-bucket:S3SecureBucket"
|
|
8550
8551
|
},
|
|
8551
8552
|
"s3-secure-bucket.S3SecureBucketProps": {
|
|
8552
8553
|
"assembly": "s3-secure-bucket",
|
|
8553
8554
|
"datatype": true,
|
|
8554
8555
|
"docs": {
|
|
8555
|
-
"remarks": "Extends {@link s3.BucketProps}
|
|
8556
|
+
"remarks": "Extends {@link s3.BucketProps}. Several fields receive secure defaults inside the construct\nand may be overridden unless documented otherwise on {@link S3SecureBucket }.",
|
|
8556
8557
|
"stability": "stable",
|
|
8557
|
-
"summary": "Construction properties for {@link S3SecureBucket}."
|
|
8558
|
+
"summary": "Construction properties for {@link S3SecureBucket }."
|
|
8558
8559
|
},
|
|
8559
8560
|
"fqn": "s3-secure-bucket.S3SecureBucketProps",
|
|
8560
8561
|
"interfaces": [
|
|
@@ -8562,8 +8563,8 @@
|
|
|
8562
8563
|
],
|
|
8563
8564
|
"kind": "interface",
|
|
8564
8565
|
"locationInModule": {
|
|
8565
|
-
"filename": "src/
|
|
8566
|
-
"line":
|
|
8566
|
+
"filename": "src/bucket-types/props.ts",
|
|
8567
|
+
"line": 10
|
|
8567
8568
|
},
|
|
8568
8569
|
"name": "S3SecureBucketProps",
|
|
8569
8570
|
"properties": [
|
|
@@ -8576,8 +8577,8 @@
|
|
|
8576
8577
|
},
|
|
8577
8578
|
"immutable": true,
|
|
8578
8579
|
"locationInModule": {
|
|
8579
|
-
"filename": "src/
|
|
8580
|
-
"line":
|
|
8580
|
+
"filename": "src/bucket-types/props.ts",
|
|
8581
|
+
"line": 17
|
|
8581
8582
|
},
|
|
8582
8583
|
"name": "bucketType",
|
|
8583
8584
|
"optional": true,
|
|
@@ -8586,9 +8587,9 @@
|
|
|
8586
8587
|
}
|
|
8587
8588
|
}
|
|
8588
8589
|
],
|
|
8589
|
-
"symbolId": "src/
|
|
8590
|
+
"symbolId": "src/bucket-types/props:S3SecureBucketProps"
|
|
8590
8591
|
}
|
|
8591
8592
|
},
|
|
8592
|
-
"version": "0.
|
|
8593
|
-
"fingerprint": "
|
|
8593
|
+
"version": "0.4.0",
|
|
8594
|
+
"fingerprint": "IAroCrVpkxm3+mfHUQefTkwPtX/MziEuzZgBKD0YjpA="
|
|
8594
8595
|
}
|
package/API.md
CHANGED
|
@@ -20,7 +20,7 @@ new S3SecureBucket(scope: Construct, id: string, props?: S3SecureBucketProps)
|
|
|
20
20
|
| --- | --- | --- |
|
|
21
21
|
| <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | - Parent construct, typically a {@link Stack}. |
|
|
22
22
|
| <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.id">id</a></code> | <code>string</code> | - Construct ID (stable logical ID segment). |
|
|
23
|
-
| <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.props">props</a></code> | <code><a href="#s3-secure-bucket.S3SecureBucketProps">S3SecureBucketProps</a></code> | - Optional {@link
|
|
23
|
+
| <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.props">props</a></code> | <code><a href="#s3-secure-bucket.S3SecureBucketProps">S3SecureBucketProps</a></code> | - Optional {@link S3SecureBucketProps}; |
|
|
24
24
|
|
|
25
25
|
---
|
|
26
26
|
|
|
@@ -44,7 +44,10 @@ Construct ID (stable logical ID segment).
|
|
|
44
44
|
|
|
45
45
|
- *Type:* <a href="#s3-secure-bucket.S3SecureBucketProps">S3SecureBucketProps</a>
|
|
46
46
|
|
|
47
|
-
Optional {@link
|
|
47
|
+
Optional {@link S3SecureBucketProps};
|
|
48
|
+
|
|
49
|
+
secure defaults override several {@link s3.BucketProps} fields.
|
|
50
|
+
When `eventBridgeEnabled` is `true`, EventBridge notification is enabled via an L1 property override.
|
|
48
51
|
|
|
49
52
|
---
|
|
50
53
|
|
|
@@ -1351,9 +1354,10 @@ Uniquely identifies this class.
|
|
|
1351
1354
|
|
|
1352
1355
|
### S3SecureBucketProps <a name="S3SecureBucketProps" id="s3-secure-bucket.S3SecureBucketProps"></a>
|
|
1353
1356
|
|
|
1354
|
-
Construction properties for {@link S3SecureBucket}.
|
|
1357
|
+
Construction properties for {@link S3SecureBucket }.
|
|
1355
1358
|
|
|
1356
|
-
Extends {@link s3.BucketProps}
|
|
1359
|
+
Extends {@link s3.BucketProps}. Several fields receive secure defaults inside the construct
|
|
1360
|
+
and may be overridden unless documented otherwise on {@link S3SecureBucket }.
|
|
1357
1361
|
|
|
1358
1362
|
#### Initializer <a name="Initializer" id="s3-secure-bucket.S3SecureBucketProps.Initializer"></a>
|
|
1359
1363
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BucketPolicyApplyResult, BucketPolicyContext } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Adds resource policies for ALB/NLB, CloudFront standard logging (v2), and S3 server access logging.
|
|
4
|
+
*
|
|
5
|
+
* Grants `s3:PutObject` on `AWSLogs/<stack.account>/*` to:
|
|
6
|
+
* - `logdelivery.elasticloadbalancing.amazonaws.com`
|
|
7
|
+
* - The regional ELBv2 log-delivery account (when known)
|
|
8
|
+
* - `delivery.logs.amazonaws.com`
|
|
9
|
+
* - `logging.s3.amazonaws.com`
|
|
10
|
+
*
|
|
11
|
+
* @param context - Bucket and owning stack (account and region are read from `stack`).
|
|
12
|
+
* @returns A result containing {@link BucketPolicyApplyResult.accessLogBucketPolicyDependable} for the
|
|
13
|
+
* first (ELB) policy statement so load balancer log enablement can wait until the bucket policy exists.
|
|
14
|
+
*/
|
|
15
|
+
export declare const applyAccessLogBucketPolicy: ({ bucket, stack, }: BucketPolicyContext) => BucketPolicyApplyResult;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.applyAccessLogBucketPolicy = void 0;
|
|
37
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
38
|
+
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
39
|
+
const region_info_1 = require("aws-cdk-lib/region-info");
|
|
40
|
+
/**
|
|
41
|
+
* Adds resource policies for ALB/NLB, CloudFront standard logging (v2), and S3 server access logging.
|
|
42
|
+
*
|
|
43
|
+
* Grants `s3:PutObject` on `AWSLogs/<stack.account>/*` to:
|
|
44
|
+
* - `logdelivery.elasticloadbalancing.amazonaws.com`
|
|
45
|
+
* - The regional ELBv2 log-delivery account (when known)
|
|
46
|
+
* - `delivery.logs.amazonaws.com`
|
|
47
|
+
* - `logging.s3.amazonaws.com`
|
|
48
|
+
*
|
|
49
|
+
* @param context - Bucket and owning stack (account and region are read from `stack`).
|
|
50
|
+
* @returns A result containing {@link BucketPolicyApplyResult.accessLogBucketPolicyDependable} for the
|
|
51
|
+
* first (ELB) policy statement so load balancer log enablement can wait until the bucket policy exists.
|
|
52
|
+
*/
|
|
53
|
+
const applyAccessLogBucketPolicy = ({ bucket, stack, }) => {
|
|
54
|
+
const awsLogsPrefixResource = `${bucket.bucketArn}/AWSLogs/${stack.account}/*`;
|
|
55
|
+
// Allow ALB / NLB log delivery (modern service principal path; also required in opt-in regions).
|
|
56
|
+
const albLogDeliveryPolicyResult = bucket.addToResourcePolicy(new iam.PolicyStatement({
|
|
57
|
+
effect: iam.Effect.ALLOW,
|
|
58
|
+
principals: [
|
|
59
|
+
new iam.ServicePrincipal('logdelivery.elasticloadbalancing.amazonaws.com'),
|
|
60
|
+
],
|
|
61
|
+
actions: [
|
|
62
|
+
's3:PutObject',
|
|
63
|
+
],
|
|
64
|
+
resources: [
|
|
65
|
+
awsLogsPrefixResource,
|
|
66
|
+
],
|
|
67
|
+
}));
|
|
68
|
+
// In non–opt-in regions (for example ap-northeast-1), access logs are often delivered using the
|
|
69
|
+
// regional ELBv2 account (root of that account) for s3:PutObject, not only the service principal above.
|
|
70
|
+
const elbAccountId = aws_cdk_lib_1.Token.isUnresolved(stack.region)
|
|
71
|
+
? stack.regionalFact(region_info_1.FactName.ELBV2_ACCOUNT)
|
|
72
|
+
: region_info_1.RegionInfo.get(stack.region).elbv2Account;
|
|
73
|
+
if (elbAccountId) {
|
|
74
|
+
bucket.addToResourcePolicy(new iam.PolicyStatement({
|
|
75
|
+
effect: iam.Effect.ALLOW,
|
|
76
|
+
principals: [
|
|
77
|
+
new iam.AccountPrincipal(elbAccountId),
|
|
78
|
+
],
|
|
79
|
+
actions: [
|
|
80
|
+
's3:PutObject',
|
|
81
|
+
],
|
|
82
|
+
resources: [
|
|
83
|
+
awsLogsPrefixResource,
|
|
84
|
+
],
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
// Allow CloudFront standard logging (v2) to write logs
|
|
88
|
+
bucket.addToResourcePolicy(new iam.PolicyStatement({
|
|
89
|
+
effect: iam.Effect.ALLOW,
|
|
90
|
+
principals: [
|
|
91
|
+
new iam.ServicePrincipal('delivery.logs.amazonaws.com'),
|
|
92
|
+
],
|
|
93
|
+
actions: [
|
|
94
|
+
's3:PutObject',
|
|
95
|
+
],
|
|
96
|
+
resources: [
|
|
97
|
+
awsLogsPrefixResource,
|
|
98
|
+
],
|
|
99
|
+
}));
|
|
100
|
+
// Allow S3 server access logging to write logs when required by configuration
|
|
101
|
+
bucket.addToResourcePolicy(new iam.PolicyStatement({
|
|
102
|
+
effect: iam.Effect.ALLOW,
|
|
103
|
+
principals: [
|
|
104
|
+
new iam.ServicePrincipal('logging.s3.amazonaws.com'),
|
|
105
|
+
],
|
|
106
|
+
actions: [
|
|
107
|
+
's3:PutObject',
|
|
108
|
+
],
|
|
109
|
+
resources: [
|
|
110
|
+
awsLogsPrefixResource,
|
|
111
|
+
],
|
|
112
|
+
}));
|
|
113
|
+
return {
|
|
114
|
+
accessLogBucketPolicyDependable: albLogDeliveryPolicyResult.policyDependable ?? bucket,
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
exports.applyAccessLogBucketPolicy = applyAccessLogBucketPolicy;
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWxvZy1idWNrZXQtcG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1Y2tldC1wb2xpY2llcy9hY2Nlc3MtbG9nLWJ1Y2tldC1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQW9DO0FBQ3BDLHlEQUEyQztBQUMzQyx5REFBK0Q7QUFHL0Q7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0ksTUFBTSwwQkFBMEIsR0FBRyxDQUFDLEVBQ3pDLE1BQU0sRUFDTixLQUFLLEdBQ2UsRUFBMkIsRUFBRTtJQUNqRCxNQUFNLHFCQUFxQixHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsWUFBWSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUM7SUFFL0UsaUdBQWlHO0lBQ2pHLE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUNwRixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1FBQ3hCLFVBQVUsRUFBRTtZQUNWLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLGdEQUFnRCxDQUFDO1NBQzNFO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsY0FBYztTQUNmO1FBQ0QsU0FBUyxFQUFFO1lBQ1QscUJBQXFCO1NBQ3RCO0tBQ0YsQ0FBQyxDQUFDLENBQUM7SUFFSixnR0FBZ0c7SUFDaEcsd0dBQXdHO0lBQ3hHLE1BQU0sWUFBWSxHQUFHLG1CQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDbkQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsc0JBQVEsQ0FBQyxhQUFhLENBQUM7UUFDNUMsQ0FBQyxDQUFDLHdCQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDOUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO1lBQ2pELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7WUFDeEIsVUFBVSxFQUFFO2dCQUNWLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQzthQUN2QztZQUNELE9BQU8sRUFBRTtnQkFDUCxjQUFjO2FBQ2Y7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QscUJBQXFCO2FBQ3RCO1NBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQsdURBQXVEO0lBQ3ZELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFDakQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztRQUN4QixVQUFVLEVBQUU7WUFDVixJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQztTQUN4RDtRQUNELE9BQU8sRUFBRTtZQUNQLGNBQWM7U0FDZjtRQUNELFNBQVMsRUFBRTtZQUNULHFCQUFxQjtTQUN0QjtLQUNGLENBQUMsQ0FBQyxDQUFDO0lBRUosOEVBQThFO0lBQzlFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFDakQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztRQUN4QixVQUFVLEVBQUU7WUFDVixJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQztTQUNyRDtRQUNELE9BQU8sRUFBRTtZQUNQLGNBQWM7U0FDZjtRQUNELFNBQVMsRUFBRTtZQUNULHFCQUFxQjtTQUN0QjtLQUNGLENBQUMsQ0FBQyxDQUFDO0lBRUosT0FBTztRQUNMLCtCQUErQixFQUFFLDBCQUEwQixDQUFDLGdCQUFnQixJQUFJLE1BQU07S0FDdkYsQ0FBQztBQUNKLENBQUMsQ0FBQztBQXZFVyxRQUFBLDBCQUEwQiw4QkF1RXJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBGYWN0TmFtZSwgUmVnaW9uSW5mbyB9IGZyb20gJ2F3cy1jZGstbGliL3JlZ2lvbi1pbmZvJztcbmltcG9ydCB7IEJ1Y2tldFBvbGljeUFwcGx5UmVzdWx0LCBCdWNrZXRQb2xpY3lDb250ZXh0IH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQWRkcyByZXNvdXJjZSBwb2xpY2llcyBmb3IgQUxCL05MQiwgQ2xvdWRGcm9udCBzdGFuZGFyZCBsb2dnaW5nICh2MiksIGFuZCBTMyBzZXJ2ZXIgYWNjZXNzIGxvZ2dpbmcuXG4gKlxuICogR3JhbnRzIGBzMzpQdXRPYmplY3RgIG9uIGBBV1NMb2dzLzxzdGFjay5hY2NvdW50Pi8qYCB0bzpcbiAqIC0gYGxvZ2RlbGl2ZXJ5LmVsYXN0aWNsb2FkYmFsYW5jaW5nLmFtYXpvbmF3cy5jb21gXG4gKiAtIFRoZSByZWdpb25hbCBFTEJ2MiBsb2ctZGVsaXZlcnkgYWNjb3VudCAod2hlbiBrbm93bilcbiAqIC0gYGRlbGl2ZXJ5LmxvZ3MuYW1hem9uYXdzLmNvbWBcbiAqIC0gYGxvZ2dpbmcuczMuYW1hem9uYXdzLmNvbWBcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEJ1Y2tldCBhbmQgb3duaW5nIHN0YWNrIChhY2NvdW50IGFuZCByZWdpb24gYXJlIHJlYWQgZnJvbSBgc3RhY2tgKS5cbiAqIEByZXR1cm5zIEEgcmVzdWx0IGNvbnRhaW5pbmcge0BsaW5rIEJ1Y2tldFBvbGljeUFwcGx5UmVzdWx0LmFjY2Vzc0xvZ0J1Y2tldFBvbGljeURlcGVuZGFibGV9IGZvciB0aGVcbiAqIGZpcnN0IChFTEIpIHBvbGljeSBzdGF0ZW1lbnQgc28gbG9hZCBiYWxhbmNlciBsb2cgZW5hYmxlbWVudCBjYW4gd2FpdCB1bnRpbCB0aGUgYnVja2V0IHBvbGljeSBleGlzdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBseUFjY2Vzc0xvZ0J1Y2tldFBvbGljeSA9ICh7XG4gIGJ1Y2tldCxcbiAgc3RhY2ssXG59OiBCdWNrZXRQb2xpY3lDb250ZXh0KTogQnVja2V0UG9saWN5QXBwbHlSZXN1bHQgPT4ge1xuICBjb25zdCBhd3NMb2dzUHJlZml4UmVzb3VyY2UgPSBgJHtidWNrZXQuYnVja2V0QXJufS9BV1NMb2dzLyR7c3RhY2suYWNjb3VudH0vKmA7XG5cbiAgLy8gQWxsb3cgQUxCIC8gTkxCIGxvZyBkZWxpdmVyeSAobW9kZXJuIHNlcnZpY2UgcHJpbmNpcGFsIHBhdGg7IGFsc28gcmVxdWlyZWQgaW4gb3B0LWluIHJlZ2lvbnMpLlxuICBjb25zdCBhbGJMb2dEZWxpdmVyeVBvbGljeVJlc3VsdCA9IGJ1Y2tldC5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgcHJpbmNpcGFsczogW1xuICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsb2dkZWxpdmVyeS5lbGFzdGljbG9hZGJhbGFuY2luZy5hbWF6b25hd3MuY29tJyksXG4gICAgXSxcbiAgICBhY3Rpb25zOiBbXG4gICAgICAnczM6UHV0T2JqZWN0JyxcbiAgICBdLFxuICAgIHJlc291cmNlczogW1xuICAgICAgYXdzTG9nc1ByZWZpeFJlc291cmNlLFxuICAgIF0sXG4gIH0pKTtcblxuICAvLyBJbiBub27igJNvcHQtaW4gcmVnaW9ucyAoZm9yIGV4YW1wbGUgYXAtbm9ydGhlYXN0LTEpLCBhY2Nlc3MgbG9ncyBhcmUgb2Z0ZW4gZGVsaXZlcmVkIHVzaW5nIHRoZVxuICAvLyByZWdpb25hbCBFTEJ2MiBhY2NvdW50IChyb290IG9mIHRoYXQgYWNjb3VudCkgZm9yIHMzOlB1dE9iamVjdCwgbm90IG9ubHkgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGFib3ZlLlxuICBjb25zdCBlbGJBY2NvdW50SWQgPSBUb2tlbi5pc1VucmVzb2x2ZWQoc3RhY2sucmVnaW9uKVxuICAgID8gc3RhY2sucmVnaW9uYWxGYWN0KEZhY3ROYW1lLkVMQlYyX0FDQ09VTlQpXG4gICAgOiBSZWdpb25JbmZvLmdldChzdGFjay5yZWdpb24pLmVsYnYyQWNjb3VudDtcbiAgaWYgKGVsYkFjY291bnRJZCkge1xuICAgIGJ1Y2tldC5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIHByaW5jaXBhbHM6IFtcbiAgICAgICAgbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKGVsYkFjY291bnRJZCksXG4gICAgICBdLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnczM6UHV0T2JqZWN0JyxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYXdzTG9nc1ByZWZpeFJlc291cmNlLFxuICAgICAgXSxcbiAgICB9KSk7XG4gIH1cblxuICAvLyBBbGxvdyBDbG91ZEZyb250IHN0YW5kYXJkIGxvZ2dpbmcgKHYyKSB0byB3cml0ZSBsb2dzXG4gIGJ1Y2tldC5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgcHJpbmNpcGFsczogW1xuICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdkZWxpdmVyeS5sb2dzLmFtYXpvbmF3cy5jb20nKSxcbiAgICBdLFxuICAgIGFjdGlvbnM6IFtcbiAgICAgICdzMzpQdXRPYmplY3QnLFxuICAgIF0sXG4gICAgcmVzb3VyY2VzOiBbXG4gICAgICBhd3NMb2dzUHJlZml4UmVzb3VyY2UsXG4gICAgXSxcbiAgfSkpO1xuXG4gIC8vIEFsbG93IFMzIHNlcnZlciBhY2Nlc3MgbG9nZ2luZyB0byB3cml0ZSBsb2dzIHdoZW4gcmVxdWlyZWQgYnkgY29uZmlndXJhdGlvblxuICBidWNrZXQuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgIHByaW5jaXBhbHM6IFtcbiAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnbG9nZ2luZy5zMy5hbWF6b25hd3MuY29tJyksXG4gICAgXSxcbiAgICBhY3Rpb25zOiBbXG4gICAgICAnczM6UHV0T2JqZWN0JyxcbiAgICBdLFxuICAgIHJlc291cmNlczogW1xuICAgICAgYXdzTG9nc1ByZWZpeFJlc291cmNlLFxuICAgIF0sXG4gIH0pKTtcblxuICByZXR1cm4ge1xuICAgIGFjY2Vzc0xvZ0J1Y2tldFBvbGljeURlcGVuZGFibGU6IGFsYkxvZ0RlbGl2ZXJ5UG9saWN5UmVzdWx0LnBvbGljeURlcGVuZGFibGUgPz8gYnVja2V0LFxuICB9O1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BucketPolicyApplyResult, BucketPolicyContext } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Adds resource policies for CloudWatch Logs export tasks in the stack account and region.
|
|
4
|
+
*
|
|
5
|
+
* Grants `logs.<region>.amazonaws.com`:
|
|
6
|
+
* - `s3:GetBucketAcl` on the bucket
|
|
7
|
+
* - `s3:PutObject` on bucket objects with `bucket-owner-full-control`
|
|
8
|
+
*
|
|
9
|
+
* Conditions restrict exports to log groups in the stack account and region.
|
|
10
|
+
* For cross-account export, extend the bucket policy with additional source accounts and ARNs.
|
|
11
|
+
*
|
|
12
|
+
* @param context - Bucket and owning stack (account and region are read from `stack`).
|
|
13
|
+
* @returns An empty result after export policies are attached.
|
|
14
|
+
*/
|
|
15
|
+
export declare const applyCloudWatchLogArchivePolicy: ({ bucket, stack, }: BucketPolicyContext) => BucketPolicyApplyResult;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.applyCloudWatchLogArchivePolicy = void 0;
|
|
37
|
+
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
38
|
+
/**
|
|
39
|
+
* Adds resource policies for CloudWatch Logs export tasks in the stack account and region.
|
|
40
|
+
*
|
|
41
|
+
* Grants `logs.<region>.amazonaws.com`:
|
|
42
|
+
* - `s3:GetBucketAcl` on the bucket
|
|
43
|
+
* - `s3:PutObject` on bucket objects with `bucket-owner-full-control`
|
|
44
|
+
*
|
|
45
|
+
* Conditions restrict exports to log groups in the stack account and region.
|
|
46
|
+
* For cross-account export, extend the bucket policy with additional source accounts and ARNs.
|
|
47
|
+
*
|
|
48
|
+
* @param context - Bucket and owning stack (account and region are read from `stack`).
|
|
49
|
+
* @returns An empty result after export policies are attached.
|
|
50
|
+
*/
|
|
51
|
+
const applyCloudWatchLogArchivePolicy = ({ bucket, stack, }) => {
|
|
52
|
+
const { account, region } = stack;
|
|
53
|
+
const logsExportPrincipal = new iam.ServicePrincipal(`logs.${region}.amazonaws.com`);
|
|
54
|
+
const sourceLogGroupArn = `arn:aws:logs:${region}:${account}:log-group:*`;
|
|
55
|
+
bucket.addToResourcePolicy(new iam.PolicyStatement({
|
|
56
|
+
sid: 'AllowCloudWatchLogsExportGetBucketAcl',
|
|
57
|
+
effect: iam.Effect.ALLOW,
|
|
58
|
+
principals: [logsExportPrincipal],
|
|
59
|
+
actions: ['s3:GetBucketAcl'],
|
|
60
|
+
resources: [bucket.bucketArn],
|
|
61
|
+
conditions: {
|
|
62
|
+
StringEquals: {
|
|
63
|
+
'aws:SourceAccount': [account],
|
|
64
|
+
},
|
|
65
|
+
ArnLike: {
|
|
66
|
+
'aws:SourceArn': [sourceLogGroupArn],
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
}));
|
|
70
|
+
bucket.addToResourcePolicy(new iam.PolicyStatement({
|
|
71
|
+
sid: 'AllowCloudWatchLogsExportPutObject',
|
|
72
|
+
effect: iam.Effect.ALLOW,
|
|
73
|
+
principals: [logsExportPrincipal],
|
|
74
|
+
actions: ['s3:PutObject'],
|
|
75
|
+
resources: [`${bucket.bucketArn}/*`],
|
|
76
|
+
conditions: {
|
|
77
|
+
StringEquals: {
|
|
78
|
+
's3:x-amz-acl': 'bucket-owner-full-control',
|
|
79
|
+
'aws:SourceAccount': [account],
|
|
80
|
+
},
|
|
81
|
+
ArnLike: {
|
|
82
|
+
'aws:SourceArn': [sourceLogGroupArn],
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
}));
|
|
86
|
+
return {};
|
|
87
|
+
};
|
|
88
|
+
exports.applyCloudWatchLogArchivePolicy = applyCloudWatchLogArchivePolicy;
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQtd2F0Y2gtbG9nLWFyY2hpdmUtcG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1Y2tldC1wb2xpY2llcy9jbG91ZC13YXRjaC1sb2ctYXJjaGl2ZS1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseURBQTJDO0FBRzNDOzs7Ozs7Ozs7Ozs7R0FZRztBQUNJLE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxFQUM5QyxNQUFNLEVBQ04sS0FBSyxHQUNlLEVBQTJCLEVBQUU7SUFDakQsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDbEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLE1BQU0sZ0JBQWdCLENBQUMsQ0FBQztJQUNyRixNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixNQUFNLElBQUksT0FBTyxjQUFjLENBQUM7SUFFMUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUNqRCxHQUFHLEVBQUUsdUNBQXVDO1FBQzVDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7UUFDeEIsVUFBVSxFQUFFLENBQUMsbUJBQW1CLENBQUM7UUFDakMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUM7UUFDNUIsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUM3QixVQUFVLEVBQUU7WUFDVixZQUFZLEVBQUU7Z0JBQ1osbUJBQW1CLEVBQUUsQ0FBQyxPQUFPLENBQUM7YUFDL0I7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsZUFBZSxFQUFFLENBQUMsaUJBQWlCLENBQUM7YUFDckM7U0FDRjtLQUNGLENBQUMsQ0FBQyxDQUFDO0lBRUosTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUNqRCxHQUFHLEVBQUUsb0NBQW9DO1FBQ3pDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7UUFDeEIsVUFBVSxFQUFFLENBQUMsbUJBQW1CLENBQUM7UUFDakMsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDO1FBQ3pCLFNBQVMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDO1FBQ3BDLFVBQVUsRUFBRTtZQUNWLFlBQVksRUFBRTtnQkFDWixjQUFjLEVBQUUsMkJBQTJCO2dCQUMzQyxtQkFBbUIsRUFBRSxDQUFDLE9BQU8sQ0FBQzthQUMvQjtZQUNELE9BQU8sRUFBRTtnQkFDUCxlQUFlLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQzthQUNyQztTQUNGO0tBQ0YsQ0FBQyxDQUFDLENBQUM7SUFFSixPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUMsQ0FBQztBQTFDVyxRQUFBLCtCQUErQixtQ0EwQzFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQnVja2V0UG9saWN5QXBwbHlSZXN1bHQsIEJ1Y2tldFBvbGljeUNvbnRleHQgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBBZGRzIHJlc291cmNlIHBvbGljaWVzIGZvciBDbG91ZFdhdGNoIExvZ3MgZXhwb3J0IHRhc2tzIGluIHRoZSBzdGFjayBhY2NvdW50IGFuZCByZWdpb24uXG4gKlxuICogR3JhbnRzIGBsb2dzLjxyZWdpb24+LmFtYXpvbmF3cy5jb21gOlxuICogLSBgczM6R2V0QnVja2V0QWNsYCBvbiB0aGUgYnVja2V0XG4gKiAtIGBzMzpQdXRPYmplY3RgIG9uIGJ1Y2tldCBvYmplY3RzIHdpdGggYGJ1Y2tldC1vd25lci1mdWxsLWNvbnRyb2xgXG4gKlxuICogQ29uZGl0aW9ucyByZXN0cmljdCBleHBvcnRzIHRvIGxvZyBncm91cHMgaW4gdGhlIHN0YWNrIGFjY291bnQgYW5kIHJlZ2lvbi5cbiAqIEZvciBjcm9zcy1hY2NvdW50IGV4cG9ydCwgZXh0ZW5kIHRoZSBidWNrZXQgcG9saWN5IHdpdGggYWRkaXRpb25hbCBzb3VyY2UgYWNjb3VudHMgYW5kIEFSTnMuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBCdWNrZXQgYW5kIG93bmluZyBzdGFjayAoYWNjb3VudCBhbmQgcmVnaW9uIGFyZSByZWFkIGZyb20gYHN0YWNrYCkuXG4gKiBAcmV0dXJucyBBbiBlbXB0eSByZXN1bHQgYWZ0ZXIgZXhwb3J0IHBvbGljaWVzIGFyZSBhdHRhY2hlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5Q2xvdWRXYXRjaExvZ0FyY2hpdmVQb2xpY3kgPSAoe1xuICBidWNrZXQsXG4gIHN0YWNrLFxufTogQnVja2V0UG9saWN5Q29udGV4dCk6IEJ1Y2tldFBvbGljeUFwcGx5UmVzdWx0ID0+IHtcbiAgY29uc3QgeyBhY2NvdW50LCByZWdpb24gfSA9IHN0YWNrO1xuICBjb25zdCBsb2dzRXhwb3J0UHJpbmNpcGFsID0gbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKGBsb2dzLiR7cmVnaW9ufS5hbWF6b25hd3MuY29tYCk7XG4gIGNvbnN0IHNvdXJjZUxvZ0dyb3VwQXJuID0gYGFybjphd3M6bG9nczoke3JlZ2lvbn06JHthY2NvdW50fTpsb2ctZ3JvdXA6KmA7XG5cbiAgYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgIHNpZDogJ0FsbG93Q2xvdWRXYXRjaExvZ3NFeHBvcnRHZXRCdWNrZXRBY2wnLFxuICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICBwcmluY2lwYWxzOiBbbG9nc0V4cG9ydFByaW5jaXBhbF0sXG4gICAgYWN0aW9uczogWydzMzpHZXRCdWNrZXRBY2wnXSxcbiAgICByZXNvdXJjZXM6IFtidWNrZXQuYnVja2V0QXJuXSxcbiAgICBjb25kaXRpb25zOiB7XG4gICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgJ2F3czpTb3VyY2VBY2NvdW50JzogW2FjY291bnRdLFxuICAgICAgfSxcbiAgICAgIEFybkxpa2U6IHtcbiAgICAgICAgJ2F3czpTb3VyY2VBcm4nOiBbc291cmNlTG9nR3JvdXBBcm5dLFxuICAgICAgfSxcbiAgICB9LFxuICB9KSk7XG5cbiAgYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgIHNpZDogJ0FsbG93Q2xvdWRXYXRjaExvZ3NFeHBvcnRQdXRPYmplY3QnLFxuICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICBwcmluY2lwYWxzOiBbbG9nc0V4cG9ydFByaW5jaXBhbF0sXG4gICAgYWN0aW9uczogWydzMzpQdXRPYmplY3QnXSxcbiAgICByZXNvdXJjZXM6IFtgJHtidWNrZXQuYnVja2V0QXJufS8qYF0sXG4gICAgY29uZGl0aW9uczoge1xuICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICdzMzp4LWFtei1hY2wnOiAnYnVja2V0LW93bmVyLWZ1bGwtY29udHJvbCcsXG4gICAgICAgICdhd3M6U291cmNlQWNjb3VudCc6IFthY2NvdW50XSxcbiAgICAgIH0sXG4gICAgICBBcm5MaWtlOiB7XG4gICAgICAgICdhd3M6U291cmNlQXJuJzogW3NvdXJjZUxvZ0dyb3VwQXJuXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSkpO1xuXG4gIHJldHVybiB7fTtcbn07XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BucketPolicyApplyResult, BucketPolicyContext } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Grants the CDK deploy role full S3 access when a non-default bootstrap qualifier is in use.
|
|
4
|
+
*
|
|
5
|
+
* No policy is added when the stack uses the default bootstrap qualifier
|
|
6
|
+
* ({@link DefaultStackSynthesizer.DEFAULT_QUALIFIER}).
|
|
7
|
+
*
|
|
8
|
+
* @param context - Bucket and owning stack (account, region, and synthesizer qualifier).
|
|
9
|
+
* @returns An empty result when no policy is applied or after the deploy-role policy is attached.
|
|
10
|
+
*/
|
|
11
|
+
export declare const applyDeploymentPipelineArtifactPolicy: ({ bucket, stack, }: BucketPolicyContext) => BucketPolicyApplyResult;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.applyDeploymentPipelineArtifactPolicy = void 0;
|
|
37
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
38
|
+
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
39
|
+
/**
|
|
40
|
+
* Grants the CDK deploy role full S3 access when a non-default bootstrap qualifier is in use.
|
|
41
|
+
*
|
|
42
|
+
* No policy is added when the stack uses the default bootstrap qualifier
|
|
43
|
+
* ({@link DefaultStackSynthesizer.DEFAULT_QUALIFIER}).
|
|
44
|
+
*
|
|
45
|
+
* @param context - Bucket and owning stack (account, region, and synthesizer qualifier).
|
|
46
|
+
* @returns An empty result when no policy is applied or after the deploy-role policy is attached.
|
|
47
|
+
*/
|
|
48
|
+
const applyDeploymentPipelineArtifactPolicy = ({ bucket, stack, }) => {
|
|
49
|
+
const qualifier = stack.synthesizer.bootstrapQualifier;
|
|
50
|
+
if (!qualifier || qualifier === aws_cdk_lib_1.DefaultStackSynthesizer.DEFAULT_QUALIFIER) {
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
const { account, region } = stack;
|
|
54
|
+
bucket.addToResourcePolicy(new iam.PolicyStatement({
|
|
55
|
+
actions: [
|
|
56
|
+
's3:*',
|
|
57
|
+
],
|
|
58
|
+
resources: [
|
|
59
|
+
`${bucket.bucketArn}`,
|
|
60
|
+
`${bucket.bucketArn}/*`,
|
|
61
|
+
],
|
|
62
|
+
principals: [
|
|
63
|
+
new iam.ArnPrincipal(`arn:aws:iam::${account}:role/cdk-${qualifier}-deploy-role-${account}-${region}`),
|
|
64
|
+
],
|
|
65
|
+
}));
|
|
66
|
+
return {};
|
|
67
|
+
};
|
|
68
|
+
exports.applyDeploymentPipelineArtifactPolicy = applyDeploymentPipelineArtifactPolicy;
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudC1waXBlbGluZS1hcnRpZmFjdC1wb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVja2V0LXBvbGljaWVzL2RlcGxveW1lbnQtcGlwZWxpbmUtYXJ0aWZhY3QtcG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUFzRDtBQUN0RCx5REFBMkM7QUFHM0M7Ozs7Ozs7O0dBUUc7QUFDSSxNQUFNLHFDQUFxQyxHQUFHLENBQUMsRUFDcEQsTUFBTSxFQUNOLEtBQUssR0FDZSxFQUEyQixFQUFFO0lBQ2pELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUM7SUFFdkQsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLEtBQUsscUNBQXVCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMxRSxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQztJQUVsQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO1FBQ2pELE9BQU8sRUFBRTtZQUNQLE1BQU07U0FDUDtRQUNELFNBQVMsRUFBRTtZQUNULEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNyQixHQUFHLE1BQU0sQ0FBQyxTQUFTLElBQUk7U0FDeEI7UUFDRCxVQUFVLEVBQUU7WUFDVixJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLE9BQU8sYUFBYSxTQUFTLGdCQUFnQixPQUFPLElBQUksTUFBTSxFQUFFLENBQUM7U0FDdkc7S0FDRixDQUFDLENBQUMsQ0FBQztJQUVKLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyxDQUFDO0FBMUJXLFFBQUEscUNBQXFDLHlDQTBCaEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0U3RhY2tTeW50aGVzaXplciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEJ1Y2tldFBvbGljeUFwcGx5UmVzdWx0LCBCdWNrZXRQb2xpY3lDb250ZXh0IH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogR3JhbnRzIHRoZSBDREsgZGVwbG95IHJvbGUgZnVsbCBTMyBhY2Nlc3Mgd2hlbiBhIG5vbi1kZWZhdWx0IGJvb3RzdHJhcCBxdWFsaWZpZXIgaXMgaW4gdXNlLlxuICpcbiAqIE5vIHBvbGljeSBpcyBhZGRlZCB3aGVuIHRoZSBzdGFjayB1c2VzIHRoZSBkZWZhdWx0IGJvb3RzdHJhcCBxdWFsaWZpZXJcbiAqICh7QGxpbmsgRGVmYXVsdFN0YWNrU3ludGhlc2l6ZXIuREVGQVVMVF9RVUFMSUZJRVJ9KS5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEJ1Y2tldCBhbmQgb3duaW5nIHN0YWNrIChhY2NvdW50LCByZWdpb24sIGFuZCBzeW50aGVzaXplciBxdWFsaWZpZXIpLlxuICogQHJldHVybnMgQW4gZW1wdHkgcmVzdWx0IHdoZW4gbm8gcG9saWN5IGlzIGFwcGxpZWQgb3IgYWZ0ZXIgdGhlIGRlcGxveS1yb2xlIHBvbGljeSBpcyBhdHRhY2hlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5RGVwbG95bWVudFBpcGVsaW5lQXJ0aWZhY3RQb2xpY3kgPSAoe1xuICBidWNrZXQsXG4gIHN0YWNrLFxufTogQnVja2V0UG9saWN5Q29udGV4dCk6IEJ1Y2tldFBvbGljeUFwcGx5UmVzdWx0ID0+IHtcbiAgY29uc3QgcXVhbGlmaWVyID0gc3RhY2suc3ludGhlc2l6ZXIuYm9vdHN0cmFwUXVhbGlmaWVyO1xuXG4gIGlmICghcXVhbGlmaWVyIHx8IHF1YWxpZmllciA9PT0gRGVmYXVsdFN0YWNrU3ludGhlc2l6ZXIuREVGQVVMVF9RVUFMSUZJRVIpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCB7IGFjY291bnQsIHJlZ2lvbiB9ID0gc3RhY2s7XG5cbiAgYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgIGFjdGlvbnM6IFtcbiAgICAgICdzMzoqJyxcbiAgICBdLFxuICAgIHJlc291cmNlczogW1xuICAgICAgYCR7YnVja2V0LmJ1Y2tldEFybn1gLFxuICAgICAgYCR7YnVja2V0LmJ1Y2tldEFybn0vKmAsXG4gICAgXSxcbiAgICBwcmluY2lwYWxzOiBbXG4gICAgICBuZXcgaWFtLkFyblByaW5jaXBhbChgYXJuOmF3czppYW06OiR7YWNjb3VudH06cm9sZS9jZGstJHtxdWFsaWZpZXJ9LWRlcGxveS1yb2xlLSR7YWNjb3VudH0tJHtyZWdpb259YCksXG4gICAgXSxcbiAgfSkpO1xuXG4gIHJldHVybiB7fTtcbn07XG4iXX0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatches bucket-type-specific S3 resource policy statements.
|
|
3
|
+
*
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
import { S3SecureBucketType } from '../bucket-types';
|
|
7
|
+
import { BucketPolicyApplyResult, BucketPolicyContext } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Applies resource policies for the given bucket type, if any.
|
|
10
|
+
*
|
|
11
|
+
* Types without dedicated policies ({@link S3SecureBucketType.DEFAULT_BUCKET},
|
|
12
|
+
* {@link S3SecureBucketType.CLOUDFRONT_ORIGIN_BUCKET}) are no-ops and return an empty result.
|
|
13
|
+
*
|
|
14
|
+
* @param bucketType - Preset that selects which policy applier runs.
|
|
15
|
+
* @param context - Bucket and owning stack.
|
|
16
|
+
* @returns Side effects such as {@link BucketPolicyApplyResult.accessLogBucketPolicyDependable}.
|
|
17
|
+
*/
|
|
18
|
+
export declare const applyBucketPolicies: (bucketType: S3SecureBucketType, context: BucketPolicyContext) => BucketPolicyApplyResult;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyBucketPolicies = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Dispatches bucket-type-specific S3 resource policy statements.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
const bucket_types_1 = require("../bucket-types");
|
|
10
|
+
const access_log_bucket_policy_1 = require("./access-log-bucket-policy");
|
|
11
|
+
const cloud_watch_log_archive_policy_1 = require("./cloud-watch-log-archive-policy");
|
|
12
|
+
const deployment_pipeline_artifact_policy_1 = require("./deployment-pipeline-artifact-policy");
|
|
13
|
+
/**
|
|
14
|
+
* Applies resource policies for the given bucket type, if any.
|
|
15
|
+
*
|
|
16
|
+
* Types without dedicated policies ({@link S3SecureBucketType.DEFAULT_BUCKET},
|
|
17
|
+
* {@link S3SecureBucketType.CLOUDFRONT_ORIGIN_BUCKET}) are no-ops and return an empty result.
|
|
18
|
+
*
|
|
19
|
+
* @param bucketType - Preset that selects which policy applier runs.
|
|
20
|
+
* @param context - Bucket and owning stack.
|
|
21
|
+
* @returns Side effects such as {@link BucketPolicyApplyResult.accessLogBucketPolicyDependable}.
|
|
22
|
+
*/
|
|
23
|
+
const applyBucketPolicies = (bucketType, context) => {
|
|
24
|
+
if (bucketType === bucket_types_1.S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET) {
|
|
25
|
+
return (0, deployment_pipeline_artifact_policy_1.applyDeploymentPipelineArtifactPolicy)(context);
|
|
26
|
+
}
|
|
27
|
+
if (bucketType === bucket_types_1.S3SecureBucketType.ACCESS_LOG_BUCKET) {
|
|
28
|
+
return (0, access_log_bucket_policy_1.applyAccessLogBucketPolicy)(context);
|
|
29
|
+
}
|
|
30
|
+
if (bucketType === bucket_types_1.S3SecureBucketType.CLOUD_WATCH_LOG_ARCHIVE_BUCKET) {
|
|
31
|
+
return (0, cloud_watch_log_archive_policy_1.applyCloudWatchLogArchivePolicy)(context);
|
|
32
|
+
}
|
|
33
|
+
return {};
|
|
34
|
+
};
|
|
35
|
+
exports.applyBucketPolicies = applyBucketPolicies;
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVja2V0LXBvbGljaWVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7O0dBSUc7QUFDSCxrREFBcUQ7QUFDckQseUVBQXdFO0FBQ3hFLHFGQUFtRjtBQUNuRiwrRkFBOEY7QUFHOUY7Ozs7Ozs7OztHQVNHO0FBQ0ksTUFBTSxtQkFBbUIsR0FBRyxDQUNqQyxVQUE4QixFQUM5QixPQUE0QixFQUNILEVBQUU7SUFDM0IsSUFBSSxVQUFVLEtBQUssaUNBQWtCLENBQUMsbUNBQW1DLEVBQUUsQ0FBQztRQUMxRSxPQUFPLElBQUEsMkVBQXFDLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQUksVUFBVSxLQUFLLGlDQUFrQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDeEQsT0FBTyxJQUFBLHFEQUEwQixFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLFVBQVUsS0FBSyxpQ0FBa0IsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQ3JFLE9BQU8sSUFBQSxnRUFBK0IsRUFBQyxPQUFPLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDLENBQUM7QUFqQlcsUUFBQSxtQkFBbUIsdUJBaUI5QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGlzcGF0Y2hlcyBidWNrZXQtdHlwZS1zcGVjaWZpYyBTMyByZXNvdXJjZSBwb2xpY3kgc3RhdGVtZW50cy5cbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuaW1wb3J0IHsgUzNTZWN1cmVCdWNrZXRUeXBlIH0gZnJvbSAnLi4vYnVja2V0LXR5cGVzJztcbmltcG9ydCB7IGFwcGx5QWNjZXNzTG9nQnVja2V0UG9saWN5IH0gZnJvbSAnLi9hY2Nlc3MtbG9nLWJ1Y2tldC1wb2xpY3knO1xuaW1wb3J0IHsgYXBwbHlDbG91ZFdhdGNoTG9nQXJjaGl2ZVBvbGljeSB9IGZyb20gJy4vY2xvdWQtd2F0Y2gtbG9nLWFyY2hpdmUtcG9saWN5JztcbmltcG9ydCB7IGFwcGx5RGVwbG95bWVudFBpcGVsaW5lQXJ0aWZhY3RQb2xpY3kgfSBmcm9tICcuL2RlcGxveW1lbnQtcGlwZWxpbmUtYXJ0aWZhY3QtcG9saWN5JztcbmltcG9ydCB7IEJ1Y2tldFBvbGljeUFwcGx5UmVzdWx0LCBCdWNrZXRQb2xpY3lDb250ZXh0IH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQXBwbGllcyByZXNvdXJjZSBwb2xpY2llcyBmb3IgdGhlIGdpdmVuIGJ1Y2tldCB0eXBlLCBpZiBhbnkuXG4gKlxuICogVHlwZXMgd2l0aG91dCBkZWRpY2F0ZWQgcG9saWNpZXMgKHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGUuREVGQVVMVF9CVUNLRVR9LFxuICoge0BsaW5rIFMzU2VjdXJlQnVja2V0VHlwZS5DTE9VREZST05UX09SSUdJTl9CVUNLRVR9KSBhcmUgbm8tb3BzIGFuZCByZXR1cm4gYW4gZW1wdHkgcmVzdWx0LlxuICpcbiAqIEBwYXJhbSBidWNrZXRUeXBlIC0gUHJlc2V0IHRoYXQgc2VsZWN0cyB3aGljaCBwb2xpY3kgYXBwbGllciBydW5zLlxuICogQHBhcmFtIGNvbnRleHQgLSBCdWNrZXQgYW5kIG93bmluZyBzdGFjay5cbiAqIEByZXR1cm5zIFNpZGUgZWZmZWN0cyBzdWNoIGFzIHtAbGluayBCdWNrZXRQb2xpY3lBcHBseVJlc3VsdC5hY2Nlc3NMb2dCdWNrZXRQb2xpY3lEZXBlbmRhYmxlfS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5QnVja2V0UG9saWNpZXMgPSAoXG4gIGJ1Y2tldFR5cGU6IFMzU2VjdXJlQnVja2V0VHlwZSxcbiAgY29udGV4dDogQnVja2V0UG9saWN5Q29udGV4dCxcbik6IEJ1Y2tldFBvbGljeUFwcGx5UmVzdWx0ID0+IHtcbiAgaWYgKGJ1Y2tldFR5cGUgPT09IFMzU2VjdXJlQnVja2V0VHlwZS5ERVBMT1lNRU5UX1BJUEVMSU5FX0FSVElGQUNUX0JVQ0tFVCkge1xuICAgIHJldHVybiBhcHBseURlcGxveW1lbnRQaXBlbGluZUFydGlmYWN0UG9saWN5KGNvbnRleHQpO1xuICB9XG5cbiAgaWYgKGJ1Y2tldFR5cGUgPT09IFMzU2VjdXJlQnVja2V0VHlwZS5BQ0NFU1NfTE9HX0JVQ0tFVCkge1xuICAgIHJldHVybiBhcHBseUFjY2Vzc0xvZ0J1Y2tldFBvbGljeShjb250ZXh0KTtcbiAgfVxuXG4gIGlmIChidWNrZXRUeXBlID09PSBTM1NlY3VyZUJ1Y2tldFR5cGUuQ0xPVURfV0FUQ0hfTE9HX0FSQ0hJVkVfQlVDS0VUKSB7XG4gICAgcmV0dXJuIGFwcGx5Q2xvdWRXYXRjaExvZ0FyY2hpdmVQb2xpY3koY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4ge307XG59O1xuIl19
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Stack } from 'aws-cdk-lib';
|
|
2
|
+
import * as s3 from 'aws-cdk-lib/aws-s3';
|
|
3
|
+
import { IDependable } from 'constructs';
|
|
4
|
+
/**
|
|
5
|
+
* Inputs shared by bucket-type resource policy appliers.
|
|
6
|
+
*/
|
|
7
|
+
export interface BucketPolicyContext {
|
|
8
|
+
/** The bucket to attach resource policies to. */
|
|
9
|
+
readonly bucket: s3.Bucket;
|
|
10
|
+
/** Stack that owns the bucket; used for account, region, and synthesizer metadata. */
|
|
11
|
+
readonly stack: Stack;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Optional side effects returned after applying type-specific bucket policies.
|
|
15
|
+
*/
|
|
16
|
+
export interface BucketPolicyApplyResult {
|
|
17
|
+
/**
|
|
18
|
+
* Set when {@link S3SecureBucketType.ACCESS_LOG_BUCKET} policies are applied.
|
|
19
|
+
* Depend on this before enabling ALB/NLB access logging.
|
|
20
|
+
*/
|
|
21
|
+
readonly accessLogBucketPolicyDependable?: IDependable;
|
|
22
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVja2V0LXBvbGljaWVzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBJRGVwZW5kYWJsZSB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIElucHV0cyBzaGFyZWQgYnkgYnVja2V0LXR5cGUgcmVzb3VyY2UgcG9saWN5IGFwcGxpZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFBvbGljeUNvbnRleHQge1xuICAvKiogVGhlIGJ1Y2tldCB0byBhdHRhY2ggcmVzb3VyY2UgcG9saWNpZXMgdG8uICovXG4gIHJlYWRvbmx5IGJ1Y2tldDogczMuQnVja2V0O1xuICAvKiogU3RhY2sgdGhhdCBvd25zIHRoZSBidWNrZXQ7IHVzZWQgZm9yIGFjY291bnQsIHJlZ2lvbiwgYW5kIHN5bnRoZXNpemVyIG1ldGFkYXRhLiAqL1xuICByZWFkb25seSBzdGFjazogU3RhY2s7XG59XG5cbi8qKlxuICogT3B0aW9uYWwgc2lkZSBlZmZlY3RzIHJldHVybmVkIGFmdGVyIGFwcGx5aW5nIHR5cGUtc3BlY2lmaWMgYnVja2V0IHBvbGljaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldFBvbGljeUFwcGx5UmVzdWx0IHtcbiAgLyoqXG4gICAqIFNldCB3aGVuIHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVR9IHBvbGljaWVzIGFyZSBhcHBsaWVkLlxuICAgKiBEZXBlbmQgb24gdGhpcyBiZWZvcmUgZW5hYmxpbmcgQUxCL05MQiBhY2Nlc3MgbG9nZ2luZy5cbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzc0xvZ0J1Y2tldFBvbGljeURlcGVuZGFibGU/OiBJRGVwZW5kYWJsZTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bucket type discriminator values for {@link S3SecureBucketProps.bucketType}.
|
|
3
|
+
*
|
|
4
|
+
* Each value selects encryption defaults and, for some types, additional bucket resource policies.
|
|
5
|
+
*
|
|
6
|
+
* @see {@link S3SecureBucketProps.bucketType}
|
|
7
|
+
*/
|
|
8
|
+
export declare const S3SecureBucketType: {
|
|
9
|
+
/**
|
|
10
|
+
* Pipeline artifact bucket when using a custom CDK bootstrap qualifier
|
|
11
|
+
* (single- or multi-region deployments).
|
|
12
|
+
*
|
|
13
|
+
* Adds an `s3:*` grant for `cdk-<qualifier>-deploy-role` when the bootstrap qualifier is not default.
|
|
14
|
+
*/
|
|
15
|
+
readonly DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET: "DeploymentPipelineArtifactBucket";
|
|
16
|
+
/**
|
|
17
|
+
* Origin bucket for CloudFront distributions.
|
|
18
|
+
*
|
|
19
|
+
* Uses S3-managed encryption ({@link s3.BucketEncryption.S3_MANAGED}) by default.
|
|
20
|
+
*/
|
|
21
|
+
readonly CLOUDFRONT_ORIGIN_BUCKET: "CloudFrontOriginBucket";
|
|
22
|
+
/**
|
|
23
|
+
* General-purpose secure bucket (default qualifier / standard use).
|
|
24
|
+
*
|
|
25
|
+
* Uses KMS-managed encryption unless overridden in props. No type-specific resource policies.
|
|
26
|
+
*/
|
|
27
|
+
readonly DEFAULT_BUCKET: "DefaultBucket";
|
|
28
|
+
/**
|
|
29
|
+
* Centralized access logs for producers such as ALB/NLB, CloudFront standard logging (v2),
|
|
30
|
+
* and S3 server access logging. Grants `s3:PutObject` on `AWSLogs/<account>/*` only (no read/list).
|
|
31
|
+
*
|
|
32
|
+
* The regional ELBv2 log-delivery account ID (legacy path alongside the log delivery service principal)
|
|
33
|
+
* is resolved from `aws-cdk-lib/region-info` at synthesis time when {@link Stack#region} is known,
|
|
34
|
+
* or via a deploy-time mapping when it is a token.
|
|
35
|
+
*/
|
|
36
|
+
readonly ACCESS_LOG_BUCKET: "AccessLogBucket";
|
|
37
|
+
/**
|
|
38
|
+
* Archive bucket for log data exported from CloudWatch Logs via export tasks.
|
|
39
|
+
*
|
|
40
|
+
* Grants `logs.<region>.amazonaws.com` `s3:GetBucketAcl` and `s3:PutObject` for log groups in the
|
|
41
|
+
* stack account and region (see AWS docs for cross-account export).
|
|
42
|
+
*/
|
|
43
|
+
readonly CLOUD_WATCH_LOG_ARCHIVE_BUCKET: "CloudWatchLogArchiveBucket";
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Discriminated union of {@link S3SecureBucketType} string literals.
|
|
47
|
+
*/
|
|
48
|
+
export type S3SecureBucketType = typeof S3SecureBucketType[keyof typeof S3SecureBucketType];
|