@ashishpandeyone/cdk-lambda-web-function 0.1.1 → 0.1.3
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 +1520 -130
- package/.jsii.tabl.json +1 -1
- package/API.md +1612 -124
- package/README.md +151 -7
- package/assets/web-function-deployment/index.js +58 -0
- package/assets/web-function-provider/index.js +26 -26
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/nodejs-web-function.js +1 -1
- package/lib/private/metrics.d.ts +23 -0
- package/lib/private/metrics.js +49 -0
- package/lib/private/provider-protocol.d.ts +57 -0
- package/lib/private/provider-protocol.js +13 -2
- package/lib/private/provider.d.ts +3 -3
- package/lib/private/provider.js +16 -6
- package/lib/private/regional-alarm.d.ts +23 -0
- package/lib/private/regional-alarm.js +40 -0
- package/lib/private/revision-cleanup.d.ts +19 -0
- package/lib/private/revision-cleanup.js +38 -0
- package/lib/private/rollback.d.ts +9 -0
- package/lib/private/rollback.js +3 -0
- package/lib/private/traffic-shift.d.ts +22 -0
- package/lib/private/traffic-shift.js +144 -0
- package/lib/web-function-deployment.d.ts +153 -0
- package/lib/web-function-deployment.js +125 -0
- package/lib/web-function-endpoint.d.ts +168 -19
- package/lib/web-function-endpoint.js +292 -18
- package/lib/web-function-grants.d.ts +2 -2
- package/lib/web-function-grants.js +4 -4
- package/lib/web-function-revision.d.ts +45 -0
- package/lib/web-function-revision.js +40 -0
- package/lib/web-function.d.ts +69 -9
- package/lib/web-function.js +130 -26
- package/package.json +5 -2
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -19,4 +19,6 @@ __exportStar(require("./web-function"), exports);
|
|
|
19
19
|
__exportStar(require("./web-function-endpoint"), exports);
|
|
20
20
|
__exportStar(require("./web-function-grants"), exports);
|
|
21
21
|
__exportStar(require("./nodejs-web-function"), exports);
|
|
22
|
-
|
|
22
|
+
__exportStar(require("./web-function-revision"), exports);
|
|
23
|
+
__exportStar(require("./web-function-deployment"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBDQUF3QjtBQUN4QixpREFBK0I7QUFDL0IsMERBQXdDO0FBQ3hDLHdEQUFzQztBQUN0Qyx3REFBc0M7QUFDdEMsMERBQXdDO0FBQ3hDLDREQUEwQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi93ZWItZnVuY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi93ZWItZnVuY3Rpb24tZW5kcG9pbnQnO1xuZXhwb3J0ICogZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vbm9kZWpzLXdlYi1mdW5jdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3dlYi1mdW5jdGlvbi1yZXZpc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL3dlYi1mdW5jdGlvbi1kZXBsb3ltZW50JztcbiJdfQ==
|
|
@@ -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.3" };
|
|
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);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Duration } from 'aws-cdk-lib';
|
|
2
|
+
import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
|
|
3
|
+
/** Per-function and per-endpoint metrics, published in the region that served the request. */
|
|
4
|
+
export declare const WEB_NAMESPACE = "AWS/Lambda/Web";
|
|
5
|
+
/** Endpoint usage and throttling, with an `ExecutionRegion` dimension. */
|
|
6
|
+
export declare const USAGE_NAMESPACE = "AWS/Lambda/Web/Usage";
|
|
7
|
+
export declare const REQUESTS = "ExecutedRequests";
|
|
8
|
+
export declare const CLIENT_ERRORS = "HTTPResponseStatusClass4XX";
|
|
9
|
+
export declare const SERVER_ERRORS = "HTTPResponseStatusClass5XX";
|
|
10
|
+
/** How often CloudWatch receives these metrics; shorter periods have gaps. */
|
|
11
|
+
export declare const DEFAULT_PERIOD: Duration;
|
|
12
|
+
/**
|
|
13
|
+
* A rate in percent: `errors` per `requests`. Error metrics only exist once they're non-zero, so missing error
|
|
14
|
+
* data points count as 0; periods with fewer than `minimumRequests` requests count as 0 too.
|
|
15
|
+
*/
|
|
16
|
+
export declare function rateExpression(minimumRequests: number): string;
|
|
17
|
+
export interface EndpointMetricIds {
|
|
18
|
+
readonly functionName: string;
|
|
19
|
+
readonly endpointName: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function endpointDimensions(ids: EndpointMetricIds): cloudwatch.DimensionsMap;
|
|
22
|
+
/** `requests` and `errors` metrics, plus the rate expression, as a PutMetricAlarm `Metrics` list (for alarms in other regions). */
|
|
23
|
+
export declare function rateAlarmQueries(ids: EndpointMetricIds, errorMetric: string, period: Duration, minimumRequests: number): unknown[];
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_PERIOD = exports.SERVER_ERRORS = exports.CLIENT_ERRORS = exports.REQUESTS = exports.USAGE_NAMESPACE = exports.WEB_NAMESPACE = void 0;
|
|
4
|
+
exports.rateExpression = rateExpression;
|
|
5
|
+
exports.endpointDimensions = endpointDimensions;
|
|
6
|
+
exports.rateAlarmQueries = rateAlarmQueries;
|
|
7
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
8
|
+
/** Per-function and per-endpoint metrics, published in the region that served the request. */
|
|
9
|
+
exports.WEB_NAMESPACE = 'AWS/Lambda/Web';
|
|
10
|
+
/** Endpoint usage and throttling, with an `ExecutionRegion` dimension. */
|
|
11
|
+
exports.USAGE_NAMESPACE = 'AWS/Lambda/Web/Usage';
|
|
12
|
+
exports.REQUESTS = 'ExecutedRequests';
|
|
13
|
+
exports.CLIENT_ERRORS = 'HTTPResponseStatusClass4XX';
|
|
14
|
+
exports.SERVER_ERRORS = 'HTTPResponseStatusClass5XX';
|
|
15
|
+
/** How often CloudWatch receives these metrics; shorter periods have gaps. */
|
|
16
|
+
exports.DEFAULT_PERIOD = aws_cdk_lib_1.Duration.minutes(1);
|
|
17
|
+
/**
|
|
18
|
+
* A rate in percent: `errors` per `requests`. Error metrics only exist once they're non-zero, so missing error
|
|
19
|
+
* data points count as 0; periods with fewer than `minimumRequests` requests count as 0 too.
|
|
20
|
+
*/
|
|
21
|
+
function rateExpression(minimumRequests) {
|
|
22
|
+
const rate = '100 * FILL(errors, 0) / requests';
|
|
23
|
+
return minimumRequests > 1 ? `IF(requests >= ${minimumRequests}, ${rate}, 0)` : rate;
|
|
24
|
+
}
|
|
25
|
+
function endpointDimensions(ids) {
|
|
26
|
+
return { FunctionName: ids.functionName, EndpointName: ids.endpointName };
|
|
27
|
+
}
|
|
28
|
+
/** `requests` and `errors` metrics, plus the rate expression, as a PutMetricAlarm `Metrics` list (for alarms in other regions). */
|
|
29
|
+
function rateAlarmQueries(ids, errorMetric, period, minimumRequests) {
|
|
30
|
+
const stat = (id, metricName) => ({
|
|
31
|
+
Id: id,
|
|
32
|
+
MetricStat: {
|
|
33
|
+
Metric: {
|
|
34
|
+
Namespace: exports.WEB_NAMESPACE,
|
|
35
|
+
MetricName: metricName,
|
|
36
|
+
Dimensions: Object.entries(endpointDimensions(ids)).map(([Name, Value]) => ({ Name, Value })),
|
|
37
|
+
},
|
|
38
|
+
Period: period.toSeconds(),
|
|
39
|
+
Stat: 'Sum',
|
|
40
|
+
},
|
|
41
|
+
ReturnData: false,
|
|
42
|
+
});
|
|
43
|
+
return [
|
|
44
|
+
stat('requests', exports.REQUESTS),
|
|
45
|
+
stat('errors', errorMetric),
|
|
46
|
+
{ Id: 'rate', Expression: rateExpression(minimumRequests), Label: `${errorMetric} rate (%)`, ReturnData: true },
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBbUJBLHdDQUdDO0FBT0QsZ0RBRUM7QUFHRCw0Q0FtQkM7QUFyREQsNkNBQXVDO0FBR3ZDLDhGQUE4RjtBQUNqRixRQUFBLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztBQUM5QywwRUFBMEU7QUFDN0QsUUFBQSxlQUFlLEdBQUcsc0JBQXNCLENBQUM7QUFFekMsUUFBQSxRQUFRLEdBQUcsa0JBQWtCLENBQUM7QUFDOUIsUUFBQSxhQUFhLEdBQUcsNEJBQTRCLENBQUM7QUFDN0MsUUFBQSxhQUFhLEdBQUcsNEJBQTRCLENBQUM7QUFFMUQsOEVBQThFO0FBQ2pFLFFBQUEsY0FBYyxHQUFHLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRWxEOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxlQUF1QjtJQUNwRCxNQUFNLElBQUksR0FBRyxrQ0FBa0MsQ0FBQztJQUNoRCxPQUFPLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixlQUFlLEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN2RixDQUFDO0FBT0QsU0FBZ0Isa0JBQWtCLENBQUMsR0FBc0I7SUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDNUUsQ0FBQztBQUVELG1JQUFtSTtBQUNuSSxTQUFnQixnQkFBZ0IsQ0FBQyxHQUFzQixFQUFFLFdBQW1CLEVBQUUsTUFBZ0IsRUFBRSxlQUF1QjtJQUNySCxNQUFNLElBQUksR0FBRyxDQUFDLEVBQVUsRUFBRSxVQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELEVBQUUsRUFBRSxFQUFFO1FBQ04sVUFBVSxFQUFFO1lBQ1YsTUFBTSxFQUFFO2dCQUNOLFNBQVMsRUFBRSxxQkFBYTtnQkFDeEIsVUFBVSxFQUFFLFVBQVU7Z0JBQ3RCLFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUM5RjtZQUNELE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQzFCLElBQUksRUFBRSxLQUFLO1NBQ1o7UUFDRCxVQUFVLEVBQUUsS0FBSztLQUNsQixDQUFDLENBQUM7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFVBQVUsRUFBRSxnQkFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDO1FBQzNCLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLFdBQVcsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7S0FDaEgsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuXG4vKiogUGVyLWZ1bmN0aW9uIGFuZCBwZXItZW5kcG9pbnQgbWV0cmljcywgcHVibGlzaGVkIGluIHRoZSByZWdpb24gdGhhdCBzZXJ2ZWQgdGhlIHJlcXVlc3QuICovXG5leHBvcnQgY29uc3QgV0VCX05BTUVTUEFDRSA9ICdBV1MvTGFtYmRhL1dlYic7XG4vKiogRW5kcG9pbnQgdXNhZ2UgYW5kIHRocm90dGxpbmcsIHdpdGggYW4gYEV4ZWN1dGlvblJlZ2lvbmAgZGltZW5zaW9uLiAqL1xuZXhwb3J0IGNvbnN0IFVTQUdFX05BTUVTUEFDRSA9ICdBV1MvTGFtYmRhL1dlYi9Vc2FnZSc7XG5cbmV4cG9ydCBjb25zdCBSRVFVRVNUUyA9ICdFeGVjdXRlZFJlcXVlc3RzJztcbmV4cG9ydCBjb25zdCBDTElFTlRfRVJST1JTID0gJ0hUVFBSZXNwb25zZVN0YXR1c0NsYXNzNFhYJztcbmV4cG9ydCBjb25zdCBTRVJWRVJfRVJST1JTID0gJ0hUVFBSZXNwb25zZVN0YXR1c0NsYXNzNVhYJztcblxuLyoqIEhvdyBvZnRlbiBDbG91ZFdhdGNoIHJlY2VpdmVzIHRoZXNlIG1ldHJpY3M7IHNob3J0ZXIgcGVyaW9kcyBoYXZlIGdhcHMuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QRVJJT0QgPSBEdXJhdGlvbi5taW51dGVzKDEpO1xuXG4vKipcbiAqIEEgcmF0ZSBpbiBwZXJjZW50OiBgZXJyb3JzYCBwZXIgYHJlcXVlc3RzYC4gRXJyb3IgbWV0cmljcyBvbmx5IGV4aXN0IG9uY2UgdGhleSdyZSBub24temVybywgc28gbWlzc2luZyBlcnJvclxuICogZGF0YSBwb2ludHMgY291bnQgYXMgMDsgcGVyaW9kcyB3aXRoIGZld2VyIHRoYW4gYG1pbmltdW1SZXF1ZXN0c2AgcmVxdWVzdHMgY291bnQgYXMgMCB0b28uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYXRlRXhwcmVzc2lvbihtaW5pbXVtUmVxdWVzdHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHJhdGUgPSAnMTAwICogRklMTChlcnJvcnMsIDApIC8gcmVxdWVzdHMnO1xuICByZXR1cm4gbWluaW11bVJlcXVlc3RzID4gMSA/IGBJRihyZXF1ZXN0cyA+PSAke21pbmltdW1SZXF1ZXN0c30sICR7cmF0ZX0sIDApYCA6IHJhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5kcG9pbnRNZXRyaWNJZHMge1xuICByZWFkb25seSBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZW5kcG9pbnROYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmRwb2ludERpbWVuc2lvbnMoaWRzOiBFbmRwb2ludE1ldHJpY0lkcyk6IGNsb3Vkd2F0Y2guRGltZW5zaW9uc01hcCB7XG4gIHJldHVybiB7IEZ1bmN0aW9uTmFtZTogaWRzLmZ1bmN0aW9uTmFtZSwgRW5kcG9pbnROYW1lOiBpZHMuZW5kcG9pbnROYW1lIH07XG59XG5cbi8qKiBgcmVxdWVzdHNgIGFuZCBgZXJyb3JzYCBtZXRyaWNzLCBwbHVzIHRoZSByYXRlIGV4cHJlc3Npb24sIGFzIGEgUHV0TWV0cmljQWxhcm0gYE1ldHJpY3NgIGxpc3QgKGZvciBhbGFybXMgaW4gb3RoZXIgcmVnaW9ucykuICovXG5leHBvcnQgZnVuY3Rpb24gcmF0ZUFsYXJtUXVlcmllcyhpZHM6IEVuZHBvaW50TWV0cmljSWRzLCBlcnJvck1ldHJpYzogc3RyaW5nLCBwZXJpb2Q6IER1cmF0aW9uLCBtaW5pbXVtUmVxdWVzdHM6IG51bWJlcik6IHVua25vd25bXSB7XG4gIGNvbnN0IHN0YXQgPSAoaWQ6IHN0cmluZywgbWV0cmljTmFtZTogc3RyaW5nKSA9PiAoe1xuICAgIElkOiBpZCxcbiAgICBNZXRyaWNTdGF0OiB7XG4gICAgICBNZXRyaWM6IHtcbiAgICAgICAgTmFtZXNwYWNlOiBXRUJfTkFNRVNQQUNFLFxuICAgICAgICBNZXRyaWNOYW1lOiBtZXRyaWNOYW1lLFxuICAgICAgICBEaW1lbnNpb25zOiBPYmplY3QuZW50cmllcyhlbmRwb2ludERpbWVuc2lvbnMoaWRzKSkubWFwKChbTmFtZSwgVmFsdWVdKSA9PiAoeyBOYW1lLCBWYWx1ZSB9KSksXG4gICAgICB9LFxuICAgICAgUGVyaW9kOiBwZXJpb2QudG9TZWNvbmRzKCksXG4gICAgICBTdGF0OiAnU3VtJyxcbiAgICB9LFxuICAgIFJldHVybkRhdGE6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIFtcbiAgICBzdGF0KCdyZXF1ZXN0cycsIFJFUVVFU1RTKSxcbiAgICBzdGF0KCdlcnJvcnMnLCBlcnJvck1ldHJpYyksXG4gICAgeyBJZDogJ3JhdGUnLCBFeHByZXNzaW9uOiByYXRlRXhwcmVzc2lvbihtaW5pbXVtUmVxdWVzdHMpLCBMYWJlbDogYCR7ZXJyb3JNZXRyaWN9IHJhdGUgKCUpYCwgUmV0dXJuRGF0YTogdHJ1ZSB9LFxuICBdO1xufVxuIl19
|
|
@@ -40,3 +40,60 @@ export interface EndpointLookupProperties {
|
|
|
40
40
|
}
|
|
41
41
|
/** Attribute name holding the domain of one region, e.g. `Domain.us-east-1`. */
|
|
42
42
|
export declare function regionalDomainAttribute(region: string): string;
|
|
43
|
+
/** Deletes a function's oldest revisions beyond a count, except those that are in use or may be rolled back to. */
|
|
44
|
+
export declare const REVISION_CLEANUP_RESOURCE_TYPE = "Custom::LambdaWebRevisionCleanup";
|
|
45
|
+
export interface RevisionCleanupProperties {
|
|
46
|
+
readonly FunctionArn: string;
|
|
47
|
+
/** How many of the newest revisions to keep. */
|
|
48
|
+
readonly Keep: string;
|
|
49
|
+
/**
|
|
50
|
+
* Revisions the template uses (the current one and any an endpoint routes to). Always kept, and on an update
|
|
51
|
+
* the previous template's are kept too: they're what a rollback routes back to.
|
|
52
|
+
*/
|
|
53
|
+
readonly RevisionIds: string[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Moves an endpoint's traffic to a revision in steps, watching alarms (canary and linear deployments).
|
|
57
|
+
* Served by the deployment provider (`handlers/web-function-deployment`), not the shared provider: it can run for up to an hour.
|
|
58
|
+
*/
|
|
59
|
+
export declare const TRAFFIC_SHIFT_RESOURCE_TYPE = "Custom::LambdaWebTrafficShift";
|
|
60
|
+
export interface TrafficShiftProperties {
|
|
61
|
+
readonly FunctionArn: string;
|
|
62
|
+
readonly EndpointName: string;
|
|
63
|
+
/** The revision that ends up with all of the endpoint's traffic. */
|
|
64
|
+
readonly RevisionId: string;
|
|
65
|
+
/** The revision's share of traffic at each step, in percent, comma-separated; the last is 100. */
|
|
66
|
+
readonly Steps: string;
|
|
67
|
+
/** Seconds each step serves (counted from when its update started) before the next. */
|
|
68
|
+
readonly WaitSeconds: string;
|
|
69
|
+
/** Alarms (in any region) that stop the deployment and restore the previous weights. */
|
|
70
|
+
readonly AlarmArns?: string[];
|
|
71
|
+
/** Hash of the endpoint's other settings: any endpoint change re-checks its traffic before CloudFormation writes it. */
|
|
72
|
+
readonly EndpointConfig: string;
|
|
73
|
+
}
|
|
74
|
+
/** What `onEvent` hands to `isComplete` (the Provider framework passes it as `Data`). */
|
|
75
|
+
export interface TrafficShiftState {
|
|
76
|
+
/** `none`: nothing to do; `shift`: moving in steps; `switch`: all at once, without alarms (stack rollback). */
|
|
77
|
+
readonly Action: 'none' | 'shift' | 'switch';
|
|
78
|
+
/** `shift`: the endpoint's weights before the deployment (JSON `[{revisionId, weight}]`), restored when an alarm fires. */
|
|
79
|
+
readonly PreviousWeights?: string;
|
|
80
|
+
/** `switch`: the weights being written (JSON `[{revisionId, weight}]`). */
|
|
81
|
+
readonly TargetWeights?: string;
|
|
82
|
+
}
|
|
83
|
+
/** Creates a CloudWatch metric alarm in any region (CloudFormation only creates alarms in the stack's region). */
|
|
84
|
+
/** Prefix of every alarm this library creates outside the stack's region; the provider's IAM is scoped to it. */
|
|
85
|
+
export declare const ALARM_NAME_PREFIX = "LambdaWeb-";
|
|
86
|
+
export declare const REGIONAL_ALARM_RESOURCE_TYPE = "Custom::LambdaWebAlarm";
|
|
87
|
+
export interface RegionalAlarmProperties {
|
|
88
|
+
readonly Region: string;
|
|
89
|
+
readonly AlarmName: string;
|
|
90
|
+
readonly AlarmDescription: string;
|
|
91
|
+
/** PutMetricAlarm's `Metrics`, as JSON. */
|
|
92
|
+
readonly Metrics: string;
|
|
93
|
+
readonly Threshold: string;
|
|
94
|
+
readonly EvaluationPeriods: string;
|
|
95
|
+
/** PutMetricAlarm's `ComparisonOperator`. */
|
|
96
|
+
readonly ComparisonOperator: string;
|
|
97
|
+
/** PutMetricAlarm's `TreatMissingData`. */
|
|
98
|
+
readonly TreatMissingData: string;
|
|
99
|
+
}
|
|
@@ -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.ENDPOINT_LOOKUP_RESOURCE_TYPE = exports.LOG_GROUP_RESOURCE_TYPE = exports.CODE_RESOURCE_TYPE = void 0;
|
|
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;
|
|
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';
|
|
@@ -19,4 +19,15 @@ exports.ENDPOINT_LOOKUP_RESOURCE_TYPE = 'Custom::LambdaWebEndpointLookup';
|
|
|
19
19
|
function regionalDomainAttribute(region) {
|
|
20
20
|
return `Domain.${region}`;
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
/** Deletes a function's oldest revisions beyond a count, except those that are in use or may be rolled back to. */
|
|
23
|
+
exports.REVISION_CLEANUP_RESOURCE_TYPE = 'Custom::LambdaWebRevisionCleanup';
|
|
24
|
+
/**
|
|
25
|
+
* Moves an endpoint's traffic to a revision in steps, watching alarms (canary and linear deployments).
|
|
26
|
+
* Served by the deployment provider (`handlers/web-function-deployment`), not the shared provider: it can run for up to an hour.
|
|
27
|
+
*/
|
|
28
|
+
exports.TRAFFIC_SHIFT_RESOURCE_TYPE = 'Custom::LambdaWebTrafficShift';
|
|
29
|
+
/** Creates a CloudWatch metric alarm in any region (CloudFormation only creates alarms in the stack's region). */
|
|
30
|
+
/** Prefix of every alarm this library creates outside the stack's region; the provider's IAM is scoped to it. */
|
|
31
|
+
exports.ALARM_NAME_PREFIX = 'LambdaWeb-';
|
|
32
|
+
exports.REGIONAL_ALARM_RESOURCE_TYPE = 'Custom::LambdaWebAlarm';
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItcHJvdG9jb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpdmF0ZS9wcm92aWRlci1wcm90b2NvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7QUEyQ0gsMERBRUM7QUEzQ0QsdUZBQXVGO0FBQzFFLFFBQUEsa0JBQWtCLEdBQUcsdUJBQXVCLENBQUM7QUFjMUQsdUdBQXVHO0FBQzFGLFFBQUEsdUJBQXVCLEdBQUcsMkJBQTJCLENBQUM7QUFjbkUsZ0hBQWdIO0FBQ25HLFFBQUEsNkJBQTZCLEdBQUcsaUNBQWlDLENBQUM7QUFTL0UsZ0ZBQWdGO0FBQ2hGLFNBQWdCLHVCQUF1QixDQUFDLE1BQWM7SUFDcEQsT0FBTyxVQUFVLE1BQU0sRUFBRSxDQUFDO0FBQzVCLENBQUM7QUFFRCxtSEFBbUg7QUFDdEcsUUFBQSw4QkFBOEIsR0FBRyxrQ0FBa0MsQ0FBQztBQWFqRjs7O0dBR0c7QUFDVSxRQUFBLDJCQUEyQixHQUFHLCtCQUErQixDQUFDO0FBMkIzRSxrSEFBa0g7QUFDbEgsaUhBQWlIO0FBQ3BHLFFBQUEsaUJBQWlCLEdBQUcsWUFBWSxDQUFDO0FBQ2pDLFFBQUEsNEJBQTRCLEdBQUcsd0JBQXdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnRyYWN0IGJldHdlZW4gdGhlIGNvbnN0cnVjdHMgYW5kIHRoZSBjdXN0b20gcmVzb3VyY2UgaGFuZGxlciBpblxuICogYGhhbmRsZXJzL3dlYi1mdW5jdGlvbi1wcm92aWRlcmAuIEJvdGggc2lkZXMgaW1wb3J0IHRoaXMgZmlsZSwgc28gcmVzb3VyY2VcbiAqIHR5cGVzIGFuZCBwcm9wZXJ0eSBuYW1lcyBjYW4ndCBkcmlmdCBhcGFydC5cbiAqXG4gKiBDbG91ZEZvcm1hdGlvbiBwYXNzZXMgZXZlcnkgc2NhbGFyIHByb3BlcnR5IHRvIHRoZSBoYW5kbGVyIGFzIGEgc3RyaW5nLlxuICovXG5cbi8qKiBDb3BpZXMgYSBjb2RlIHppcCBpbnRvIHRoZSBzdGFjaydzIGNvZGUgYnVja2V0IGFuZCByZXR1cm5zIHRoZSBvYmplY3QncyB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IENPREVfUkVTT1VSQ0VfVFlQRSA9ICdDdXN0b206OkxhbWJkYVdlYkNvZGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVQcm9wZXJ0aWVzIHtcbiAgcmVhZG9ubHkgU291cmNlQnVja2V0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IFNvdXJjZUtleTogc3RyaW5nO1xuICByZWFkb25seSBTb3VyY2VWZXJzaW9uPzogc3RyaW5nO1xuICByZWFkb25seSBEZXN0aW5hdGlvbkJ1Y2tldDogc3RyaW5nO1xuICByZWFkb25seSBEZXN0aW5hdGlvbktleTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVBdHRyaWJ1dGVzIHtcbiAgcmVhZG9ubHkgVmVyc2lvbklkOiBzdHJpbmc7XG59XG5cbi8qKiBFbnN1cmVzIG9uZSBsb2cgZ3JvdXAgKGluIGFueSByZWdpb24pIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiByZXRlbnRpb24sIGFuZCByZW1vdmVzIGl0IG9uIGRlbGV0ZS4gKi9cbmV4cG9ydCBjb25zdCBMT0dfR1JPVVBfUkVTT1VSQ0VfVFlQRSA9ICdDdXN0b206OkxhbWJkYVdlYkxvZ0dyb3VwJztcblxuZXhwb3J0IGludGVyZmFjZSBMb2dHcm91cFByb3BlcnRpZXMge1xuICByZWFkb25seSBSZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgTG9nR3JvdXBOYW1lOiBzdHJpbmc7XG4gIC8qKiBEYXlzLCBvciAnSW5maW5pdGUnIGZvciBubyByZXRlbnRpb24uICovXG4gIHJlYWRvbmx5IFJldGVudGlvbkluRGF5czogc3RyaW5nO1xuICByZWFkb25seSBSZW1vdmFsUG9saWN5OiAncmV0YWluJyB8ICdkZXN0cm95JztcbiAgLyoqIFNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZGVsZXRpbmcsIHNvIGVudmlyb25tZW50cyBzdGlsbCBzaHV0dGluZyBkb3duIGNhbiBmbHVzaCB0aGVpciBsYXN0IGxpbmVzLiAqL1xuICByZWFkb25seSBGbHVzaFdhaXRTZWNvbmRzOiBzdHJpbmc7XG4gIC8qKiBTZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGNoZWNraW5nIG9uY2UgbW9yZSB0aGF0IHRoZSBzZXJ2aWNlIGhhc24ndCByZS1jcmVhdGVkIHRoZSBncm91cC4gKi9cbiAgcmVhZG9ubHkgUmVjaGVja1dhaXRTZWNvbmRzOiBzdHJpbmc7XG59XG5cbi8qKiBSZWFkcyBhbiBlbmRwb2ludCdzIHBlci1yZWdpb24gZG9tYWluIG5hbWVzLCB3aGljaCBDbG91ZEZvcm1hdGlvbiBjYW4ndCBpbmRleCBvdXQgb2YgYFJlZ2lvbmFsRW5kcG9pbnRzYC4gKi9cbmV4cG9ydCBjb25zdCBFTkRQT0lOVF9MT09LVVBfUkVTT1VSQ0VfVFlQRSA9ICdDdXN0b206OkxhbWJkYVdlYkVuZHBvaW50TG9va3VwJztcblxuZXhwb3J0IGludGVyZmFjZSBFbmRwb2ludExvb2t1cFByb3BlcnRpZXMge1xuICByZWFkb25seSBGdW5jdGlvbkFybjogc3RyaW5nO1xuICByZWFkb25seSBFbmRwb2ludE5hbWU6IHN0cmluZztcbiAgLyoqIENoYW5nZXMgd2hlbmV2ZXIgdGhlIGVuZHBvaW50IGlzIHJlcGxhY2VkLCBzbyB0aGUgbG9va3VwIHJ1bnMgYWdhaW4uICovXG4gIHJlYWRvbmx5IEVuZHBvaW50QXJuOiBzdHJpbmc7XG59XG5cbi8qKiBBdHRyaWJ1dGUgbmFtZSBob2xkaW5nIHRoZSBkb21haW4gb2Ygb25lIHJlZ2lvbiwgZS5nLiBgRG9tYWluLnVzLWVhc3QtMWAuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uYWxEb21haW5BdHRyaWJ1dGUocmVnaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYERvbWFpbi4ke3JlZ2lvbn1gO1xufVxuXG4vKiogRGVsZXRlcyBhIGZ1bmN0aW9uJ3Mgb2xkZXN0IHJldmlzaW9ucyBiZXlvbmQgYSBjb3VudCwgZXhjZXB0IHRob3NlIHRoYXQgYXJlIGluIHVzZSBvciBtYXkgYmUgcm9sbGVkIGJhY2sgdG8uICovXG5leHBvcnQgY29uc3QgUkVWSVNJT05fQ0xFQU5VUF9SRVNPVVJDRV9UWVBFID0gJ0N1c3RvbTo6TGFtYmRhV2ViUmV2aXNpb25DbGVhbnVwJztcblxuZXhwb3J0IGludGVyZmFjZSBSZXZpc2lvbkNsZWFudXBQcm9wZXJ0aWVzIHtcbiAgcmVhZG9ubHkgRnVuY3Rpb25Bcm46IHN0cmluZztcbiAgLyoqIEhvdyBtYW55IG9mIHRoZSBuZXdlc3QgcmV2aXNpb25zIHRvIGtlZXAuICovXG4gIHJlYWRvbmx5IEtlZXA6IHN0cmluZztcbiAgLyoqXG4gICAqIFJldmlzaW9ucyB0aGUgdGVtcGxhdGUgdXNlcyAodGhlIGN1cnJlbnQgb25lIGFuZCBhbnkgYW4gZW5kcG9pbnQgcm91dGVzIHRvKS4gQWx3YXlzIGtlcHQsIGFuZCBvbiBhbiB1cGRhdGVcbiAgICogdGhlIHByZXZpb3VzIHRlbXBsYXRlJ3MgYXJlIGtlcHQgdG9vOiB0aGV5J3JlIHdoYXQgYSByb2xsYmFjayByb3V0ZXMgYmFjayB0by5cbiAgICovXG4gIHJlYWRvbmx5IFJldmlzaW9uSWRzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBNb3ZlcyBhbiBlbmRwb2ludCdzIHRyYWZmaWMgdG8gYSByZXZpc2lvbiBpbiBzdGVwcywgd2F0Y2hpbmcgYWxhcm1zIChjYW5hcnkgYW5kIGxpbmVhciBkZXBsb3ltZW50cykuXG4gKiBTZXJ2ZWQgYnkgdGhlIGRlcGxveW1lbnQgcHJvdmlkZXIgKGBoYW5kbGVycy93ZWItZnVuY3Rpb24tZGVwbG95bWVudGApLCBub3QgdGhlIHNoYXJlZCBwcm92aWRlcjogaXQgY2FuIHJ1biBmb3IgdXAgdG8gYW4gaG91ci5cbiAqL1xuZXhwb3J0IGNvbnN0IFRSQUZGSUNfU0hJRlRfUkVTT1VSQ0VfVFlQRSA9ICdDdXN0b206OkxhbWJkYVdlYlRyYWZmaWNTaGlmdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhZmZpY1NoaWZ0UHJvcGVydGllcyB7XG4gIHJlYWRvbmx5IEZ1bmN0aW9uQXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IEVuZHBvaW50TmFtZTogc3RyaW5nO1xuICAvKiogVGhlIHJldmlzaW9uIHRoYXQgZW5kcyB1cCB3aXRoIGFsbCBvZiB0aGUgZW5kcG9pbnQncyB0cmFmZmljLiAqL1xuICByZWFkb25seSBSZXZpc2lvbklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmV2aXNpb24ncyBzaGFyZSBvZiB0cmFmZmljIGF0IGVhY2ggc3RlcCwgaW4gcGVyY2VudCwgY29tbWEtc2VwYXJhdGVkOyB0aGUgbGFzdCBpcyAxMDAuICovXG4gIHJlYWRvbmx5IFN0ZXBzOiBzdHJpbmc7XG4gIC8qKiBTZWNvbmRzIGVhY2ggc3RlcCBzZXJ2ZXMgKGNvdW50ZWQgZnJvbSB3aGVuIGl0cyB1cGRhdGUgc3RhcnRlZCkgYmVmb3JlIHRoZSBuZXh0LiAqL1xuICByZWFkb25seSBXYWl0U2Vjb25kczogc3RyaW5nO1xuICAvKiogQWxhcm1zIChpbiBhbnkgcmVnaW9uKSB0aGF0IHN0b3AgdGhlIGRlcGxveW1lbnQgYW5kIHJlc3RvcmUgdGhlIHByZXZpb3VzIHdlaWdodHMuICovXG4gIHJlYWRvbmx5IEFsYXJtQXJucz86IHN0cmluZ1tdO1xuICAvKiogSGFzaCBvZiB0aGUgZW5kcG9pbnQncyBvdGhlciBzZXR0aW5nczogYW55IGVuZHBvaW50IGNoYW5nZSByZS1jaGVja3MgaXRzIHRyYWZmaWMgYmVmb3JlIENsb3VkRm9ybWF0aW9uIHdyaXRlcyBpdC4gKi9cbiAgcmVhZG9ubHkgRW5kcG9pbnRDb25maWc6IHN0cmluZztcbn1cblxuLyoqIFdoYXQgYG9uRXZlbnRgIGhhbmRzIHRvIGBpc0NvbXBsZXRlYCAodGhlIFByb3ZpZGVyIGZyYW1ld29yayBwYXNzZXMgaXQgYXMgYERhdGFgKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhZmZpY1NoaWZ0U3RhdGUge1xuICAvKiogYG5vbmVgOiBub3RoaW5nIHRvIGRvOyBgc2hpZnRgOiBtb3ZpbmcgaW4gc3RlcHM7IGBzd2l0Y2hgOiBhbGwgYXQgb25jZSwgd2l0aG91dCBhbGFybXMgKHN0YWNrIHJvbGxiYWNrKS4gKi9cbiAgcmVhZG9ubHkgQWN0aW9uOiAnbm9uZScgfCAnc2hpZnQnIHwgJ3N3aXRjaCc7XG4gIC8qKiBgc2hpZnRgOiB0aGUgZW5kcG9pbnQncyB3ZWlnaHRzIGJlZm9yZSB0aGUgZGVwbG95bWVudCAoSlNPTiBgW3tyZXZpc2lvbklkLCB3ZWlnaHR9XWApLCByZXN0b3JlZCB3aGVuIGFuIGFsYXJtIGZpcmVzLiAqL1xuICByZWFkb25seSBQcmV2aW91c1dlaWdodHM/OiBzdHJpbmc7XG4gIC8qKiBgc3dpdGNoYDogdGhlIHdlaWdodHMgYmVpbmcgd3JpdHRlbiAoSlNPTiBgW3tyZXZpc2lvbklkLCB3ZWlnaHR9XWApLiAqL1xuICByZWFkb25seSBUYXJnZXRXZWlnaHRzPzogc3RyaW5nO1xufVxuXG4vKiogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggbWV0cmljIGFsYXJtIGluIGFueSByZWdpb24gKENsb3VkRm9ybWF0aW9uIG9ubHkgY3JlYXRlcyBhbGFybXMgaW4gdGhlIHN0YWNrJ3MgcmVnaW9uKS4gKi9cbi8qKiBQcmVmaXggb2YgZXZlcnkgYWxhcm0gdGhpcyBsaWJyYXJ5IGNyZWF0ZXMgb3V0c2lkZSB0aGUgc3RhY2sncyByZWdpb247IHRoZSBwcm92aWRlcidzIElBTSBpcyBzY29wZWQgdG8gaXQuICovXG5leHBvcnQgY29uc3QgQUxBUk1fTkFNRV9QUkVGSVggPSAnTGFtYmRhV2ViLSc7XG5leHBvcnQgY29uc3QgUkVHSU9OQUxfQUxBUk1fUkVTT1VSQ0VfVFlQRSA9ICdDdXN0b206OkxhbWJkYVdlYkFsYXJtJztcblxuZXhwb3J0IGludGVyZmFjZSBSZWdpb25hbEFsYXJtUHJvcGVydGllcyB7XG4gIHJlYWRvbmx5IFJlZ2lvbjogc3RyaW5nO1xuICByZWFkb25seSBBbGFybU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgQWxhcm1EZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKiogUHV0TWV0cmljQWxhcm0ncyBgTWV0cmljc2AsIGFzIEpTT04uICovXG4gIHJlYWRvbmx5IE1ldHJpY3M6IHN0cmluZztcbiAgcmVhZG9ubHkgVGhyZXNob2xkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IEV2YWx1YXRpb25QZXJpb2RzOiBzdHJpbmc7XG4gIC8qKiBQdXRNZXRyaWNBbGFybSdzIGBDb21wYXJpc29uT3BlcmF0b3JgLiAqL1xuICByZWFkb25seSBDb21wYXJpc29uT3BlcmF0b3I6IHN0cmluZztcbiAgLyoqIFB1dE1ldHJpY0FsYXJtJ3MgYFRyZWF0TWlzc2luZ0RhdGFgLiAqL1xuICByZWFkb25seSBUcmVhdE1pc3NpbmdEYXRhOiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { CustomResourceProvider } from 'aws-cdk-lib';
|
|
2
2
|
import type { Construct } from 'constructs';
|
|
3
3
|
/**
|
|
4
|
-
* The single custom resource provider (one Lambda per stack) behind code copies, log groups
|
|
5
|
-
* and
|
|
6
|
-
* tools that discover functions by class (e.g. cdk-watchful) don't pick it up.
|
|
4
|
+
* The single custom resource provider (one Lambda per stack) behind code copies, log groups,
|
|
5
|
+
* endpoint lookups, revision cleanup and alarms in other regions. It's a core `CustomResourceProvider`,
|
|
6
|
+
* not a `lambda.Function`, so tools that discover functions by class (e.g. cdk-watchful) don't pick it up.
|
|
7
7
|
*/
|
|
8
8
|
export declare function webFunctionProvider(scope: Construct): CustomResourceProvider;
|
|
9
9
|
/**
|
package/lib/private/provider.js
CHANGED
|
@@ -37,20 +37,30 @@ 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 provider_protocol_1 = require("./provider-protocol");
|
|
40
41
|
/**
|
|
41
|
-
* The single custom resource provider (one Lambda per stack) behind code copies, log groups
|
|
42
|
-
* and
|
|
43
|
-
* tools that discover functions by class (e.g. cdk-watchful) don't pick it up.
|
|
42
|
+
* The single custom resource provider (one Lambda per stack) behind code copies, log groups,
|
|
43
|
+
* endpoint lookups, revision cleanup and alarms in other regions. It's a core `CustomResourceProvider`,
|
|
44
|
+
* not a `lambda.Function`, so tools that discover functions by class (e.g. cdk-watchful) don't pick it up.
|
|
44
45
|
*/
|
|
45
46
|
function webFunctionProvider(scope) {
|
|
46
|
-
|
|
47
|
+
const provider = aws_cdk_lib_1.CustomResourceProvider.getOrCreateProvider(scope, 'Custom::LambdaWebFunctionProvider', {
|
|
47
48
|
codeDirectory: path.join(__dirname, '..', '..', 'assets', 'web-function-provider'),
|
|
48
49
|
runtime: aws_cdk_lib_1.CustomResourceProviderRuntime.NODEJS_24_X,
|
|
49
50
|
// Log group deletion waits for late flushes (75s + a re-check) on top of the API calls.
|
|
50
51
|
timeout: aws_cdk_lib_1.Duration.minutes(5),
|
|
51
52
|
memorySize: aws_cdk_lib_1.Size.mebibytes(256),
|
|
52
|
-
description: 'Copies code, manages log groups
|
|
53
|
+
description: 'Copies code, manages log groups, looks up endpoints and cleans up revisions for Lambda Web Functions',
|
|
53
54
|
});
|
|
55
|
+
// Granted whether or not a stack has alarms in other regions yet: a grant added or removed together with the
|
|
56
|
+
// alarm fails on IAM propagation, or leaves the alarm behind when it's removed (see grantToProvider).
|
|
57
|
+
grantToProvider(provider, {
|
|
58
|
+
Action: ['cloudwatch:PutMetricAlarm', 'cloudwatch:DeleteAlarms'],
|
|
59
|
+
Resource: aws_cdk_lib_1.Stack.of(provider).formatArn({
|
|
60
|
+
service: 'cloudwatch', region: '*', resource: 'alarm', resourceName: `${provider_protocol_1.ALARM_NAME_PREFIX}*`, arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME,
|
|
61
|
+
}),
|
|
62
|
+
});
|
|
63
|
+
return provider;
|
|
54
64
|
}
|
|
55
65
|
const granted = new WeakMap();
|
|
56
66
|
/**
|
|
@@ -74,4 +84,4 @@ function grantToProvider(provider, statement) {
|
|
|
74
84
|
seen.add(key);
|
|
75
85
|
provider.addToRolePolicy({ Effect: 'Allow', ...statement });
|
|
76
86
|
}
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpdmF0ZS9wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLGtEQWtCQztBQWFELDBDQVVDO0FBbkRELGdEQUFrQztBQUNsQyw2Q0FBc0g7QUFFdEgsMkRBQXdEO0FBRXhEOzs7O0dBSUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxLQUFnQjtJQUNsRCxNQUFNLFFBQVEsR0FBRyxvQ0FBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsbUNBQW1DLEVBQUU7UUFDdEcsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLHVCQUF1QixDQUFDO1FBQ2xGLE9BQU8sRUFBRSwyQ0FBNkIsQ0FBQyxXQUFXO1FBQ2xELHdGQUF3RjtRQUN4RixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVCLFVBQVUsRUFBRSxrQkFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDL0IsV0FBVyxFQUFFLHNHQUFzRztLQUNwSCxDQUFDLENBQUM7SUFDSCw2R0FBNkc7SUFDN0csc0dBQXNHO0lBQ3RHLGVBQWUsQ0FBQyxRQUFRLEVBQUU7UUFDeEIsTUFBTSxFQUFFLENBQUMsMkJBQTJCLEVBQUUseUJBQXlCLENBQUM7UUFDaEUsUUFBUSxFQUFFLG1CQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxxQ0FBaUIsR0FBRyxFQUFFLFNBQVMsRUFBRSx1QkFBUyxDQUFDLG1CQUFtQjtTQUN2SSxDQUFDO0tBQ0gsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUF1QyxDQUFDO0FBRW5FOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFFBQWdDLEVBQUUsU0FBcUU7SUFDckksTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNsRSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTztJQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBBcm5Gb3JtYXQsIEN1c3RvbVJlc291cmNlUHJvdmlkZXIsIEN1c3RvbVJlc291cmNlUHJvdmlkZXJSdW50aW1lLCBEdXJhdGlvbiwgU2l6ZSwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQUxBUk1fTkFNRV9QUkVGSVggfSBmcm9tICcuL3Byb3ZpZGVyLXByb3RvY29sJztcblxuLyoqXG4gKiBUaGUgc2luZ2xlIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlciAob25lIExhbWJkYSBwZXIgc3RhY2spIGJlaGluZCBjb2RlIGNvcGllcywgbG9nIGdyb3VwcyxcbiAqIGVuZHBvaW50IGxvb2t1cHMsIHJldmlzaW9uIGNsZWFudXAgYW5kIGFsYXJtcyBpbiBvdGhlciByZWdpb25zLiBJdCdzIGEgY29yZSBgQ3VzdG9tUmVzb3VyY2VQcm92aWRlcmAsXG4gKiBub3QgYSBgbGFtYmRhLkZ1bmN0aW9uYCwgc28gdG9vbHMgdGhhdCBkaXNjb3ZlciBmdW5jdGlvbnMgYnkgY2xhc3MgKGUuZy4gY2RrLXdhdGNoZnVsKSBkb24ndCBwaWNrIGl0IHVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2ViRnVuY3Rpb25Qcm92aWRlcihzY29wZTogQ29uc3RydWN0KTogQ3VzdG9tUmVzb3VyY2VQcm92aWRlciB7XG4gIGNvbnN0IHByb3ZpZGVyID0gQ3VzdG9tUmVzb3VyY2VQcm92aWRlci5nZXRPckNyZWF0ZVByb3ZpZGVyKHNjb3BlLCAnQ3VzdG9tOjpMYW1iZGFXZWJGdW5jdGlvblByb3ZpZGVyJywge1xuICAgIGNvZGVEaXJlY3Rvcnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICdhc3NldHMnLCAnd2ViLWZ1bmN0aW9uLXByb3ZpZGVyJyksXG4gICAgcnVudGltZTogQ3VzdG9tUmVzb3VyY2VQcm92aWRlclJ1bnRpbWUuTk9ERUpTXzI0X1gsXG4gICAgLy8gTG9nIGdyb3VwIGRlbGV0aW9uIHdhaXRzIGZvciBsYXRlIGZsdXNoZXMgKDc1cyArIGEgcmUtY2hlY2spIG9uIHRvcCBvZiB0aGUgQVBJIGNhbGxzLlxuICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgbWVtb3J5U2l6ZTogU2l6ZS5tZWJpYnl0ZXMoMjU2KSxcbiAgICBkZXNjcmlwdGlvbjogJ0NvcGllcyBjb2RlLCBtYW5hZ2VzIGxvZyBncm91cHMsIGxvb2tzIHVwIGVuZHBvaW50cyBhbmQgY2xlYW5zIHVwIHJldmlzaW9ucyBmb3IgTGFtYmRhIFdlYiBGdW5jdGlvbnMnLFxuICB9KTtcbiAgLy8gR3JhbnRlZCB3aGV0aGVyIG9yIG5vdCBhIHN0YWNrIGhhcyBhbGFybXMgaW4gb3RoZXIgcmVnaW9ucyB5ZXQ6IGEgZ3JhbnQgYWRkZWQgb3IgcmVtb3ZlZCB0b2dldGhlciB3aXRoIHRoZVxuICAvLyBhbGFybSBmYWlscyBvbiBJQU0gcHJvcGFnYXRpb24sIG9yIGxlYXZlcyB0aGUgYWxhcm0gYmVoaW5kIHdoZW4gaXQncyByZW1vdmVkIChzZWUgZ3JhbnRUb1Byb3ZpZGVyKS5cbiAgZ3JhbnRUb1Byb3ZpZGVyKHByb3ZpZGVyLCB7XG4gICAgQWN0aW9uOiBbJ2Nsb3Vkd2F0Y2g6UHV0TWV0cmljQWxhcm0nLCAnY2xvdWR3YXRjaDpEZWxldGVBbGFybXMnXSxcbiAgICBSZXNvdXJjZTogU3RhY2sub2YocHJvdmlkZXIpLmZvcm1hdEFybih7XG4gICAgICBzZXJ2aWNlOiAnY2xvdWR3YXRjaCcsIHJlZ2lvbjogJyonLCByZXNvdXJjZTogJ2FsYXJtJywgcmVzb3VyY2VOYW1lOiBgJHtBTEFSTV9OQU1FX1BSRUZJWH0qYCwgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICB9KSxcbiAgfSk7XG4gIHJldHVybiBwcm92aWRlcjtcbn1cblxuY29uc3QgZ3JhbnRlZCA9IG5ldyBXZWFrTWFwPEN1c3RvbVJlc291cmNlUHJvdmlkZXIsIFNldDxzdHJpbmc+PigpO1xuXG4vKipcbiAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIHNoYXJlZCBwcm92aWRlcidzIHJvbGUsIG9uY2UuXG4gKlxuICogR3JhbnRzIG11c3QgYmUgKipzdGFibGUgYWNyb3NzIHVwZGF0ZXMqKjogc2NvcGVkIGJ5IHByZWZpeGVzIHRoYXQgZG9uJ3QgY2hhbmdlIHdoZW4gYVxuICogcmVzb3VyY2UgaXMgcmVuYW1lZCBvciByZXBsYWNlZC4gQ2xvdWRGb3JtYXRpb24gdXBkYXRlcyB0aGUgcm9sZSBqdXN0IGJlZm9yZSAoYW5kIG9uIHJvbGxiYWNrLFxuICogcmV2ZXJ0cyBpdCBqdXN0IGJlZm9yZSkgdGhlIGN1c3RvbSByZXNvdXJjZXMgcnVuLCBhbmQgSUFNIHRha2VzIHNlY29uZHMgdG8gbWludXRlcyB0b1xuICogcHJvcGFnYXRlLCBzbyBwZXItbmFtZSBncmFudHMgZmFpbCB3aXRoIEFjY2Vzc0RlbmllZCBvbiByZW5hbWVzIGFuZCBvbiByb2xsYmFjayBjbGVhbnVwLlxuICogVGhleSBtdXN0IGFsc28gbmV2ZXIgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgb2YgcmVzb3VyY2VzIHRoYXQgdXNlIHRoZSBwcm92aWRlciAoY3ljbGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JhbnRUb1Byb3ZpZGVyKHByb3ZpZGVyOiBDdXN0b21SZXNvdXJjZVByb3ZpZGVyLCBzdGF0ZW1lbnQ6IHsgQWN0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXTsgUmVzb3VyY2U6IHN0cmluZyB8IHN0cmluZ1tdIH0pOiB2b2lkIHtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoU3RhY2sub2YocHJvdmlkZXIpLnJlc29sdmUoc3RhdGVtZW50KSk7XG4gIGxldCBzZWVuID0gZ3JhbnRlZC5nZXQocHJvdmlkZXIpO1xuICBpZiAoIXNlZW4pIHtcbiAgICBzZWVuID0gbmV3IFNldCgpO1xuICAgIGdyYW50ZWQuc2V0KHByb3ZpZGVyLCBzZWVuKTtcbiAgfVxuICBpZiAoc2Vlbi5oYXMoa2V5KSkgcmV0dXJuO1xuICBzZWVuLmFkZChrZXkpO1xuICBwcm92aWRlci5hZGRUb1JvbGVQb2xpY3koeyBFZmZlY3Q6ICdBbGxvdycsIC4uLnN0YXRlbWVudCB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CustomResource } from 'aws-cdk-lib';
|
|
2
|
+
import type * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
|
|
3
|
+
import { Construct } from 'constructs';
|
|
4
|
+
import { ALARM_NAME_PREFIX } from './provider-protocol';
|
|
5
|
+
export { ALARM_NAME_PREFIX };
|
|
6
|
+
export interface RegionalAlarmProps {
|
|
7
|
+
readonly region: string;
|
|
8
|
+
/** Must start with `ALARM_NAME_PREFIX`. */
|
|
9
|
+
readonly alarmName: string;
|
|
10
|
+
readonly alarmDescription: string;
|
|
11
|
+
/** PutMetricAlarm's `Metrics` (MetricDataQuery list). */
|
|
12
|
+
readonly metrics: unknown[];
|
|
13
|
+
readonly threshold: number;
|
|
14
|
+
readonly evaluationPeriods: number;
|
|
15
|
+
readonly comparisonOperator: cloudwatch.ComparisonOperator;
|
|
16
|
+
readonly treatMissingData: cloudwatch.TreatMissingData;
|
|
17
|
+
}
|
|
18
|
+
/** A metric alarm in another region, owned through the provider. */
|
|
19
|
+
export declare class RegionalAlarm extends Construct {
|
|
20
|
+
readonly alarmArn: string;
|
|
21
|
+
readonly resource: CustomResource;
|
|
22
|
+
constructor(scope: Construct, id: string, props: RegionalAlarmProps);
|
|
23
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RegionalAlarm = exports.ALARM_NAME_PREFIX = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const constructs_1 = require("constructs");
|
|
6
|
+
const provider_1 = require("./provider");
|
|
7
|
+
const provider_protocol_1 = require("./provider-protocol");
|
|
8
|
+
Object.defineProperty(exports, "ALARM_NAME_PREFIX", { enumerable: true, get: function () { return provider_protocol_1.ALARM_NAME_PREFIX; } });
|
|
9
|
+
/** A metric alarm in another region, owned through the provider. */
|
|
10
|
+
class RegionalAlarm extends constructs_1.Construct {
|
|
11
|
+
alarmArn;
|
|
12
|
+
resource;
|
|
13
|
+
constructor(scope, id, props) {
|
|
14
|
+
super(scope, id);
|
|
15
|
+
if (!props.alarmName.startsWith(provider_protocol_1.ALARM_NAME_PREFIX)) {
|
|
16
|
+
throw new Error(`${this.node.path}: alarm names must start with ${provider_protocol_1.ALARM_NAME_PREFIX}`);
|
|
17
|
+
}
|
|
18
|
+
const stack = aws_cdk_lib_1.Stack.of(this);
|
|
19
|
+
// The provider may manage this library's alarms in any region (granted with the provider, see webFunctionProvider).
|
|
20
|
+
const provider = (0, provider_1.webFunctionProvider)(this);
|
|
21
|
+
const properties = {
|
|
22
|
+
Region: props.region,
|
|
23
|
+
AlarmName: props.alarmName,
|
|
24
|
+
AlarmDescription: props.alarmDescription,
|
|
25
|
+
Metrics: JSON.stringify(props.metrics),
|
|
26
|
+
Threshold: String(props.threshold),
|
|
27
|
+
EvaluationPeriods: String(props.evaluationPeriods),
|
|
28
|
+
ComparisonOperator: props.comparisonOperator,
|
|
29
|
+
TreatMissingData: props.treatMissingData,
|
|
30
|
+
};
|
|
31
|
+
this.resource = new aws_cdk_lib_1.CustomResource(this, 'Resource', {
|
|
32
|
+
serviceToken: provider.serviceToken,
|
|
33
|
+
resourceType: provider_protocol_1.REGIONAL_ALARM_RESOURCE_TYPE,
|
|
34
|
+
properties: { ...properties },
|
|
35
|
+
});
|
|
36
|
+
this.alarmArn = stack.formatArn({ service: 'cloudwatch', region: props.region, resource: 'alarm', resourceName: props.alarmName, arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.RegionalAlarm = RegionalAlarm;
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uYWwtYWxhcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpdmF0ZS9yZWdpb25hbC1hbGFybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBK0Q7QUFFL0QsMkNBQXVDO0FBQ3ZDLHlDQUFpRDtBQUNqRCwyREFBb0g7QUFFM0csa0dBRkEscUNBQWlCLE9BRUE7QUFlMUIsb0VBQW9FO0FBQ3BFLE1BQWEsYUFBYyxTQUFRLHNCQUFTO0lBQzFCLFFBQVEsQ0FBUztJQUNqQixRQUFRLENBQWlCO0lBRXpDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7UUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMscUNBQWlCLENBQUMsRUFBRSxDQUFDO1lBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksaUNBQWlDLHFDQUFpQixFQUFFLENBQUMsQ0FBQztRQUN6RixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0Isb0hBQW9IO1FBQ3BILE1BQU0sUUFBUSxHQUFHLElBQUEsOEJBQW1CLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0MsTUFBTSxVQUFVLEdBQTRCO1lBQzFDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7WUFDMUIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtZQUN4QyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3RDLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUNsQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDO1lBQ2xELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxrQkFBa0I7WUFDNUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtTQUN6QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNuRCxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7WUFDbkMsWUFBWSxFQUFFLGdEQUE0QjtZQUMxQyxVQUFVLEVBQUUsRUFBRSxHQUFHLFVBQVUsRUFBRTtTQUM5QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLHVCQUFTLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQy9LLENBQUM7Q0FDRjtBQTlCRCxzQ0E4QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcm5Gb3JtYXQsIEN1c3RvbVJlc291cmNlLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlICogYXMgY2xvdWR3YXRjaCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IHdlYkZ1bmN0aW9uUHJvdmlkZXIgfSBmcm9tICcuL3Byb3ZpZGVyJztcbmltcG9ydCB7IEFMQVJNX05BTUVfUFJFRklYLCBSRUdJT05BTF9BTEFSTV9SRVNPVVJDRV9UWVBFLCB0eXBlIFJlZ2lvbmFsQWxhcm1Qcm9wZXJ0aWVzIH0gZnJvbSAnLi9wcm92aWRlci1wcm90b2NvbCc7XG5cbmV4cG9ydCB7IEFMQVJNX05BTUVfUFJFRklYIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaW9uYWxBbGFybVByb3BzIHtcbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG4gIC8qKiBNdXN0IHN0YXJ0IHdpdGggYEFMQVJNX05BTUVfUFJFRklYYC4gKi9cbiAgcmVhZG9ubHkgYWxhcm1OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsYXJtRGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqIFB1dE1ldHJpY0FsYXJtJ3MgYE1ldHJpY3NgIChNZXRyaWNEYXRhUXVlcnkgbGlzdCkuICovXG4gIHJlYWRvbmx5IG1ldHJpY3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgdGhyZXNob2xkOiBudW1iZXI7XG4gIHJlYWRvbmx5IGV2YWx1YXRpb25QZXJpb2RzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3I7XG4gIHJlYWRvbmx5IHRyZWF0TWlzc2luZ0RhdGE6IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YTtcbn1cblxuLyoqIEEgbWV0cmljIGFsYXJtIGluIGFub3RoZXIgcmVnaW9uLCBvd25lZCB0aHJvdWdoIHRoZSBwcm92aWRlci4gKi9cbmV4cG9ydCBjbGFzcyBSZWdpb25hbEFsYXJtIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGFsYXJtQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogQ3VzdG9tUmVzb3VyY2U7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJlZ2lvbmFsQWxhcm1Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgaWYgKCFwcm9wcy5hbGFybU5hbWUuc3RhcnRzV2l0aChBTEFSTV9OQU1FX1BSRUZJWCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IGFsYXJtIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCAke0FMQVJNX05BTUVfUFJFRklYfWApO1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIC8vIFRoZSBwcm92aWRlciBtYXkgbWFuYWdlIHRoaXMgbGlicmFyeSdzIGFsYXJtcyBpbiBhbnkgcmVnaW9uIChncmFudGVkIHdpdGggdGhlIHByb3ZpZGVyLCBzZWUgd2ViRnVuY3Rpb25Qcm92aWRlcikuXG4gICAgY29uc3QgcHJvdmlkZXIgPSB3ZWJGdW5jdGlvblByb3ZpZGVyKHRoaXMpO1xuXG4gICAgY29uc3QgcHJvcGVydGllczogUmVnaW9uYWxBbGFybVByb3BlcnRpZXMgPSB7XG4gICAgICBSZWdpb246IHByb3BzLnJlZ2lvbixcbiAgICAgIEFsYXJtTmFtZTogcHJvcHMuYWxhcm1OYW1lLFxuICAgICAgQWxhcm1EZXNjcmlwdGlvbjogcHJvcHMuYWxhcm1EZXNjcmlwdGlvbixcbiAgICAgIE1ldHJpY3M6IEpTT04uc3RyaW5naWZ5KHByb3BzLm1ldHJpY3MpLFxuICAgICAgVGhyZXNob2xkOiBTdHJpbmcocHJvcHMudGhyZXNob2xkKSxcbiAgICAgIEV2YWx1YXRpb25QZXJpb2RzOiBTdHJpbmcocHJvcHMuZXZhbHVhdGlvblBlcmlvZHMpLFxuICAgICAgQ29tcGFyaXNvbk9wZXJhdG9yOiBwcm9wcy5jb21wYXJpc29uT3BlcmF0b3IsXG4gICAgICBUcmVhdE1pc3NpbmdEYXRhOiBwcm9wcy50cmVhdE1pc3NpbmdEYXRhLFxuICAgIH07XG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHJlc291cmNlVHlwZTogUkVHSU9OQUxfQUxBUk1fUkVTT1VSQ0VfVFlQRSxcbiAgICAgIHByb3BlcnRpZXM6IHsgLi4ucHJvcGVydGllcyB9LFxuICAgIH0pO1xuICAgIHRoaXMuYWxhcm1Bcm4gPSBzdGFjay5mb3JtYXRBcm4oeyBzZXJ2aWNlOiAnY2xvdWR3YXRjaCcsIHJlZ2lvbjogcHJvcHMucmVnaW9uLCByZXNvdXJjZTogJ2FsYXJtJywgcmVzb3VyY2VOYW1lOiBwcm9wcy5hbGFybU5hbWUsIGFybkZvcm1hdDogQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CustomResource } from 'aws-cdk-lib';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
export interface RevisionCleanupProps {
|
|
4
|
+
/** Literal function name: the provider's IAM must not reference attributes of resources that use the provider (dependency cycle). */
|
|
5
|
+
readonly functionName: string;
|
|
6
|
+
readonly functionArn: string;
|
|
7
|
+
/** How many of the newest revisions to keep. */
|
|
8
|
+
readonly keep: number;
|
|
9
|
+
/** Revisions the template uses, read when the template is synthesized (endpoints can be added later). */
|
|
10
|
+
readonly revisionIds: () => string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Deletes a function's oldest revisions beyond `keep` on every deployment. Runs after the endpoints
|
|
14
|
+
* (add them as dependencies), so the revisions they just stopped routing to are eligible.
|
|
15
|
+
*/
|
|
16
|
+
export declare class RevisionCleanup extends Construct {
|
|
17
|
+
readonly resource: CustomResource;
|
|
18
|
+
constructor(scope: Construct, id: string, props: RevisionCleanupProps);
|
|
19
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RevisionCleanup = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const constructs_1 = require("constructs");
|
|
6
|
+
const provider_1 = require("./provider");
|
|
7
|
+
const provider_protocol_1 = require("./provider-protocol");
|
|
8
|
+
/**
|
|
9
|
+
* Deletes a function's oldest revisions beyond `keep` on every deployment. Runs after the endpoints
|
|
10
|
+
* (add them as dependencies), so the revisions they just stopped routing to are eligible.
|
|
11
|
+
*/
|
|
12
|
+
class RevisionCleanup extends constructs_1.Construct {
|
|
13
|
+
resource;
|
|
14
|
+
constructor(scope, id, props) {
|
|
15
|
+
super(scope, id);
|
|
16
|
+
const provider = (0, provider_1.webFunctionProvider)(this);
|
|
17
|
+
// Stable grant (see grantToProvider): the function and its revisions, by name.
|
|
18
|
+
const functionArn = aws_cdk_lib_1.Stack.of(this).formatArn({
|
|
19
|
+
service: 'lambda', resource: 'web-function', resourceName: props.functionName, arnFormat: aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME,
|
|
20
|
+
});
|
|
21
|
+
(0, provider_1.grantToProvider)(provider, {
|
|
22
|
+
Action: ['lambda:ListWebFunctionRevisions', 'lambda:DeleteWebFunctionRevision'],
|
|
23
|
+
Resource: [functionArn, `${functionArn}/revision/*`],
|
|
24
|
+
});
|
|
25
|
+
const properties = {
|
|
26
|
+
FunctionArn: props.functionArn,
|
|
27
|
+
Keep: String(props.keep),
|
|
28
|
+
RevisionIds: aws_cdk_lib_1.Lazy.list({ produce: () => [...new Set(props.revisionIds())] }),
|
|
29
|
+
};
|
|
30
|
+
this.resource = new aws_cdk_lib_1.CustomResource(this, 'Resource', {
|
|
31
|
+
serviceToken: provider.serviceToken,
|
|
32
|
+
resourceType: provider_protocol_1.REVISION_CLEANUP_RESOURCE_TYPE,
|
|
33
|
+
properties: { ...properties },
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.RevisionCleanup = RevisionCleanup;
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2aXNpb24tY2xlYW51cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL3JldmlzaW9uLWNsZWFudXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXFFO0FBQ3JFLDJDQUF1QztBQUN2Qyx5Q0FBa0U7QUFDbEUsMkRBQXFHO0FBWXJHOzs7R0FHRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxzQkFBUztJQUM1QixRQUFRLENBQWlCO0lBRXpDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkI7UUFDbkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixNQUFNLFFBQVEsR0FBRyxJQUFBLDhCQUFtQixFQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLCtFQUErRTtRQUMvRSxNQUFNLFdBQVcsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSx1QkFBUyxDQUFDLG1CQUFtQjtTQUN4SCxDQUFDLENBQUM7UUFDSCxJQUFBLDBCQUFlLEVBQUMsUUFBUSxFQUFFO1lBQ3hCLE1BQU0sRUFBRSxDQUFDLGlDQUFpQyxFQUFFLGtDQUFrQyxDQUFDO1lBQy9FLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxHQUFHLFdBQVcsYUFBYSxDQUFDO1NBQ3JELENBQUMsQ0FBQztRQUVILE1BQU0sVUFBVSxHQUE4QjtZQUM1QyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3hCLFdBQVcsRUFBRSxrQkFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQzdFLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ25ELFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtZQUNuQyxZQUFZLEVBQUUsa0RBQThCO1lBQzVDLFVBQVUsRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTFCRCwwQ0EwQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcm5Gb3JtYXQsIEN1c3RvbVJlc291cmNlLCBMYXp5LCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgZ3JhbnRUb1Byb3ZpZGVyLCB3ZWJGdW5jdGlvblByb3ZpZGVyIH0gZnJvbSAnLi9wcm92aWRlcic7XG5pbXBvcnQgeyBSRVZJU0lPTl9DTEVBTlVQX1JFU09VUkNFX1RZUEUsIHR5cGUgUmV2aXNpb25DbGVhbnVwUHJvcGVydGllcyB9IGZyb20gJy4vcHJvdmlkZXItcHJvdG9jb2wnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJldmlzaW9uQ2xlYW51cFByb3BzIHtcbiAgLyoqIExpdGVyYWwgZnVuY3Rpb24gbmFtZTogdGhlIHByb3ZpZGVyJ3MgSUFNIG11c3Qgbm90IHJlZmVyZW5jZSBhdHRyaWJ1dGVzIG9mIHJlc291cmNlcyB0aGF0IHVzZSB0aGUgcHJvdmlkZXIgKGRlcGVuZGVuY3kgY3ljbGUpLiAqL1xuICByZWFkb25seSBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZnVuY3Rpb25Bcm46IHN0cmluZztcbiAgLyoqIEhvdyBtYW55IG9mIHRoZSBuZXdlc3QgcmV2aXNpb25zIHRvIGtlZXAuICovXG4gIHJlYWRvbmx5IGtlZXA6IG51bWJlcjtcbiAgLyoqIFJldmlzaW9ucyB0aGUgdGVtcGxhdGUgdXNlcywgcmVhZCB3aGVuIHRoZSB0ZW1wbGF0ZSBpcyBzeW50aGVzaXplZCAoZW5kcG9pbnRzIGNhbiBiZSBhZGRlZCBsYXRlcikuICovXG4gIHJlYWRvbmx5IHJldmlzaW9uSWRzOiAoKSA9PiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBEZWxldGVzIGEgZnVuY3Rpb24ncyBvbGRlc3QgcmV2aXNpb25zIGJleW9uZCBga2VlcGAgb24gZXZlcnkgZGVwbG95bWVudC4gUnVucyBhZnRlciB0aGUgZW5kcG9pbnRzXG4gKiAoYWRkIHRoZW0gYXMgZGVwZW5kZW5jaWVzKSwgc28gdGhlIHJldmlzaW9ucyB0aGV5IGp1c3Qgc3RvcHBlZCByb3V0aW5nIHRvIGFyZSBlbGlnaWJsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJldmlzaW9uQ2xlYW51cCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogQ3VzdG9tUmVzb3VyY2U7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJldmlzaW9uQ2xlYW51cFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICBjb25zdCBwcm92aWRlciA9IHdlYkZ1bmN0aW9uUHJvdmlkZXIodGhpcyk7XG4gICAgLy8gU3RhYmxlIGdyYW50IChzZWUgZ3JhbnRUb1Byb3ZpZGVyKTogdGhlIGZ1bmN0aW9uIGFuZCBpdHMgcmV2aXNpb25zLCBieSBuYW1lLlxuICAgIGNvbnN0IGZ1bmN0aW9uQXJuID0gU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdsYW1iZGEnLCByZXNvdXJjZTogJ3dlYi1mdW5jdGlvbicsIHJlc291cmNlTmFtZTogcHJvcHMuZnVuY3Rpb25OYW1lLCBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgIH0pO1xuICAgIGdyYW50VG9Qcm92aWRlcihwcm92aWRlciwge1xuICAgICAgQWN0aW9uOiBbJ2xhbWJkYTpMaXN0V2ViRnVuY3Rpb25SZXZpc2lvbnMnLCAnbGFtYmRhOkRlbGV0ZVdlYkZ1bmN0aW9uUmV2aXNpb24nXSxcbiAgICAgIFJlc291cmNlOiBbZnVuY3Rpb25Bcm4sIGAke2Z1bmN0aW9uQXJufS9yZXZpc2lvbi8qYF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBSZXZpc2lvbkNsZWFudXBQcm9wZXJ0aWVzID0ge1xuICAgICAgRnVuY3Rpb25Bcm46IHByb3BzLmZ1bmN0aW9uQXJuLFxuICAgICAgS2VlcDogU3RyaW5nKHByb3BzLmtlZXApLFxuICAgICAgUmV2aXNpb25JZHM6IExhenkubGlzdCh7IHByb2R1Y2U6ICgpID0+IFsuLi5uZXcgU2V0KHByb3BzLnJldmlzaW9uSWRzKCkpXSB9KSxcbiAgICB9O1xuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICByZXNvdXJjZVR5cGU6IFJFVklTSU9OX0NMRUFOVVBfUkVTT1VSQ0VfVFlQRSxcbiAgICAgIHByb3BlcnRpZXM6IHsgLi4ucHJvcGVydGllcyB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Duration } from 'aws-cdk-lib';
|
|
2
|
+
/** `WebFunctionRollbackOptions` with defaults applied. */
|
|
3
|
+
export interface ResolvedRollbackOptions {
|
|
4
|
+
readonly serverErrorRate?: number;
|
|
5
|
+
readonly clientErrorRate?: number;
|
|
6
|
+
readonly minimumRequests: number;
|
|
7
|
+
readonly period: Duration;
|
|
8
|
+
readonly evaluationPeriods: number;
|
|
9
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbGJhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpdmF0ZS9yb2xsYmFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcblxuLyoqIGBXZWJGdW5jdGlvblJvbGxiYWNrT3B0aW9uc2Agd2l0aCBkZWZhdWx0cyBhcHBsaWVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFJvbGxiYWNrT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHNlcnZlckVycm9yUmF0ZT86IG51bWJlcjtcbiAgcmVhZG9ubHkgY2xpZW50RXJyb3JSYXRlPzogbnVtYmVyO1xuICByZWFkb25seSBtaW5pbXVtUmVxdWVzdHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcGVyaW9kOiBEdXJhdGlvbjtcbiAgcmVhZG9ubHkgZXZhbHVhdGlvblBlcmlvZHM6IG51bWJlcjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CustomResource } from 'aws-cdk-lib';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import type { WebFunctionDeployment } from '../web-function-deployment';
|
|
4
|
+
export interface TrafficShiftProps {
|
|
5
|
+
/** Literal function name, for stable IAM grants. */
|
|
6
|
+
readonly functionName: string;
|
|
7
|
+
readonly functionArn: string;
|
|
8
|
+
readonly endpointName: string;
|
|
9
|
+
readonly revisionId: string;
|
|
10
|
+
readonly deployment: WebFunctionDeployment;
|
|
11
|
+
/** ARNs of alarms the endpoint created (`rollbackOn`), watched with the deployment's own `alarms`. */
|
|
12
|
+
readonly alarmArns?: string[];
|
|
13
|
+
/** The endpoint's other settings: any change makes the shift run, so it can re-check the traffic before CloudFormation writes it. */
|
|
14
|
+
readonly endpointConfig: unknown;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Moves an endpoint's traffic to `revisionId` in steps before CloudFormation updates the endpoint (which must depend on it).
|
|
18
|
+
*/
|
|
19
|
+
export declare class TrafficShift extends Construct {
|
|
20
|
+
readonly resource: CustomResource;
|
|
21
|
+
constructor(scope: Construct, id: string, props: TrafficShiftProps);
|
|
22
|
+
}
|