@ashishpandeyone/cdk-lambda-web-function 0.1.3 → 0.1.5
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 +880 -212
- package/.jsii.tabl.json +1 -1
- package/API.md +1155 -196
- package/README.md +64 -7
- package/assets/web-function-provider/index.js +23 -23
- package/lib/nodejs-web-function.js +1 -1
- package/lib/private/code-bucket.d.ts +3 -0
- package/lib/private/code-bucket.js +18 -2
- package/lib/private/provider-protocol.d.ts +13 -0
- package/lib/private/provider-protocol.js +9 -2
- package/lib/private/provider.d.ts +3 -2
- package/lib/private/provider.js +25 -4
- package/lib/private/resource-policy.d.ts +15 -0
- package/lib/private/resource-policy.js +48 -0
- package/lib/web-function-deployment.js +1 -1
- package/lib/web-function-endpoint.js +3 -3
- package/lib/web-function-grants.d.ts +13 -2
- package/lib/web-function-grants.js +24 -12
- package/lib/web-function-revision.js +1 -1
- package/lib/web-function.d.ts +159 -29
- package/lib/web-function.js +184 -47
- package/package.json +1 -2
|
@@ -49,7 +49,7 @@ const web_function_1 = require("./web-function");
|
|
|
49
49
|
* bundle, and `NODE_OPTIONS=--enable-source-maps` when source maps are on.
|
|
50
50
|
*/
|
|
51
51
|
class NodejsWebFunction extends web_function_1.WebFunction {
|
|
52
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.NodejsWebFunction", version: "0.1.
|
|
52
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.NodejsWebFunction", version: "0.1.5" };
|
|
53
53
|
constructor(scope, id, props) {
|
|
54
54
|
const runtime = props.runtime ?? lambda.Runtime.NODEJS_24_X;
|
|
55
55
|
const entry = (0, bundling_1.resolveEntry)(props.entry);
|
|
@@ -7,5 +7,8 @@ import type { Construct } from 'constructs';
|
|
|
7
7
|
* reject unversioned buckets; the CDK bootstrap bucket allows neither, so code is copied here.
|
|
8
8
|
* Revisions capture their code when they're created, so superseded versions can expire, but
|
|
9
9
|
* current objects must stay: a later revision may be created from the same object.
|
|
10
|
+
*
|
|
11
|
+
* The shared provider empties it when it's deleted (instead of `autoDeleteObjects`, which adds another
|
|
12
|
+
* Lambda function whose log group outlives the stack).
|
|
10
13
|
*/
|
|
11
14
|
export declare function codeBucket(scope: Construct): s3.Bucket;
|
|
@@ -37,6 +37,8 @@ exports.codeBucket = codeBucket;
|
|
|
37
37
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
38
38
|
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
39
39
|
const s3 = __importStar(require("aws-cdk-lib/aws-s3"));
|
|
40
|
+
const provider_1 = require("./provider");
|
|
41
|
+
const provider_protocol_1 = require("./provider-protocol");
|
|
40
42
|
const ID = 'LambdaWebFunctionCodeBucket';
|
|
41
43
|
/**
|
|
42
44
|
* The stack's code bucket (one per stack).
|
|
@@ -45,6 +47,9 @@ const ID = 'LambdaWebFunctionCodeBucket';
|
|
|
45
47
|
* reject unversioned buckets; the CDK bootstrap bucket allows neither, so code is copied here.
|
|
46
48
|
* Revisions capture their code when they're created, so superseded versions can expire, but
|
|
47
49
|
* current objects must stay: a later revision may be created from the same object.
|
|
50
|
+
*
|
|
51
|
+
* The shared provider empties it when it's deleted (instead of `autoDeleteObjects`, which adds another
|
|
52
|
+
* Lambda function whose log group outlives the stack).
|
|
48
53
|
*/
|
|
49
54
|
function codeBucket(scope) {
|
|
50
55
|
const stack = aws_cdk_lib_1.Stack.of(scope);
|
|
@@ -57,7 +62,6 @@ function codeBucket(scope) {
|
|
|
57
62
|
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
|
|
58
63
|
encryption: s3.BucketEncryption.S3_MANAGED,
|
|
59
64
|
removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
60
|
-
autoDeleteObjects: true,
|
|
61
65
|
lifecycleRules: [{
|
|
62
66
|
id: 'ExpireSupersededCode',
|
|
63
67
|
noncurrentVersionExpiration: aws_cdk_lib_1.Duration.days(30),
|
|
@@ -71,6 +75,18 @@ function codeBucket(scope) {
|
|
|
71
75
|
resources: [bucket.arnForObjects('*')],
|
|
72
76
|
conditions: { StringEquals: { 'aws:SourceAccount': stack.account } },
|
|
73
77
|
}));
|
|
78
|
+
// Only a tagged bucket is emptied (see EMPTY_ON_DELETE_TAG).
|
|
79
|
+
aws_cdk_lib_1.Tags.of(bucket).add(provider_protocol_1.EMPTY_ON_DELETE_TAG.key, provider_protocol_1.EMPTY_ON_DELETE_TAG.value);
|
|
80
|
+
const provider = (0, provider_1.webFunctionProvider)(stack);
|
|
81
|
+
(0, provider_1.grantToProvider)(provider, { Action: ['s3:ListBucketVersions', 's3:GetBucketTagging'], Resource: bucket.bucketArn });
|
|
82
|
+
(0, provider_1.grantToProvider)(provider, { Action: ['s3:DeleteObject', 's3:DeleteObjectVersion'], Resource: bucket.arnForObjects('*') });
|
|
83
|
+
const properties = { BucketName: bucket.bucketName };
|
|
84
|
+
// Depends on the bucket (through its name), so it's deleted, and empties it, just before the bucket.
|
|
85
|
+
new aws_cdk_lib_1.CustomResource(stack, `${ID}Cleanup`, {
|
|
86
|
+
serviceToken: provider.serviceToken,
|
|
87
|
+
resourceType: provider_protocol_1.CODE_BUCKET_CLEANUP_RESOURCE_TYPE,
|
|
88
|
+
properties: { ...properties },
|
|
89
|
+
});
|
|
74
90
|
return bucket;
|
|
75
91
|
}
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1idWNrZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpdmF0ZS9jb2RlLWJ1Y2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxnQ0FzQ0M7QUExREQsNkNBQW1GO0FBQ25GLHlEQUEyQztBQUMzQyx1REFBeUM7QUFFekMseUNBQWtFO0FBQ2xFLDJEQUErSDtBQUUvSCxNQUFNLEVBQUUsR0FBRyw2QkFBNkIsQ0FBQztBQUV6Qzs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLEtBQWdCO0lBQ3pDLE1BQU0sS0FBSyxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBMEIsQ0FBQztJQUN0RSxJQUFJLFFBQVE7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUU5QixNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtRQUN0QyxTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTO1FBQ2pELFVBQVUsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVTtRQUMxQyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1FBQ3BDLGNBQWMsRUFBRSxDQUFDO2dCQUNmLEVBQUUsRUFBRSxzQkFBc0I7Z0JBQzFCLDJCQUEyQixFQUFFLHNCQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDOUMsbUNBQW1DLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ3RELENBQUM7S0FDSCxDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO1FBQ2pELEdBQUcsRUFBRSw0QkFBNEI7UUFDakMsVUFBVSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUM5RCxPQUFPLEVBQUUsQ0FBQyxjQUFjLEVBQUUscUJBQXFCLENBQUM7UUFDaEQsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxVQUFVLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7S0FDckUsQ0FBQyxDQUFDLENBQUM7SUFFSiw2REFBNkQ7SUFDN0Qsa0JBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLHVDQUFtQixDQUFDLEdBQUcsRUFBRSx1Q0FBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RSxNQUFNLFFBQVEsR0FBRyxJQUFBLDhCQUFtQixFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLElBQUEsMEJBQWUsRUFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNwSCxJQUFBLDBCQUFlLEVBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsd0JBQXdCLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUgsTUFBTSxVQUFVLEdBQWdDLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNsRixxR0FBcUc7SUFDckcsSUFBSSw0QkFBYyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFO1FBQ3hDLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtRQUNuQyxZQUFZLEVBQUUscURBQWlDO1FBQy9DLFVBQVUsRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFO0tBQzlCLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrLCBUYWdzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBncmFudFRvUHJvdmlkZXIsIHdlYkZ1bmN0aW9uUHJvdmlkZXIgfSBmcm9tICcuL3Byb3ZpZGVyJztcbmltcG9ydCB7IENPREVfQlVDS0VUX0NMRUFOVVBfUkVTT1VSQ0VfVFlQRSwgRU1QVFlfT05fREVMRVRFX1RBRywgdHlwZSBDb2RlQnVja2V0Q2xlYW51cFByb3BlcnRpZXMgfSBmcm9tICcuL3Byb3ZpZGVyLXByb3RvY29sJztcblxuY29uc3QgSUQgPSAnTGFtYmRhV2ViRnVuY3Rpb25Db2RlQnVja2V0JztcblxuLyoqXG4gKiBUaGUgc3RhY2sncyBjb2RlIGJ1Y2tldCAob25lIHBlciBzdGFjaykuXG4gKlxuICogTGFtYmRhIFdlYiBGdW5jdGlvbnMgZG93bmxvYWQgY29kZSBhcyB0aGUgYGxhbWJkYS5hbWF6b25hd3MuY29tYCBzZXJ2aWNlIHByaW5jaXBhbCBhbmRcbiAqIHJlamVjdCB1bnZlcnNpb25lZCBidWNrZXRzOyB0aGUgQ0RLIGJvb3RzdHJhcCBidWNrZXQgYWxsb3dzIG5laXRoZXIsIHNvIGNvZGUgaXMgY29waWVkIGhlcmUuXG4gKiBSZXZpc2lvbnMgY2FwdHVyZSB0aGVpciBjb2RlIHdoZW4gdGhleSdyZSBjcmVhdGVkLCBzbyBzdXBlcnNlZGVkIHZlcnNpb25zIGNhbiBleHBpcmUsIGJ1dFxuICogY3VycmVudCBvYmplY3RzIG11c3Qgc3RheTogYSBsYXRlciByZXZpc2lvbiBtYXkgYmUgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIG9iamVjdC5cbiAqXG4gKiBUaGUgc2hhcmVkIHByb3ZpZGVyIGVtcHRpZXMgaXQgd2hlbiBpdCdzIGRlbGV0ZWQgKGluc3RlYWQgb2YgYGF1dG9EZWxldGVPYmplY3RzYCwgd2hpY2ggYWRkcyBhbm90aGVyXG4gKiBMYW1iZGEgZnVuY3Rpb24gd2hvc2UgbG9nIGdyb3VwIG91dGxpdmVzIHRoZSBzdGFjaykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2RlQnVja2V0KHNjb3BlOiBDb25zdHJ1Y3QpOiBzMy5CdWNrZXQge1xuICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHNjb3BlKTtcbiAgY29uc3QgZXhpc3RpbmcgPSBzdGFjay5ub2RlLnRyeUZpbmRDaGlsZChJRCkgYXMgczMuQnVja2V0IHwgdW5kZWZpbmVkO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcblxuICBjb25zdCBidWNrZXQgPSBuZXcgczMuQnVja2V0KHN0YWNrLCBJRCwge1xuICAgIHZlcnNpb25lZDogdHJ1ZSxcbiAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgIGJsb2NrUHVibGljQWNjZXNzOiBzMy5CbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICBsaWZlY3ljbGVSdWxlczogW3tcbiAgICAgIGlkOiAnRXhwaXJlU3VwZXJzZWRlZENvZGUnLFxuICAgICAgbm9uY3VycmVudFZlcnNpb25FeHBpcmF0aW9uOiBEdXJhdGlvbi5kYXlzKDMwKSxcbiAgICAgIGFib3J0SW5jb21wbGV0ZU11bHRpcGFydFVwbG9hZEFmdGVyOiBEdXJhdGlvbi5kYXlzKDEpLFxuICAgIH1dLFxuICB9KTtcbiAgYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgIHNpZDogJ0xhbWJkYVdlYkZ1bmN0aW9uc1JlYWRDb2RlJyxcbiAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpXSxcbiAgICBhY3Rpb25zOiBbJ3MzOkdldE9iamVjdCcsICdzMzpHZXRPYmplY3RWZXJzaW9uJ10sXG4gICAgcmVzb3VyY2VzOiBbYnVja2V0LmFybkZvck9iamVjdHMoJyonKV0sXG4gICAgY29uZGl0aW9uczogeyBTdHJpbmdFcXVhbHM6IHsgJ2F3czpTb3VyY2VBY2NvdW50Jzogc3RhY2suYWNjb3VudCB9IH0sXG4gIH0pKTtcblxuICAvLyBPbmx5IGEgdGFnZ2VkIGJ1Y2tldCBpcyBlbXB0aWVkIChzZWUgRU1QVFlfT05fREVMRVRFX1RBRykuXG4gIFRhZ3Mub2YoYnVja2V0KS5hZGQoRU1QVFlfT05fREVMRVRFX1RBRy5rZXksIEVNUFRZX09OX0RFTEVURV9UQUcudmFsdWUpO1xuICBjb25zdCBwcm92aWRlciA9IHdlYkZ1bmN0aW9uUHJvdmlkZXIoc3RhY2spO1xuICBncmFudFRvUHJvdmlkZXIocHJvdmlkZXIsIHsgQWN0aW9uOiBbJ3MzOkxpc3RCdWNrZXRWZXJzaW9ucycsICdzMzpHZXRCdWNrZXRUYWdnaW5nJ10sIFJlc291cmNlOiBidWNrZXQuYnVja2V0QXJuIH0pO1xuICBncmFudFRvUHJvdmlkZXIocHJvdmlkZXIsIHsgQWN0aW9uOiBbJ3MzOkRlbGV0ZU9iamVjdCcsICdzMzpEZWxldGVPYmplY3RWZXJzaW9uJ10sIFJlc291cmNlOiBidWNrZXQuYXJuRm9yT2JqZWN0cygnKicpIH0pO1xuICBjb25zdCBwcm9wZXJ0aWVzOiBDb2RlQnVja2V0Q2xlYW51cFByb3BlcnRpZXMgPSB7IEJ1Y2tldE5hbWU6IGJ1Y2tldC5idWNrZXROYW1lIH07XG4gIC8vIERlcGVuZHMgb24gdGhlIGJ1Y2tldCAodGhyb3VnaCBpdHMgbmFtZSksIHNvIGl0J3MgZGVsZXRlZCwgYW5kIGVtcHRpZXMgaXQsIGp1c3QgYmVmb3JlIHRoZSBidWNrZXQuXG4gIG5ldyBDdXN0b21SZXNvdXJjZShzdGFjaywgYCR7SUR9Q2xlYW51cGAsIHtcbiAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICByZXNvdXJjZVR5cGU6IENPREVfQlVDS0VUX0NMRUFOVVBfUkVTT1VSQ0VfVFlQRSxcbiAgICBwcm9wZXJ0aWVzOiB7IC4uLnByb3BlcnRpZXMgfSxcbiAgfSk7XG4gIHJldHVybiBidWNrZXQ7XG59XG4iXX0=
|
|
@@ -97,3 +97,16 @@ export interface RegionalAlarmProperties {
|
|
|
97
97
|
/** PutMetricAlarm's `TreatMissingData`. */
|
|
98
98
|
readonly TreatMissingData: string;
|
|
99
99
|
}
|
|
100
|
+
/** Empties the stack's code bucket (every object version and delete marker) when the stack deletes it. */
|
|
101
|
+
export declare const CODE_BUCKET_CLEANUP_RESOURCE_TYPE = "Custom::LambdaWebCodeBucketCleanup";
|
|
102
|
+
/**
|
|
103
|
+
* Tag on the code bucket that lets the cleanup empty it. A rollback reverts the bucket's tags before it deletes
|
|
104
|
+
* resources the failed update created, so a cleanup resource added to an existing bucket never empties it on rollback.
|
|
105
|
+
*/
|
|
106
|
+
export declare const EMPTY_ON_DELETE_TAG: {
|
|
107
|
+
key: string;
|
|
108
|
+
value: string;
|
|
109
|
+
};
|
|
110
|
+
export interface CodeBucketCleanupProperties {
|
|
111
|
+
readonly BucketName: string;
|
|
112
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* CloudFormation passes every scalar property to the handler as a string.
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.REGIONAL_ALARM_RESOURCE_TYPE = exports.ALARM_NAME_PREFIX = exports.TRAFFIC_SHIFT_RESOURCE_TYPE = exports.REVISION_CLEANUP_RESOURCE_TYPE = exports.ENDPOINT_LOOKUP_RESOURCE_TYPE = exports.LOG_GROUP_RESOURCE_TYPE = exports.CODE_RESOURCE_TYPE = void 0;
|
|
10
|
+
exports.EMPTY_ON_DELETE_TAG = exports.CODE_BUCKET_CLEANUP_RESOURCE_TYPE = exports.REGIONAL_ALARM_RESOURCE_TYPE = exports.ALARM_NAME_PREFIX = exports.TRAFFIC_SHIFT_RESOURCE_TYPE = exports.REVISION_CLEANUP_RESOURCE_TYPE = exports.ENDPOINT_LOOKUP_RESOURCE_TYPE = exports.LOG_GROUP_RESOURCE_TYPE = exports.CODE_RESOURCE_TYPE = void 0;
|
|
11
11
|
exports.regionalDomainAttribute = regionalDomainAttribute;
|
|
12
12
|
/** Copies a code zip into the stack's code bucket and returns the object's version. */
|
|
13
13
|
exports.CODE_RESOURCE_TYPE = 'Custom::LambdaWebCode';
|
|
@@ -30,4 +30,11 @@ exports.TRAFFIC_SHIFT_RESOURCE_TYPE = 'Custom::LambdaWebTrafficShift';
|
|
|
30
30
|
/** Prefix of every alarm this library creates outside the stack's region; the provider's IAM is scoped to it. */
|
|
31
31
|
exports.ALARM_NAME_PREFIX = 'LambdaWeb-';
|
|
32
32
|
exports.REGIONAL_ALARM_RESOURCE_TYPE = 'Custom::LambdaWebAlarm';
|
|
33
|
-
|
|
33
|
+
/** Empties the stack's code bucket (every object version and delete marker) when the stack deletes it. */
|
|
34
|
+
exports.CODE_BUCKET_CLEANUP_RESOURCE_TYPE = 'Custom::LambdaWebCodeBucketCleanup';
|
|
35
|
+
/**
|
|
36
|
+
* Tag on the code bucket that lets the cleanup empty it. A rollback reverts the bucket's tags before it deletes
|
|
37
|
+
* resources the failed update created, so a cleanup resource added to an existing bucket never empties it on rollback.
|
|
38
|
+
*/
|
|
39
|
+
exports.EMPTY_ON_DELETE_TAG = { key: 'cdk-lambda-web:empty-on-delete', value: 'true' };
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItcHJvdG9jb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpdmF0ZS9wcm92aWRlci1wcm90b2NvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7QUEyQ0gsMERBRUM7QUEzQ0QsdUZBQXVGO0FBQzFFLFFBQUEsa0JBQWtCLEdBQUcsdUJBQXVCLENBQUM7QUFjMUQsdUdBQXVHO0FBQzFGLFFBQUEsdUJBQXVCLEdBQUcsMkJBQTJCLENBQUM7QUFjbkUsZ0hBQWdIO0FBQ25HLFFBQUEsNkJBQTZCLEdBQUcsaUNBQWlDLENBQUM7QUFTL0UsZ0ZBQWdGO0FBQ2hGLFNBQWdCLHVCQUF1QixDQUFDLE1BQWM7SUFDcEQsT0FBTyxVQUFVLE1BQU0sRUFBRSxDQUFDO0FBQzVCLENBQUM7QUFFRCxtSEFBbUg7QUFDdEcsUUFBQSw4QkFBOEIsR0FBRyxrQ0FBa0MsQ0FBQztBQWFqRjs7O0dBR0c7QUFDVSxRQUFBLDJCQUEyQixHQUFHLCtCQUErQixDQUFDO0FBMkIzRSxrSEFBa0g7QUFDbEgsaUhBQWlIO0FBQ3BHLFFBQUEsaUJBQWlCLEdBQUcsWUFBWSxDQUFDO0FBQ2pDLFFBQUEsNEJBQTRCLEdBQUcsd0JBQXdCLENBQUM7QUFnQnJFLDBHQUEwRztBQUM3RixRQUFBLGlDQUFpQyxHQUFHLG9DQUFvQyxDQUFDO0FBRXRGOzs7R0FHRztBQUNVLFFBQUEsbUJBQW1CLEdBQUcsRUFBRSxHQUFHLEVBQUUsZ0NBQWdDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250cmFjdCBiZXR3ZWVuIHRoZSBjb25zdHJ1Y3RzIGFuZCB0aGUgY3VzdG9tIHJlc291cmNlIGhhbmRsZXIgaW5cbiAqIGBoYW5kbGVycy93ZWItZnVuY3Rpb24tcHJvdmlkZXJgLiBCb3RoIHNpZGVzIGltcG9ydCB0aGlzIGZpbGUsIHNvIHJlc291cmNlXG4gKiB0eXBlcyBhbmQgcHJvcGVydHkgbmFtZXMgY2FuJ3QgZHJpZnQgYXBhcnQuXG4gKlxuICogQ2xvdWRGb3JtYXRpb24gcGFzc2VzIGV2ZXJ5IHNjYWxhciBwcm9wZXJ0eSB0byB0aGUgaGFuZGxlciBhcyBhIHN0cmluZy5cbiAqL1xuXG4vKiogQ29waWVzIGEgY29kZSB6aXAgaW50byB0aGUgc3RhY2sncyBjb2RlIGJ1Y2tldCBhbmQgcmV0dXJucyB0aGUgb2JqZWN0J3MgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBDT0RFX1JFU09VUkNFX1RZUEUgPSAnQ3VzdG9tOjpMYW1iZGFXZWJDb2RlJztcblxuZXhwb3J0IGludGVyZmFjZSBDb2RlUHJvcGVydGllcyB7XG4gIHJlYWRvbmx5IFNvdXJjZUJ1Y2tldDogc3RyaW5nO1xuICByZWFkb25seSBTb3VyY2VLZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgU291cmNlVmVyc2lvbj86IHN0cmluZztcbiAgcmVhZG9ubHkgRGVzdGluYXRpb25CdWNrZXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgRGVzdGluYXRpb25LZXk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2RlQXR0cmlidXRlcyB7XG4gIHJlYWRvbmx5IFZlcnNpb25JZDogc3RyaW5nO1xufVxuXG4vKiogRW5zdXJlcyBvbmUgbG9nIGdyb3VwIChpbiBhbnkgcmVnaW9uKSBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gcmV0ZW50aW9uLCBhbmQgcmVtb3ZlcyBpdCBvbiBkZWxldGUuICovXG5leHBvcnQgY29uc3QgTE9HX0dST1VQX1JFU09VUkNFX1RZUEUgPSAnQ3VzdG9tOjpMYW1iZGFXZWJMb2dHcm91cCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nR3JvdXBQcm9wZXJ0aWVzIHtcbiAgcmVhZG9ubHkgUmVnaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IExvZ0dyb3VwTmFtZTogc3RyaW5nO1xuICAvKiogRGF5cywgb3IgJ0luZmluaXRlJyBmb3Igbm8gcmV0ZW50aW9uLiAqL1xuICByZWFkb25seSBSZXRlbnRpb25JbkRheXM6IHN0cmluZztcbiAgcmVhZG9ubHkgUmVtb3ZhbFBvbGljeTogJ3JldGFpbicgfCAnZGVzdHJveSc7XG4gIC8qKiBTZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGRlbGV0aW5nLCBzbyBlbnZpcm9ubWVudHMgc3RpbGwgc2h1dHRpbmcgZG93biBjYW4gZmx1c2ggdGhlaXIgbGFzdCBsaW5lcy4gKi9cbiAgcmVhZG9ubHkgRmx1c2hXYWl0U2Vjb25kczogc3RyaW5nO1xuICAvKiogU2Vjb25kcyB0byB3YWl0IGJlZm9yZSBjaGVja2luZyBvbmNlIG1vcmUgdGhhdCB0aGUgc2VydmljZSBoYXNuJ3QgcmUtY3JlYXRlZCB0aGUgZ3JvdXAuICovXG4gIHJlYWRvbmx5IFJlY2hlY2tXYWl0U2Vjb25kczogc3RyaW5nO1xufVxuXG4vKiogUmVhZHMgYW4gZW5kcG9pbnQncyBwZXItcmVnaW9uIGRvbWFpbiBuYW1lcywgd2hpY2ggQ2xvdWRGb3JtYXRpb24gY2FuJ3QgaW5kZXggb3V0IG9mIGBSZWdpb25hbEVuZHBvaW50c2AuICovXG5leHBvcnQgY29uc3QgRU5EUE9JTlRfTE9PS1VQX1JFU09VUkNFX1RZUEUgPSAnQ3VzdG9tOjpMYW1iZGFXZWJFbmRwb2ludExvb2t1cCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5kcG9pbnRMb29rdXBQcm9wZXJ0aWVzIHtcbiAgcmVhZG9ubHkgRnVuY3Rpb25Bcm46IHN0cmluZztcbiAgcmVhZG9ubHkgRW5kcG9pbnROYW1lOiBzdHJpbmc7XG4gIC8qKiBDaGFuZ2VzIHdoZW5ldmVyIHRoZSBlbmRwb2ludCBpcyByZXBsYWNlZCwgc28gdGhlIGxvb2t1cCBydW5zIGFnYWluLiAqL1xuICByZWFkb25seSBFbmRwb2ludEFybjogc3RyaW5nO1xufVxuXG4vKiogQXR0cmlidXRlIG5hbWUgaG9sZGluZyB0aGUgZG9tYWluIG9mIG9uZSByZWdpb24sIGUuZy4gYERvbWFpbi51cy1lYXN0LTFgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lvbmFsRG9tYWluQXR0cmlidXRlKHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBEb21haW4uJHtyZWdpb259YDtcbn1cblxuLyoqIERlbGV0ZXMgYSBmdW5jdGlvbidzIG9sZGVzdCByZXZpc2lvbnMgYmV5b25kIGEgY291bnQsIGV4Y2VwdCB0aG9zZSB0aGF0IGFyZSBpbiB1c2Ugb3IgbWF5IGJlIHJvbGxlZCBiYWNrIHRvLiAqL1xuZXhwb3J0IGNvbnN0IFJFVklTSU9OX0NMRUFOVVBfUkVTT1VSQ0VfVFlQRSA9ICdDdXN0b206OkxhbWJkYVdlYlJldmlzaW9uQ2xlYW51cCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV2aXNpb25DbGVhbnVwUHJvcGVydGllcyB7XG4gIHJlYWRvbmx5IEZ1bmN0aW9uQXJuOiBzdHJpbmc7XG4gIC8qKiBIb3cgbWFueSBvZiB0aGUgbmV3ZXN0IHJldmlzaW9ucyB0byBrZWVwLiAqL1xuICByZWFkb25seSBLZWVwOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXZpc2lvbnMgdGhlIHRlbXBsYXRlIHVzZXMgKHRoZSBjdXJyZW50IG9uZSBhbmQgYW55IGFuIGVuZHBvaW50IHJvdXRlcyB0bykuIEFsd2F5cyBrZXB0LCBhbmQgb24gYW4gdXBkYXRlXG4gICAqIHRoZSBwcmV2aW91cyB0ZW1wbGF0ZSdzIGFyZSBrZXB0IHRvbzogdGhleSdyZSB3aGF0IGEgcm9sbGJhY2sgcm91dGVzIGJhY2sgdG8uXG4gICAqL1xuICByZWFkb25seSBSZXZpc2lvbklkczogc3RyaW5nW107XG59XG5cbi8qKlxuICogTW92ZXMgYW4gZW5kcG9pbnQncyB0cmFmZmljIHRvIGEgcmV2aXNpb24gaW4gc3RlcHMsIHdhdGNoaW5nIGFsYXJtcyAoY2FuYXJ5IGFuZCBsaW5lYXIgZGVwbG95bWVudHMpLlxuICogU2VydmVkIGJ5IHRoZSBkZXBsb3ltZW50IHByb3ZpZGVyIChgaGFuZGxlcnMvd2ViLWZ1bmN0aW9uLWRlcGxveW1lbnRgKSwgbm90IHRoZSBzaGFyZWQgcHJvdmlkZXI6IGl0IGNhbiBydW4gZm9yIHVwIHRvIGFuIGhvdXIuXG4gKi9cbmV4cG9ydCBjb25zdCBUUkFGRklDX1NISUZUX1JFU09VUkNFX1RZUEUgPSAnQ3VzdG9tOjpMYW1iZGFXZWJUcmFmZmljU2hpZnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWZmaWNTaGlmdFByb3BlcnRpZXMge1xuICByZWFkb25seSBGdW5jdGlvbkFybjogc3RyaW5nO1xuICByZWFkb25seSBFbmRwb2ludE5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSByZXZpc2lvbiB0aGF0IGVuZHMgdXAgd2l0aCBhbGwgb2YgdGhlIGVuZHBvaW50J3MgdHJhZmZpYy4gKi9cbiAgcmVhZG9ubHkgUmV2aXNpb25JZDogc3RyaW5nO1xuICAvKiogVGhlIHJldmlzaW9uJ3Mgc2hhcmUgb2YgdHJhZmZpYyBhdCBlYWNoIHN0ZXAsIGluIHBlcmNlbnQsIGNvbW1hLXNlcGFyYXRlZDsgdGhlIGxhc3QgaXMgMTAwLiAqL1xuICByZWFkb25seSBTdGVwczogc3RyaW5nO1xuICAvKiogU2Vjb25kcyBlYWNoIHN0ZXAgc2VydmVzIChjb3VudGVkIGZyb20gd2hlbiBpdHMgdXBkYXRlIHN0YXJ0ZWQpIGJlZm9yZSB0aGUgbmV4dC4gKi9cbiAgcmVhZG9ubHkgV2FpdFNlY29uZHM6IHN0cmluZztcbiAgLyoqIEFsYXJtcyAoaW4gYW55IHJlZ2lvbikgdGhhdCBzdG9wIHRoZSBkZXBsb3ltZW50IGFuZCByZXN0b3JlIHRoZSBwcmV2aW91cyB3ZWlnaHRzLiAqL1xuICByZWFkb25seSBBbGFybUFybnM/OiBzdHJpbmdbXTtcbiAgLyoqIEhhc2ggb2YgdGhlIGVuZHBvaW50J3Mgb3RoZXIgc2V0dGluZ3M6IGFueSBlbmRwb2ludCBjaGFuZ2UgcmUtY2hlY2tzIGl0cyB0cmFmZmljIGJlZm9yZSBDbG91ZEZvcm1hdGlvbiB3cml0ZXMgaXQuICovXG4gIHJlYWRvbmx5IEVuZHBvaW50Q29uZmlnOiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IGBvbkV2ZW50YCBoYW5kcyB0byBgaXNDb21wbGV0ZWAgKHRoZSBQcm92aWRlciBmcmFtZXdvcmsgcGFzc2VzIGl0IGFzIGBEYXRhYCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYWZmaWNTaGlmdFN0YXRlIHtcbiAgLyoqIGBub25lYDogbm90aGluZyB0byBkbzsgYHNoaWZ0YDogbW92aW5nIGluIHN0ZXBzOyBgc3dpdGNoYDogYWxsIGF0IG9uY2UsIHdpdGhvdXQgYWxhcm1zIChzdGFjayByb2xsYmFjaykuICovXG4gIHJlYWRvbmx5IEFjdGlvbjogJ25vbmUnIHwgJ3NoaWZ0JyB8ICdzd2l0Y2gnO1xuICAvKiogYHNoaWZ0YDogdGhlIGVuZHBvaW50J3Mgd2VpZ2h0cyBiZWZvcmUgdGhlIGRlcGxveW1lbnQgKEpTT04gYFt7cmV2aXNpb25JZCwgd2VpZ2h0fV1gKSwgcmVzdG9yZWQgd2hlbiBhbiBhbGFybSBmaXJlcy4gKi9cbiAgcmVhZG9ubHkgUHJldmlvdXNXZWlnaHRzPzogc3RyaW5nO1xuICAvKiogYHN3aXRjaGA6IHRoZSB3ZWlnaHRzIGJlaW5nIHdyaXR0ZW4gKEpTT04gYFt7cmV2aXNpb25JZCwgd2VpZ2h0fV1gKS4gKi9cbiAgcmVhZG9ubHkgVGFyZ2V0V2VpZ2h0cz86IHN0cmluZztcbn1cblxuLyoqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIG1ldHJpYyBhbGFybSBpbiBhbnkgcmVnaW9uIChDbG91ZEZvcm1hdGlvbiBvbmx5IGNyZWF0ZXMgYWxhcm1zIGluIHRoZSBzdGFjaydzIHJlZ2lvbikuICovXG4vKiogUHJlZml4IG9mIGV2ZXJ5IGFsYXJtIHRoaXMgbGlicmFyeSBjcmVhdGVzIG91dHNpZGUgdGhlIHN0YWNrJ3MgcmVnaW9uOyB0aGUgcHJvdmlkZXIncyBJQU0gaXMgc2NvcGVkIHRvIGl0LiAqL1xuZXhwb3J0IGNvbnN0IEFMQVJNX05BTUVfUFJFRklYID0gJ0xhbWJkYVdlYi0nO1xuZXhwb3J0IGNvbnN0IFJFR0lPTkFMX0FMQVJNX1JFU09VUkNFX1RZUEUgPSAnQ3VzdG9tOjpMYW1iZGFXZWJBbGFybSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaW9uYWxBbGFybVByb3BlcnRpZXMge1xuICByZWFkb25seSBSZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgQWxhcm1OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IEFsYXJtRGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqIFB1dE1ldHJpY0FsYXJtJ3MgYE1ldHJpY3NgLCBhcyBKU09OLiAqL1xuICByZWFkb25seSBNZXRyaWNzOiBzdHJpbmc7XG4gIHJlYWRvbmx5IFRocmVzaG9sZDogc3RyaW5nO1xuICByZWFkb25seSBFdmFsdWF0aW9uUGVyaW9kczogc3RyaW5nO1xuICAvKiogUHV0TWV0cmljQWxhcm0ncyBgQ29tcGFyaXNvbk9wZXJhdG9yYC4gKi9cbiAgcmVhZG9ubHkgQ29tcGFyaXNvbk9wZXJhdG9yOiBzdHJpbmc7XG4gIC8qKiBQdXRNZXRyaWNBbGFybSdzIGBUcmVhdE1pc3NpbmdEYXRhYC4gKi9cbiAgcmVhZG9ubHkgVHJlYXRNaXNzaW5nRGF0YTogc3RyaW5nO1xufVxuXG4vKiogRW1wdGllcyB0aGUgc3RhY2sncyBjb2RlIGJ1Y2tldCAoZXZlcnkgb2JqZWN0IHZlcnNpb24gYW5kIGRlbGV0ZSBtYXJrZXIpIHdoZW4gdGhlIHN0YWNrIGRlbGV0ZXMgaXQuICovXG5leHBvcnQgY29uc3QgQ09ERV9CVUNLRVRfQ0xFQU5VUF9SRVNPVVJDRV9UWVBFID0gJ0N1c3RvbTo6TGFtYmRhV2ViQ29kZUJ1Y2tldENsZWFudXAnO1xuXG4vKipcbiAqIFRhZyBvbiB0aGUgY29kZSBidWNrZXQgdGhhdCBsZXRzIHRoZSBjbGVhbnVwIGVtcHR5IGl0LiBBIHJvbGxiYWNrIHJldmVydHMgdGhlIGJ1Y2tldCdzIHRhZ3MgYmVmb3JlIGl0IGRlbGV0ZXNcbiAqIHJlc291cmNlcyB0aGUgZmFpbGVkIHVwZGF0ZSBjcmVhdGVkLCBzbyBhIGNsZWFudXAgcmVzb3VyY2UgYWRkZWQgdG8gYW4gZXhpc3RpbmcgYnVja2V0IG5ldmVyIGVtcHRpZXMgaXQgb24gcm9sbGJhY2suXG4gKi9cbmV4cG9ydCBjb25zdCBFTVBUWV9PTl9ERUxFVEVfVEFHID0geyBrZXk6ICdjZGstbGFtYmRhLXdlYjplbXB0eS1vbi1kZWxldGUnLCB2YWx1ZTogJ3RydWUnIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUJ1Y2tldENsZWFudXBQcm9wZXJ0aWVzIHtcbiAgcmVhZG9ubHkgQnVja2V0TmFtZTogc3RyaW5nO1xufVxuIl19
|
|
@@ -2,8 +2,9 @@ import { CustomResourceProvider } from 'aws-cdk-lib';
|
|
|
2
2
|
import type { Construct } from 'constructs';
|
|
3
3
|
/**
|
|
4
4
|
* The single custom resource provider (one Lambda per stack) behind code copies, log groups,
|
|
5
|
-
* endpoint lookups, revision cleanup
|
|
6
|
-
* not a `lambda.Function`, so tools that discover functions by class (e.g. cdk-watchful)
|
|
5
|
+
* endpoint lookups, revision cleanup, alarms in other regions and emptying the code bucket. It's a core
|
|
6
|
+
* `CustomResourceProvider`, not a `lambda.Function`, so tools that discover functions by class (e.g. cdk-watchful)
|
|
7
|
+
* don't pick it up.
|
|
7
8
|
*/
|
|
8
9
|
export declare function webFunctionProvider(scope: Construct): CustomResourceProvider;
|
|
9
10
|
/**
|
package/lib/private/provider.js
CHANGED
|
@@ -37,14 +37,17 @@ exports.webFunctionProvider = webFunctionProvider;
|
|
|
37
37
|
exports.grantToProvider = grantToProvider;
|
|
38
38
|
const path = __importStar(require("node:path"));
|
|
39
39
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
40
|
+
const logs = __importStar(require("aws-cdk-lib/aws-logs"));
|
|
40
41
|
const provider_protocol_1 = require("./provider-protocol");
|
|
41
42
|
/**
|
|
42
43
|
* The single custom resource provider (one Lambda per stack) behind code copies, log groups,
|
|
43
|
-
* endpoint lookups, revision cleanup
|
|
44
|
-
* not a `lambda.Function`, so tools that discover functions by class (e.g. cdk-watchful)
|
|
44
|
+
* endpoint lookups, revision cleanup, alarms in other regions and emptying the code bucket. It's a core
|
|
45
|
+
* `CustomResourceProvider`, not a `lambda.Function`, so tools that discover functions by class (e.g. cdk-watchful)
|
|
46
|
+
* don't pick it up.
|
|
45
47
|
*/
|
|
46
48
|
function webFunctionProvider(scope) {
|
|
47
|
-
const
|
|
49
|
+
const stack = aws_cdk_lib_1.Stack.of(scope);
|
|
50
|
+
const provider = aws_cdk_lib_1.CustomResourceProvider.getOrCreateProvider(scope, PROVIDER_ID, {
|
|
48
51
|
codeDirectory: path.join(__dirname, '..', '..', 'assets', 'web-function-provider'),
|
|
49
52
|
runtime: aws_cdk_lib_1.CustomResourceProviderRuntime.NODEJS_24_X,
|
|
50
53
|
// Log group deletion waits for late flushes (75s + a re-check) on top of the API calls.
|
|
@@ -60,8 +63,26 @@ function webFunctionProvider(scope) {
|
|
|
60
63
|
service: 'cloudwatch', region: '*', resource: 'alarm', resourceName: `${provider_protocol_1.ALARM_NAME_PREFIX}*`, arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME,
|
|
61
64
|
}),
|
|
62
65
|
});
|
|
66
|
+
if (stack.node.tryFindChild(LOG_GROUP_ID))
|
|
67
|
+
return provider;
|
|
68
|
+
// Logs go to a group the stack owns, with retention, deleted with the stack: the provider's default group
|
|
69
|
+
// (/aws/lambda/<function>) would be created by Lambda without retention and outlive the stack.
|
|
70
|
+
const logGroup = new logs.LogGroup(stack, LOG_GROUP_ID, {
|
|
71
|
+
retention: logs.RetentionDays.ONE_MONTH,
|
|
72
|
+
removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
73
|
+
});
|
|
74
|
+
const handler = provider.node.findChild('Handler');
|
|
75
|
+
handler.addPropertyOverride('LoggingConfig', { LogGroup: logGroup.logGroupName, LogFormat: 'Text' });
|
|
76
|
+
handler.addDependency(logGroup.node.defaultChild);
|
|
77
|
+
// Only write to that group. The default AWSLambdaBasicExecutionRole allows logs:CreateLogGroup, so log lines
|
|
78
|
+
// Lambda delivers late, after CloudFormation deleted the group with the stack, would re-create it without retention.
|
|
79
|
+
// No Role child when the app uses pre-created roles (iam.Role.customizeRoles): that role is managed outside CDK.
|
|
80
|
+
provider.node.tryFindChild('Role')?.addPropertyDeletionOverride('ManagedPolicyArns');
|
|
81
|
+
grantToProvider(provider, { Action: ['logs:CreateLogStream', 'logs:PutLogEvents'], Resource: logGroup.logGroupArn });
|
|
63
82
|
return provider;
|
|
64
83
|
}
|
|
84
|
+
const PROVIDER_ID = 'Custom::LambdaWebFunctionProvider';
|
|
85
|
+
const LOG_GROUP_ID = 'LambdaWebFunctionProviderLogs';
|
|
65
86
|
const granted = new WeakMap();
|
|
66
87
|
/**
|
|
67
88
|
* Adds a statement to the shared provider's role, once.
|
|
@@ -84,4 +105,4 @@ function grantToProvider(provider, statement) {
|
|
|
84
105
|
seen.add(key);
|
|
85
106
|
provider.addToRolePolicy({ Effect: 'Allow', ...statement });
|
|
86
107
|
}
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpdmF0ZS9wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVlBLGtEQWtDQztBQWdCRCwwQ0FVQztBQXhFRCxnREFBa0M7QUFDbEMsNkNBQXVKO0FBQ3ZKLDJEQUE2QztBQUU3QywyREFBd0Q7QUFFeEQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxLQUFnQjtJQUNsRCxNQUFNLEtBQUssR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixNQUFNLFFBQVEsR0FBRyxvQ0FBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFO1FBQzlFLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSx1QkFBdUIsQ0FBQztRQUNsRixPQUFPLEVBQUUsMkNBQTZCLENBQUMsV0FBVztRQUNsRCx3RkFBd0Y7UUFDeEYsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1QixVQUFVLEVBQUUsa0JBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQy9CLFdBQVcsRUFBRSxzR0FBc0c7S0FDcEgsQ0FBQyxDQUFDO0lBQ0gsNkdBQTZHO0lBQzdHLHNHQUFzRztJQUN0RyxlQUFlLENBQUMsUUFBUSxFQUFFO1FBQ3hCLE1BQU0sRUFBRSxDQUFDLDJCQUEyQixFQUFFLHlCQUF5QixDQUFDO1FBQ2hFLFFBQVEsRUFBRSxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcscUNBQWlCLEdBQUcsRUFBRSxTQUFTLEVBQUUsdUJBQVMsQ0FBQyxtQkFBbUI7U0FDdkksQ0FBQztLQUNILENBQUMsQ0FBQztJQUNILElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDM0QsMEdBQTBHO0lBQzFHLCtGQUErRjtJQUMvRixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRTtRQUN0RCxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTO1FBQ3ZDLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87S0FDckMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFnQixDQUFDO0lBQ2xFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNyRyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBMkIsQ0FBQyxDQUFDO0lBQ2pFLDZHQUE2RztJQUM3RyxxSEFBcUg7SUFDckgsaUhBQWlIO0lBQ2hILFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBNkIsRUFBRSwyQkFBMkIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2xILGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNySCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxXQUFXLEdBQUcsbUNBQW1DLENBQUM7QUFDeEQsTUFBTSxZQUFZLEdBQUcsK0JBQStCLENBQUM7QUFFckQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQXVDLENBQUM7QUFFbkU7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixlQUFlLENBQUMsUUFBZ0MsRUFBRSxTQUFxRTtJQUNySSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPO0lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEFybkZvcm1hdCwgdHlwZSBDZm5SZXNvdXJjZSwgQ3VzdG9tUmVzb3VyY2VQcm92aWRlciwgQ3VzdG9tUmVzb3VyY2VQcm92aWRlclJ1bnRpbWUsIER1cmF0aW9uLCBSZW1vdmFsUG9saWN5LCBTaXplLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEFMQVJNX05BTUVfUFJFRklYIH0gZnJvbSAnLi9wcm92aWRlci1wcm90b2NvbCc7XG5cbi8qKlxuICogVGhlIHNpbmdsZSBjdXN0b20gcmVzb3VyY2UgcHJvdmlkZXIgKG9uZSBMYW1iZGEgcGVyIHN0YWNrKSBiZWhpbmQgY29kZSBjb3BpZXMsIGxvZyBncm91cHMsXG4gKiBlbmRwb2ludCBsb29rdXBzLCByZXZpc2lvbiBjbGVhbnVwLCBhbGFybXMgaW4gb3RoZXIgcmVnaW9ucyBhbmQgZW1wdHlpbmcgdGhlIGNvZGUgYnVja2V0LiBJdCdzIGEgY29yZVxuICogYEN1c3RvbVJlc291cmNlUHJvdmlkZXJgLCBub3QgYSBgbGFtYmRhLkZ1bmN0aW9uYCwgc28gdG9vbHMgdGhhdCBkaXNjb3ZlciBmdW5jdGlvbnMgYnkgY2xhc3MgKGUuZy4gY2RrLXdhdGNoZnVsKVxuICogZG9uJ3QgcGljayBpdCB1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdlYkZ1bmN0aW9uUHJvdmlkZXIoc2NvcGU6IENvbnN0cnVjdCk6IEN1c3RvbVJlc291cmNlUHJvdmlkZXIge1xuICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHNjb3BlKTtcbiAgY29uc3QgcHJvdmlkZXIgPSBDdXN0b21SZXNvdXJjZVByb3ZpZGVyLmdldE9yQ3JlYXRlUHJvdmlkZXIoc2NvcGUsIFBST1ZJREVSX0lELCB7XG4gICAgY29kZURpcmVjdG9yeTogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ2Fzc2V0cycsICd3ZWItZnVuY3Rpb24tcHJvdmlkZXInKSxcbiAgICBydW50aW1lOiBDdXN0b21SZXNvdXJjZVByb3ZpZGVyUnVudGltZS5OT0RFSlNfMjRfWCxcbiAgICAvLyBMb2cgZ3JvdXAgZGVsZXRpb24gd2FpdHMgZm9yIGxhdGUgZmx1c2hlcyAoNzVzICsgYSByZS1jaGVjaykgb24gdG9wIG9mIHRoZSBBUEkgY2FsbHMuXG4gICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICBtZW1vcnlTaXplOiBTaXplLm1lYmlieXRlcygyNTYpLFxuICAgIGRlc2NyaXB0aW9uOiAnQ29waWVzIGNvZGUsIG1hbmFnZXMgbG9nIGdyb3VwcywgbG9va3MgdXAgZW5kcG9pbnRzIGFuZCBjbGVhbnMgdXAgcmV2aXNpb25zIGZvciBMYW1iZGEgV2ViIEZ1bmN0aW9ucycsXG4gIH0pO1xuICAvLyBHcmFudGVkIHdoZXRoZXIgb3Igbm90IGEgc3RhY2sgaGFzIGFsYXJtcyBpbiBvdGhlciByZWdpb25zIHlldDogYSBncmFudCBhZGRlZCBvciByZW1vdmVkIHRvZ2V0aGVyIHdpdGggdGhlXG4gIC8vIGFsYXJtIGZhaWxzIG9uIElBTSBwcm9wYWdhdGlvbiwgb3IgbGVhdmVzIHRoZSBhbGFybSBiZWhpbmQgd2hlbiBpdCdzIHJlbW92ZWQgKHNlZSBncmFudFRvUHJvdmlkZXIpLlxuICBncmFudFRvUHJvdmlkZXIocHJvdmlkZXIsIHtcbiAgICBBY3Rpb246IFsnY2xvdWR3YXRjaDpQdXRNZXRyaWNBbGFybScsICdjbG91ZHdhdGNoOkRlbGV0ZUFsYXJtcyddLFxuICAgIFJlc291cmNlOiBTdGFjay5vZihwcm92aWRlcikuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdjbG91ZHdhdGNoJywgcmVnaW9uOiAnKicsIHJlc291cmNlOiAnYWxhcm0nLCByZXNvdXJjZU5hbWU6IGAke0FMQVJNX05BTUVfUFJFRklYfSpgLCBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FLFxuICAgIH0pLFxuICB9KTtcbiAgaWYgKHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKExPR19HUk9VUF9JRCkpIHJldHVybiBwcm92aWRlcjtcbiAgLy8gTG9ncyBnbyB0byBhIGdyb3VwIHRoZSBzdGFjayBvd25zLCB3aXRoIHJldGVudGlvbiwgZGVsZXRlZCB3aXRoIHRoZSBzdGFjazogdGhlIHByb3ZpZGVyJ3MgZGVmYXVsdCBncm91cFxuICAvLyAoL2F3cy9sYW1iZGEvPGZ1bmN0aW9uPikgd291bGQgYmUgY3JlYXRlZCBieSBMYW1iZGEgd2l0aG91dCByZXRlbnRpb24gYW5kIG91dGxpdmUgdGhlIHN0YWNrLlxuICBjb25zdCBsb2dHcm91cCA9IG5ldyBsb2dzLkxvZ0dyb3VwKHN0YWNrLCBMT0dfR1JPVVBfSUQsIHtcbiAgICByZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICB9KTtcbiAgY29uc3QgaGFuZGxlciA9IHByb3ZpZGVyLm5vZGUuZmluZENoaWxkKCdIYW5kbGVyJykgYXMgQ2ZuUmVzb3VyY2U7XG4gIGhhbmRsZXIuYWRkUHJvcGVydHlPdmVycmlkZSgnTG9nZ2luZ0NvbmZpZycsIHsgTG9nR3JvdXA6IGxvZ0dyb3VwLmxvZ0dyb3VwTmFtZSwgTG9nRm9ybWF0OiAnVGV4dCcgfSk7XG4gIGhhbmRsZXIuYWRkRGVwZW5kZW5jeShsb2dHcm91cC5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5SZXNvdXJjZSk7XG4gIC8vIE9ubHkgd3JpdGUgdG8gdGhhdCBncm91cC4gVGhlIGRlZmF1bHQgQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlIGFsbG93cyBsb2dzOkNyZWF0ZUxvZ0dyb3VwLCBzbyBsb2cgbGluZXNcbiAgLy8gTGFtYmRhIGRlbGl2ZXJzIGxhdGUsIGFmdGVyIENsb3VkRm9ybWF0aW9uIGRlbGV0ZWQgdGhlIGdyb3VwIHdpdGggdGhlIHN0YWNrLCB3b3VsZCByZS1jcmVhdGUgaXQgd2l0aG91dCByZXRlbnRpb24uXG4gIC8vIE5vIFJvbGUgY2hpbGQgd2hlbiB0aGUgYXBwIHVzZXMgcHJlLWNyZWF0ZWQgcm9sZXMgKGlhbS5Sb2xlLmN1c3RvbWl6ZVJvbGVzKTogdGhhdCByb2xlIGlzIG1hbmFnZWQgb3V0c2lkZSBDREsuXG4gIChwcm92aWRlci5ub2RlLnRyeUZpbmRDaGlsZCgnUm9sZScpIGFzIENmblJlc291cmNlIHwgdW5kZWZpbmVkKT8uYWRkUHJvcGVydHlEZWxldGlvbk92ZXJyaWRlKCdNYW5hZ2VkUG9saWN5QXJucycpO1xuICBncmFudFRvUHJvdmlkZXIocHJvdmlkZXIsIHsgQWN0aW9uOiBbJ2xvZ3M6Q3JlYXRlTG9nU3RyZWFtJywgJ2xvZ3M6UHV0TG9nRXZlbnRzJ10sIFJlc291cmNlOiBsb2dHcm91cC5sb2dHcm91cEFybiB9KTtcbiAgcmV0dXJuIHByb3ZpZGVyO1xufVxuXG5jb25zdCBQUk9WSURFUl9JRCA9ICdDdXN0b206OkxhbWJkYVdlYkZ1bmN0aW9uUHJvdmlkZXInO1xuY29uc3QgTE9HX0dST1VQX0lEID0gJ0xhbWJkYVdlYkZ1bmN0aW9uUHJvdmlkZXJMb2dzJztcblxuY29uc3QgZ3JhbnRlZCA9IG5ldyBXZWFrTWFwPEN1c3RvbVJlc291cmNlUHJvdmlkZXIsIFNldDxzdHJpbmc+PigpO1xuXG4vKipcbiAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIHNoYXJlZCBwcm92aWRlcidzIHJvbGUsIG9uY2UuXG4gKlxuICogR3JhbnRzIG11c3QgYmUgKipzdGFibGUgYWNyb3NzIHVwZGF0ZXMqKjogc2NvcGVkIGJ5IHByZWZpeGVzIHRoYXQgZG9uJ3QgY2hhbmdlIHdoZW4gYVxuICogcmVzb3VyY2UgaXMgcmVuYW1lZCBvciByZXBsYWNlZC4gQ2xvdWRGb3JtYXRpb24gdXBkYXRlcyB0aGUgcm9sZSBqdXN0IGJlZm9yZSAoYW5kIG9uIHJvbGxiYWNrLFxuICogcmV2ZXJ0cyBpdCBqdXN0IGJlZm9yZSkgdGhlIGN1c3RvbSByZXNvdXJjZXMgcnVuLCBhbmQgSUFNIHRha2VzIHNlY29uZHMgdG8gbWludXRlcyB0b1xuICogcHJvcGFnYXRlLCBzbyBwZXItbmFtZSBncmFudHMgZmFpbCB3aXRoIEFjY2Vzc0RlbmllZCBvbiByZW5hbWVzIGFuZCBvbiByb2xsYmFjayBjbGVhbnVwLlxuICogVGhleSBtdXN0IGFsc28gbmV2ZXIgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgb2YgcmVzb3VyY2VzIHRoYXQgdXNlIHRoZSBwcm92aWRlciAoY3ljbGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JhbnRUb1Byb3ZpZGVyKHByb3ZpZGVyOiBDdXN0b21SZXNvdXJjZVByb3ZpZGVyLCBzdGF0ZW1lbnQ6IHsgQWN0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXTsgUmVzb3VyY2U6IHN0cmluZyB8IHN0cmluZ1tdIH0pOiB2b2lkIHtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoU3RhY2sub2YocHJvdmlkZXIpLnJlc29sdmUoc3RhdGVtZW50KSk7XG4gIGxldCBzZWVuID0gZ3JhbnRlZC5nZXQocHJvdmlkZXIpO1xuICBpZiAoIXNlZW4pIHtcbiAgICBzZWVuID0gbmV3IFNldCgpO1xuICAgIGdyYW50ZWQuc2V0KHByb3ZpZGVyLCBzZWVuKTtcbiAgfVxuICBpZiAoc2Vlbi5oYXMoa2V5KSkgcmV0dXJuO1xuICBzZWVuLmFkZChrZXkpO1xuICBwcm92aWRlci5hZGRUb1JvbGVQb2xpY3koeyBFZmZlY3Q6ICdBbGxvdycsIC4uLnN0YXRlbWVudCB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks on a Web Function's resource policy, run at synthesis on the resolved document.
|
|
3
|
+
*
|
|
4
|
+
* Lambda rejects a public policy at deploy time ("Lambda blocked the creation of this policy because it would grant
|
|
5
|
+
* public access"): a `*` principal is only accepted when a trusted condition key pins the caller. A service principal
|
|
6
|
+
* without a source condition is accepted, but lets any account's use of that service call the endpoint.
|
|
7
|
+
*/
|
|
8
|
+
export interface ResourcePolicyFindings {
|
|
9
|
+
/** Statements Lambda would reject as public. */
|
|
10
|
+
readonly errors: string[];
|
|
11
|
+
/** Service principals allowed without a source condition. */
|
|
12
|
+
readonly unscopedServices: string[];
|
|
13
|
+
}
|
|
14
|
+
/** Inspects a resolved policy document (`{ Statement: [...] }`). */
|
|
15
|
+
export declare function inspectResourcePolicy(document: any): ResourcePolicyFindings;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Checks on a Web Function's resource policy, run at synthesis on the resolved document.
|
|
4
|
+
*
|
|
5
|
+
* Lambda rejects a public policy at deploy time ("Lambda blocked the creation of this policy because it would grant
|
|
6
|
+
* public access"): a `*` principal is only accepted when a trusted condition key pins the caller. A service principal
|
|
7
|
+
* without a source condition is accepted, but lets any account's use of that service call the endpoint.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.inspectResourcePolicy = inspectResourcePolicy;
|
|
11
|
+
/** Condition keys Lambda accepts to make a `*` principal non-public (Lambda Web Function permissions docs, 2026-10). */
|
|
12
|
+
const TRUSTED_KEYS = [
|
|
13
|
+
'aws:PrincipalAccount', 'aws:PrincipalArn', 'aws:PrincipalOrgID', 'aws:PrincipalOrgPaths', 'aws:SourceAccount', 'aws:SourceArn',
|
|
14
|
+
'aws:SourceOrgID', 'aws:SourceOrgPaths', 'aws:SourceVpc', 'aws:SourceVpcArn', 'aws:SourceVpce', 'aws:VpceAccount', 'aws:VpceOrgID',
|
|
15
|
+
'aws:VpceOrgPaths', 'aws:Ec2InstanceSourceVpc', 'aws:UserId', 'aws:PrincipalServiceName', 'aws:PrincipalServiceNamesList',
|
|
16
|
+
'aws:PrincipalIsAWSService', 'lambda:SourceFunctionArn',
|
|
17
|
+
].map((k) => k.toLowerCase());
|
|
18
|
+
/** Condition keys that tie a service principal to the resource or account calling on its behalf. */
|
|
19
|
+
const SOURCE_KEYS = ['aws:SourceArn', 'aws:SourceAccount', 'aws:SourceOrgID', 'aws:SourceOrgPaths'].map((k) => k.toLowerCase());
|
|
20
|
+
/** Inspects a resolved policy document (`{ Statement: [...] }`). */
|
|
21
|
+
function inspectResourcePolicy(document) {
|
|
22
|
+
const errors = [];
|
|
23
|
+
const unscopedServices = [];
|
|
24
|
+
for (const [i, s] of (document?.Statement ?? []).entries()) {
|
|
25
|
+
if (s.Effect !== 'Allow')
|
|
26
|
+
continue;
|
|
27
|
+
const keys = conditionKeys(s.Condition);
|
|
28
|
+
const name = s.Sid ? `statement '${s.Sid}'` : `statement ${i + 1}`;
|
|
29
|
+
if (isWildcard(s.Principal) && !keys.some((k) => TRUSTED_KEYS.includes(k))) {
|
|
30
|
+
errors.push(`${name} allows principal '*': Lambda rejects public resource policies. Pin the caller with a condition such as aws:PrincipalOrgID or aws:SourceAccount (e.g. iam.OrganizationPrincipal), or name the accounts`);
|
|
31
|
+
}
|
|
32
|
+
const services = list(s.Principal?.Service).map(String);
|
|
33
|
+
if (services.length > 0 && !keys.some((k) => SOURCE_KEYS.includes(k))) {
|
|
34
|
+
unscopedServices.push(...services);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return { errors, unscopedServices };
|
|
38
|
+
}
|
|
39
|
+
function isWildcard(principal) {
|
|
40
|
+
return principal === '*' || list(principal?.AWS).includes('*');
|
|
41
|
+
}
|
|
42
|
+
function conditionKeys(condition) {
|
|
43
|
+
return Object.values(condition ?? {}).flatMap((byKey) => Object.keys(byKey ?? {})).map((k) => k.toLowerCase());
|
|
44
|
+
}
|
|
45
|
+
function list(value) {
|
|
46
|
+
return value === undefined ? [] : Array.isArray(value) ? value : [value];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ByaXZhdGUvcmVzb3VyY2UtcG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7O0FBcUJILHNEQWdCQztBQW5DRCx3SEFBd0g7QUFDeEgsTUFBTSxZQUFZLEdBQUc7SUFDbkIsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsZUFBZTtJQUMvSCxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsZUFBZTtJQUNsSSxrQkFBa0IsRUFBRSwwQkFBMEIsRUFBRSxZQUFZLEVBQUUsMEJBQTBCLEVBQUUsK0JBQStCO0lBQ3pILDJCQUEyQixFQUFFLDBCQUEwQjtDQUN4RCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFFOUIsb0dBQW9HO0FBQ3BHLE1BQU0sV0FBVyxHQUFHLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQVNoSSxvRUFBb0U7QUFDcEUsU0FBZ0IscUJBQXFCLENBQUMsUUFBYTtJQUNqRCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsTUFBTSxnQkFBZ0IsR0FBYSxFQUFFLENBQUM7SUFDdEMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxPQUFPO1lBQUUsU0FBUztRQUNuQyxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSx3TUFBd00sQ0FBQyxDQUFDO1FBQy9OLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3RFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxTQUFjO0lBQ2hDLE9BQU8sU0FBUyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsU0FBYztJQUNuQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3RILENBQUM7QUFFRCxTQUFTLElBQUksQ0FBQyxLQUFjO0lBQzFCLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2hlY2tzIG9uIGEgV2ViIEZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5LCBydW4gYXQgc3ludGhlc2lzIG9uIHRoZSByZXNvbHZlZCBkb2N1bWVudC5cbiAqXG4gKiBMYW1iZGEgcmVqZWN0cyBhIHB1YmxpYyBwb2xpY3kgYXQgZGVwbG95IHRpbWUgKFwiTGFtYmRhIGJsb2NrZWQgdGhlIGNyZWF0aW9uIG9mIHRoaXMgcG9saWN5IGJlY2F1c2UgaXQgd291bGQgZ3JhbnRcbiAqIHB1YmxpYyBhY2Nlc3NcIik6IGEgYCpgIHByaW5jaXBhbCBpcyBvbmx5IGFjY2VwdGVkIHdoZW4gYSB0cnVzdGVkIGNvbmRpdGlvbiBrZXkgcGlucyB0aGUgY2FsbGVyLiBBIHNlcnZpY2UgcHJpbmNpcGFsXG4gKiB3aXRob3V0IGEgc291cmNlIGNvbmRpdGlvbiBpcyBhY2NlcHRlZCwgYnV0IGxldHMgYW55IGFjY291bnQncyB1c2Ugb2YgdGhhdCBzZXJ2aWNlIGNhbGwgdGhlIGVuZHBvaW50LlxuICovXG5cbi8qKiBDb25kaXRpb24ga2V5cyBMYW1iZGEgYWNjZXB0cyB0byBtYWtlIGEgYCpgIHByaW5jaXBhbCBub24tcHVibGljIChMYW1iZGEgV2ViIEZ1bmN0aW9uIHBlcm1pc3Npb25zIGRvY3MsIDIwMjYtMTApLiAqL1xuY29uc3QgVFJVU1RFRF9LRVlTID0gW1xuICAnYXdzOlByaW5jaXBhbEFjY291bnQnLCAnYXdzOlByaW5jaXBhbEFybicsICdhd3M6UHJpbmNpcGFsT3JnSUQnLCAnYXdzOlByaW5jaXBhbE9yZ1BhdGhzJywgJ2F3czpTb3VyY2VBY2NvdW50JywgJ2F3czpTb3VyY2VBcm4nLFxuICAnYXdzOlNvdXJjZU9yZ0lEJywgJ2F3czpTb3VyY2VPcmdQYXRocycsICdhd3M6U291cmNlVnBjJywgJ2F3czpTb3VyY2VWcGNBcm4nLCAnYXdzOlNvdXJjZVZwY2UnLCAnYXdzOlZwY2VBY2NvdW50JywgJ2F3czpWcGNlT3JnSUQnLFxuICAnYXdzOlZwY2VPcmdQYXRocycsICdhd3M6RWMySW5zdGFuY2VTb3VyY2VWcGMnLCAnYXdzOlVzZXJJZCcsICdhd3M6UHJpbmNpcGFsU2VydmljZU5hbWUnLCAnYXdzOlByaW5jaXBhbFNlcnZpY2VOYW1lc0xpc3QnLFxuICAnYXdzOlByaW5jaXBhbElzQVdTU2VydmljZScsICdsYW1iZGE6U291cmNlRnVuY3Rpb25Bcm4nLFxuXS5tYXAoKGspID0+IGsudG9Mb3dlckNhc2UoKSk7XG5cbi8qKiBDb25kaXRpb24ga2V5cyB0aGF0IHRpZSBhIHNlcnZpY2UgcHJpbmNpcGFsIHRvIHRoZSByZXNvdXJjZSBvciBhY2NvdW50IGNhbGxpbmcgb24gaXRzIGJlaGFsZi4gKi9cbmNvbnN0IFNPVVJDRV9LRVlTID0gWydhd3M6U291cmNlQXJuJywgJ2F3czpTb3VyY2VBY2NvdW50JywgJ2F3czpTb3VyY2VPcmdJRCcsICdhd3M6U291cmNlT3JnUGF0aHMnXS5tYXAoKGspID0+IGsudG9Mb3dlckNhc2UoKSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQb2xpY3lGaW5kaW5ncyB7XG4gIC8qKiBTdGF0ZW1lbnRzIExhbWJkYSB3b3VsZCByZWplY3QgYXMgcHVibGljLiAqL1xuICByZWFkb25seSBlcnJvcnM6IHN0cmluZ1tdO1xuICAvKiogU2VydmljZSBwcmluY2lwYWxzIGFsbG93ZWQgd2l0aG91dCBhIHNvdXJjZSBjb25kaXRpb24uICovXG4gIHJlYWRvbmx5IHVuc2NvcGVkU2VydmljZXM6IHN0cmluZ1tdO1xufVxuXG4vKiogSW5zcGVjdHMgYSByZXNvbHZlZCBwb2xpY3kgZG9jdW1lbnQgKGB7IFN0YXRlbWVudDogWy4uLl0gfWApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3BlY3RSZXNvdXJjZVBvbGljeShkb2N1bWVudDogYW55KTogUmVzb3VyY2VQb2xpY3lGaW5kaW5ncyB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdW5zY29wZWRTZXJ2aWNlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbaSwgc10gb2YgKGRvY3VtZW50Py5TdGF0ZW1lbnQgPz8gW10pLmVudHJpZXMoKSkge1xuICAgIGlmIChzLkVmZmVjdCAhPT0gJ0FsbG93JykgY29udGludWU7XG4gICAgY29uc3Qga2V5cyA9IGNvbmRpdGlvbktleXMocy5Db25kaXRpb24pO1xuICAgIGNvbnN0IG5hbWUgPSBzLlNpZCA/IGBzdGF0ZW1lbnQgJyR7cy5TaWR9J2AgOiBgc3RhdGVtZW50ICR7aSArIDF9YDtcbiAgICBpZiAoaXNXaWxkY2FyZChzLlByaW5jaXBhbCkgJiYgIWtleXMuc29tZSgoaykgPT4gVFJVU1RFRF9LRVlTLmluY2x1ZGVzKGspKSkge1xuICAgICAgZXJyb3JzLnB1c2goYCR7bmFtZX0gYWxsb3dzIHByaW5jaXBhbCAnKic6IExhbWJkYSByZWplY3RzIHB1YmxpYyByZXNvdXJjZSBwb2xpY2llcy4gUGluIHRoZSBjYWxsZXIgd2l0aCBhIGNvbmRpdGlvbiBzdWNoIGFzIGF3czpQcmluY2lwYWxPcmdJRCBvciBhd3M6U291cmNlQWNjb3VudCAoZS5nLiBpYW0uT3JnYW5pemF0aW9uUHJpbmNpcGFsKSwgb3IgbmFtZSB0aGUgYWNjb3VudHNgKTtcbiAgICB9XG4gICAgY29uc3Qgc2VydmljZXMgPSBsaXN0KHMuUHJpbmNpcGFsPy5TZXJ2aWNlKS5tYXAoU3RyaW5nKTtcbiAgICBpZiAoc2VydmljZXMubGVuZ3RoID4gMCAmJiAha2V5cy5zb21lKChrKSA9PiBTT1VSQ0VfS0VZUy5pbmNsdWRlcyhrKSkpIHtcbiAgICAgIHVuc2NvcGVkU2VydmljZXMucHVzaCguLi5zZXJ2aWNlcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGVycm9ycywgdW5zY29wZWRTZXJ2aWNlcyB9O1xufVxuXG5mdW5jdGlvbiBpc1dpbGRjYXJkKHByaW5jaXBhbDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBwcmluY2lwYWwgPT09ICcqJyB8fCBsaXN0KHByaW5jaXBhbD8uQVdTKS5pbmNsdWRlcygnKicpO1xufVxuXG5mdW5jdGlvbiBjb25kaXRpb25LZXlzKGNvbmRpdGlvbjogYW55KTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb25kaXRpb24gPz8ge30pLmZsYXRNYXAoKGJ5S2V5OiBhbnkpID0+IE9iamVjdC5rZXlzKGJ5S2V5ID8/IHt9KSkubWFwKChrKSA9PiBrLnRvTG93ZXJDYXNlKCkpO1xufVxuXG5mdW5jdGlvbiBsaXN0KHZhbHVlOiB1bmtub3duKTogdW5rbm93bltdIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBbXSA6IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuIl19
|
|
@@ -11,7 +11,7 @@ const MAX_STEPS = 20;
|
|
|
11
11
|
* How an endpoint moves its traffic to a new revision.
|
|
12
12
|
*/
|
|
13
13
|
class WebFunctionDeployment {
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionDeployment", version: "0.1.
|
|
14
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionDeployment", version: "0.1.5" };
|
|
15
15
|
/**
|
|
16
16
|
* All traffic moves to the new revision at once, as soon as it's ready (the default).
|
|
17
17
|
*/
|