@ashishpandeyone/cdk-lambda-web-function 0.1.2 → 0.1.4

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.
@@ -1,5 +1,49 @@
1
1
  import { Duration } from 'aws-cdk-lib';
2
2
  import type * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
3
+ import type { ResolvedRollbackOptions } from './private/rollback';
4
+ /**
5
+ * Alarms an endpoint creates on its own metrics to stop a canary or linear deployment.
6
+ *
7
+ * The endpoint creates one alarm per threshold in every region it serves from (metrics are published
8
+ * in the region that served the request, and an alarm can only watch metrics in its own region).
9
+ * Lambda Web Function metrics have no revision dimension, so the alarms watch the whole endpoint: while
10
+ * the new revision gets 10% of the traffic, its errors are about a tenth of the endpoint's.
11
+ */
12
+ export interface WebFunctionRollbackOptions {
13
+ /**
14
+ * Roll back when more than this percent of the endpoint's requests get a 5XX response (0-100).
15
+ *
16
+ * 5XX includes the platform's 503s while an endpoint scales up for a sudden burst, not only your application's errors.
17
+ *
18
+ * @default - no server error alarm
19
+ */
20
+ readonly serverErrorRate?: number;
21
+ /**
22
+ * Roll back when more than this percent of the endpoint's requests get a 4XX response (0-100).
23
+ * Requests over `rateLimit` or `maxEnvironments` get 429, which counts here.
24
+ *
25
+ * @default - no client error alarm
26
+ */
27
+ readonly clientErrorRate?: number;
28
+ /**
29
+ * Periods with fewer requests than this don't count, so one failed request out of two doesn't roll back.
30
+ *
31
+ * @default 10
32
+ */
33
+ readonly minimumRequests?: number;
34
+ /**
35
+ * The period each rate is measured over (at least 1 minute, in whole minutes).
36
+ *
37
+ * @default Duration.minutes(1)
38
+ */
39
+ readonly period?: Duration;
40
+ /**
41
+ * How many consecutive periods must breach a threshold before the deployment rolls back.
42
+ *
43
+ * @default 2
44
+ */
45
+ readonly evaluationPeriods?: number;
46
+ }
3
47
  /**
4
48
  * Options for a canary deployment.
5
49
  */
@@ -23,6 +67,13 @@ export interface WebFunctionCanaryDeploymentOptions {
23
67
  * @default - no alarms: traffic moves on a timer
24
68
  */
25
69
  readonly alarms?: cloudwatch.IAlarm[];
70
+ /**
71
+ * Alarms on the endpoint's own error rates, created by the endpoint in every region it serves from.
72
+ * They stop the deployment like `alarms` (both can be used together).
73
+ *
74
+ * @default - no endpoint alarms
75
+ */
76
+ readonly rollbackOn?: WebFunctionRollbackOptions;
26
77
  }
27
78
  /**
28
79
  * Options for a linear deployment.
@@ -46,6 +97,13 @@ export interface WebFunctionLinearDeploymentOptions {
46
97
  * @default - no alarms: traffic moves on a timer
47
98
  */
48
99
  readonly alarms?: cloudwatch.IAlarm[];
100
+ /**
101
+ * Alarms on the endpoint's own error rates, created by the endpoint in every region it serves from.
102
+ * They stop the deployment like `alarms` (both can be used together).
103
+ *
104
+ * @default - no endpoint alarms
105
+ */
106
+ readonly rollbackOn?: WebFunctionRollbackOptions;
49
107
  }
50
108
  /**
51
109
  * How an endpoint moves its traffic to a new revision.
@@ -79,6 +137,12 @@ export declare class WebFunctionDeployment {
79
137
  readonly _alarms: cloudwatch.IAlarm[];
80
138
  /** @internal */
81
139
  readonly _kind: string;
140
+ /**
141
+ * Thresholds for the alarms the endpoint creates, with defaults applied.
142
+ *
143
+ * @internal
144
+ */
145
+ readonly _rollbackOn?: ResolvedRollbackOptions;
82
146
  private constructor();
83
147
  /**
84
148
  * Whether traffic moves in steps (canary or linear) rather than all at once.
@@ -11,12 +11,12 @@ 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.2" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionDeployment", version: "0.1.4" };
15
15
  /**
16
16
  * All traffic moves to the new revision at once, as soon as it's ready (the default).
17
17
  */
18
18
  static allAtOnce() {
19
- return new WebFunctionDeployment('allAtOnce', [100], 0, []);
19
+ return new WebFunctionDeployment('allAtOnce', [100], 0, [], undefined);
20
20
  }
21
21
  /**
22
22
  * The new revision first gets `percent` of the traffic for `bake`, then all of it.
@@ -24,7 +24,7 @@ class WebFunctionDeployment {
24
24
  static canary(options) {
25
25
  const percent = wholePercent('canary', 'percent', options.percent, 1, 99);
26
26
  const bake = minutes('canary', 'bake', options.bake, MAX_TOTAL_WAIT_MINUTES);
27
- return new WebFunctionDeployment('canary', [percent, 100], bake.toSeconds(), options.alarms ?? []);
27
+ return new WebFunctionDeployment('canary', [percent, 100], bake.toSeconds(), options.alarms ?? [], rollbackOn('canary', options.rollbackOn));
28
28
  }
29
29
  /**
30
30
  * The new revision gets `percent` more of the traffic every `interval` until it has all of it.
@@ -40,7 +40,7 @@ class WebFunctionDeployment {
40
40
  if (total > MAX_TOTAL_WAIT_MINUTES * 60) {
41
41
  throw new Error(`WebFunctionDeployment.linear: ${steps.length - 1} intervals of ${interval.toHumanString()} take ${total / 60} minutes; at most ${MAX_TOTAL_WAIT_MINUTES} are allowed`);
42
42
  }
43
- return new WebFunctionDeployment('linear', steps, interval.toSeconds(), options.alarms ?? []);
43
+ return new WebFunctionDeployment('linear', steps, interval.toSeconds(), options.alarms ?? [], rollbackOn('linear', options.rollbackOn));
44
44
  }
45
45
  /**
46
46
  * The new revision's share of traffic at each step, in percent; the last is 100.
@@ -58,11 +58,18 @@ class WebFunctionDeployment {
58
58
  _alarms;
59
59
  /** @internal */
60
60
  _kind;
61
- constructor(kind, steps, waitSeconds, alarms) {
61
+ /**
62
+ * Thresholds for the alarms the endpoint creates, with defaults applied.
63
+ *
64
+ * @internal
65
+ */
66
+ _rollbackOn;
67
+ constructor(kind, steps, waitSeconds, alarms, rollback) {
62
68
  this._kind = kind;
63
69
  this._steps = steps;
64
70
  this._waitSeconds = waitSeconds;
65
71
  this._alarms = alarms;
72
+ this._rollbackOn = rollback;
66
73
  }
67
74
  /**
68
75
  * Whether traffic moves in steps (canary or linear) rather than all at once.
@@ -87,4 +94,32 @@ function minutes(kind, name, value, maxMinutes) {
87
94
  }
88
95
  return aws_cdk_lib_1.Duration.seconds(seconds);
89
96
  }
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWRlcGxveW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd2ViLWZ1bmN0aW9uLWRlcGxveW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZDQUE4QztBQUc5QyxnSUFBZ0k7QUFDaEksTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDbEMsMEZBQTBGO0FBQzFGLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQXVEckI7O0dBRUc7QUFDSCxNQUFhLHFCQUFxQjs7SUFDaEM7O09BRUc7SUFDSSxNQUFNLENBQUMsU0FBUztRQUNyQixPQUFPLElBQUkscUJBQXFCLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBMkM7UUFDOUQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQzdFLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUEyQztRQUM5RCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEYsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxPQUFPO1lBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxLQUFLLEdBQUcsc0JBQXNCLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLGlCQUFpQixRQUFRLENBQUMsYUFBYSxFQUFFLFNBQVMsS0FBSyxHQUFHLEVBQUUscUJBQXFCLHNCQUFzQixjQUFjLENBQUMsQ0FBQztRQUMxTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVEOzs7O09BSUc7SUFDYSxNQUFNLENBQVc7SUFFakM7Ozs7T0FJRztJQUNhLFlBQVksQ0FBUztJQUVyQyxnQkFBZ0I7SUFDQSxPQUFPLENBQXNCO0lBRTdDLGdCQUFnQjtJQUNBLEtBQUssQ0FBUztJQUU5QixZQUFvQixJQUFZLEVBQUUsS0FBZSxFQUFFLFdBQW1CLEVBQUUsTUFBMkI7UUFDakcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQzs7QUFuRUgsc0RBb0VDO0FBRUQsU0FBUyxZQUFZLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVc7SUFDdkYsSUFBSSxtQkFBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDeEYsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxLQUFLLElBQUksZ0NBQWdDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxTQUFTLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbEksQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsS0FBZSxFQUFFLFVBQWtCO0lBQzlFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNsQyxJQUFJLG1CQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sR0FBRyxFQUFFLElBQUksT0FBTyxHQUFHLFVBQVUsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUM3RSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixJQUFJLEtBQUssSUFBSSxzQkFBc0IsVUFBVSxpQkFBaUIsbUJBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1SyxDQUFDO0lBQ0QsT0FBTyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24sIFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgKiBhcyBjbG91ZHdhdGNoIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcblxuLyoqIExvbmdlc3QgdG90YWwgd2FpdCBvZiBhIGRlcGxveW1lbnQ6IHRoZSBkZXBsb3ltZW50IHN0ZXAgbXVzdCBmaW5pc2ggd2l0aGluIENsb3VkRm9ybWF0aW9uJ3MgMS1ob3VyIGN1c3RvbSByZXNvdXJjZSBsaW1pdC4gKi9cbmNvbnN0IE1BWF9UT1RBTF9XQUlUX01JTlVURVMgPSA0NTtcbi8qKiBNb3N0IHRyYWZmaWMgc3RlcHM6IGVhY2ggb25lIGFsc28gd2FpdHMgZm9yIHRoZSBlbmRwb2ludCB0byB1cGRhdGUgaW4gZXZlcnkgcmVnaW9uLiAqL1xuY29uc3QgTUFYX1NURVBTID0gMjA7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSBjYW5hcnkgZGVwbG95bWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbkNhbmFyeURlcGxveW1lbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzaGFyZSBvZiB0cmFmZmljLCBpbiB3aG9sZSBwZXJjZW50ICgxLTk5KSwgdGhhdCB0aGUgbmV3IHJldmlzaW9uIGdldHMgZmlyc3QuXG4gICAqL1xuICByZWFkb25seSBwZXJjZW50OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBuZXcgcmV2aXNpb24gc2VydmVzIGBwZXJjZW50YCBiZWZvcmUgaXQgZ2V0cyBhbGwgdHJhZmZpYyAoMS00NSBtaW51dGVzKS5cbiAgICogTWFrZSBpdCBsb25nZXIgdGhhbiB0aGUgdGltZSB5b3VyIGFsYXJtcyBuZWVkIHRvIGZpcmUgKHBlcmlvZCDDlyBldmFsdWF0aW9uIHBlcmlvZHMpLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFrZTogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEFsYXJtcyB0aGF0IHN0b3AgdGhlIGRlcGxveW1lbnQ6IGlmIG9uZSBpcyBpbiBBTEFSTSwgdGhlIGVuZHBvaW50IGdvZXMgYmFjayB0byB0aGUgcHJldmlvdXNcbiAgICogcmV2aXNpb24gYW5kIHRoZSBkZXBsb3ltZW50IGZhaWxzLCBzbyBDbG91ZEZvcm1hdGlvbiByb2xscyB0aGUgc3RhY2sgYmFjay5cbiAgICpcbiAgICogVGhleSdyZSBjaGVja2VkIGJlZm9yZSB0cmFmZmljIG1vdmVzLCBkdXJpbmcgdGhlIGJha2UsIGFuZCBvbmNlIHRoZSBuZXcgcmV2aXNpb24gaGFzIGFsbCB0cmFmZmljLlxuICAgKiBVc2UgYWxhcm1zIGluIGFueSByZWdpb24gKGJ5IEFSTiksIGluY2x1ZGluZyBjb21wb3NpdGUgYWxhcm1zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFsYXJtczogdHJhZmZpYyBtb3ZlcyBvbiBhIHRpbWVyXG4gICAqL1xuICByZWFkb25seSBhbGFybXM/OiBjbG91ZHdhdGNoLklBbGFybVtdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgbGluZWFyIGRlcGxveW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViRnVuY3Rpb25MaW5lYXJEZXBsb3ltZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc2hhcmUgb2YgdHJhZmZpYywgaW4gd2hvbGUgcGVyY2VudCAoNS01MCksIHRoYXQgbW92ZXMgdG8gdGhlIG5ldyByZXZpc2lvbiBhdCBlYWNoIHN0ZXAuXG4gICAqL1xuICByZWFkb25seSBwZXJjZW50OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIGVhY2ggc3RlcCBzZXJ2ZXMgYmVmb3JlIHRoZSBuZXh0IG9uZSAoYXQgbGVhc3QgMSBtaW51dGUsIGFuZCBhdCBtb3N0IDQ1IG1pbnV0ZXMgaW4gdG90YWwpLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw6IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBBbGFybXMgdGhhdCBzdG9wIHRoZSBkZXBsb3ltZW50OiBpZiBvbmUgaXMgaW4gQUxBUk0sIHRoZSBlbmRwb2ludCBnb2VzIGJhY2sgdG8gdGhlIHByZXZpb3VzXG4gICAqIHJldmlzaW9uIGFuZCB0aGUgZGVwbG95bWVudCBmYWlscywgc28gQ2xvdWRGb3JtYXRpb24gcm9sbHMgdGhlIHN0YWNrIGJhY2suXG4gICAqXG4gICAqIFRoZXkncmUgY2hlY2tlZCBiZWZvcmUgdHJhZmZpYyBtb3ZlcywgZHVyaW5nIGV2ZXJ5IHN0ZXAsIGFuZCBvbmNlIHRoZSBuZXcgcmV2aXNpb24gaGFzIGFsbCB0cmFmZmljLlxuICAgKiBVc2UgYWxhcm1zIGluIGFueSByZWdpb24gKGJ5IEFSTiksIGluY2x1ZGluZyBjb21wb3NpdGUgYWxhcm1zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFsYXJtczogdHJhZmZpYyBtb3ZlcyBvbiBhIHRpbWVyXG4gICAqL1xuICByZWFkb25seSBhbGFybXM/OiBjbG91ZHdhdGNoLklBbGFybVtdO1xufVxuXG4vKipcbiAqIEhvdyBhbiBlbmRwb2ludCBtb3ZlcyBpdHMgdHJhZmZpYyB0byBhIG5ldyByZXZpc2lvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uRGVwbG95bWVudCB7XG4gIC8qKlxuICAgKiBBbGwgdHJhZmZpYyBtb3ZlcyB0byB0aGUgbmV3IHJldmlzaW9uIGF0IG9uY2UsIGFzIHNvb24gYXMgaXQncyByZWFkeSAodGhlIGRlZmF1bHQpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhbGxBdE9uY2UoKTogV2ViRnVuY3Rpb25EZXBsb3ltZW50IHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uRGVwbG95bWVudCgnYWxsQXRPbmNlJywgWzEwMF0sIDAsIFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHJldmlzaW9uIGZpcnN0IGdldHMgYHBlcmNlbnRgIG9mIHRoZSB0cmFmZmljIGZvciBgYmFrZWAsIHRoZW4gYWxsIG9mIGl0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjYW5hcnkob3B0aW9uczogV2ViRnVuY3Rpb25DYW5hcnlEZXBsb3ltZW50T3B0aW9ucyk6IFdlYkZ1bmN0aW9uRGVwbG95bWVudCB7XG4gICAgY29uc3QgcGVyY2VudCA9IHdob2xlUGVyY2VudCgnY2FuYXJ5JywgJ3BlcmNlbnQnLCBvcHRpb25zLnBlcmNlbnQsIDEsIDk5KTtcbiAgICBjb25zdCBiYWtlID0gbWludXRlcygnY2FuYXJ5JywgJ2Jha2UnLCBvcHRpb25zLmJha2UsIE1BWF9UT1RBTF9XQUlUX01JTlVURVMpO1xuICAgIHJldHVybiBuZXcgV2ViRnVuY3Rpb25EZXBsb3ltZW50KCdjYW5hcnknLCBbcGVyY2VudCwgMTAwXSwgYmFrZS50b1NlY29uZHMoKSwgb3B0aW9ucy5hbGFybXMgPz8gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgcmV2aXNpb24gZ2V0cyBgcGVyY2VudGAgbW9yZSBvZiB0aGUgdHJhZmZpYyBldmVyeSBgaW50ZXJ2YWxgIHVudGlsIGl0IGhhcyBhbGwgb2YgaXQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxpbmVhcihvcHRpb25zOiBXZWJGdW5jdGlvbkxpbmVhckRlcGxveW1lbnRPcHRpb25zKTogV2ViRnVuY3Rpb25EZXBsb3ltZW50IHtcbiAgICBjb25zdCBwZXJjZW50ID0gd2hvbGVQZXJjZW50KCdsaW5lYXInLCAncGVyY2VudCcsIG9wdGlvbnMucGVyY2VudCwgMTAwIC8gTUFYX1NURVBTLCA1MCk7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBtaW51dGVzKCdsaW5lYXInLCAnaW50ZXJ2YWwnLCBvcHRpb25zLmludGVydmFsLCBNQVhfVE9UQUxfV0FJVF9NSU5VVEVTKTtcbiAgICBjb25zdCBzdGVwczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBwID0gcGVyY2VudDsgcCA8IDEwMDsgcCArPSBwZXJjZW50KSBzdGVwcy5wdXNoKHApO1xuICAgIHN0ZXBzLnB1c2goMTAwKTtcbiAgICBjb25zdCB0b3RhbCA9IGludGVydmFsLnRvU2Vjb25kcygpICogKHN0ZXBzLmxlbmd0aCAtIDEpO1xuICAgIGlmICh0b3RhbCA+IE1BWF9UT1RBTF9XQUlUX01JTlVURVMgKiA2MCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXZWJGdW5jdGlvbkRlcGxveW1lbnQubGluZWFyOiAke3N0ZXBzLmxlbmd0aCAtIDF9IGludGVydmFscyBvZiAke2ludGVydmFsLnRvSHVtYW5TdHJpbmcoKX0gdGFrZSAke3RvdGFsIC8gNjB9IG1pbnV0ZXM7IGF0IG1vc3QgJHtNQVhfVE9UQUxfV0FJVF9NSU5VVEVTfSBhcmUgYWxsb3dlZGApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uRGVwbG95bWVudCgnbGluZWFyJywgc3RlcHMsIGludGVydmFsLnRvU2Vjb25kcygpLCBvcHRpb25zLmFsYXJtcyA/PyBbXSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5ldyByZXZpc2lvbidzIHNoYXJlIG9mIHRyYWZmaWMgYXQgZWFjaCBzdGVwLCBpbiBwZXJjZW50OyB0aGUgbGFzdCBpcyAxMDAuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IF9zdGVwczogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFNlY29uZHMgZWFjaCBzdGVwIHNlcnZlcyBiZWZvcmUgdGhlIG5leHQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IF93YWl0U2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIHJlYWRvbmx5IF9hbGFybXM6IGNsb3Vkd2F0Y2guSUFsYXJtW107XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgX2tpbmQ6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGtpbmQ6IHN0cmluZywgc3RlcHM6IG51bWJlcltdLCB3YWl0U2Vjb25kczogbnVtYmVyLCBhbGFybXM6IGNsb3Vkd2F0Y2guSUFsYXJtW10pIHtcbiAgICB0aGlzLl9raW5kID0ga2luZDtcbiAgICB0aGlzLl9zdGVwcyA9IHN0ZXBzO1xuICAgIHRoaXMuX3dhaXRTZWNvbmRzID0gd2FpdFNlY29uZHM7XG4gICAgdGhpcy5fYWxhcm1zID0gYWxhcm1zO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdHJhZmZpYyBtb3ZlcyBpbiBzdGVwcyAoY2FuYXJ5IG9yIGxpbmVhcikgcmF0aGVyIHRoYW4gYWxsIGF0IG9uY2UuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGdldCBfZ3JhZHVhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcHMubGVuZ3RoID4gMTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3aG9sZVBlcmNlbnQoa2luZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQodmFsdWUpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgV2ViRnVuY3Rpb25EZXBsb3ltZW50LiR7a2luZH06ICR7bmFtZX0gbXVzdCBiZSBhIHdob2xlIG51bWJlciBmcm9tICR7TWF0aC5jZWlsKG1pbil9IHRvICR7bWF4fSwgZ290ICR7dmFsdWV9YCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBtaW51dGVzKGtpbmQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogRHVyYXRpb24sIG1heE1pbnV0ZXM6IG51bWJlcik6IER1cmF0aW9uIHtcbiAgY29uc3Qgc2Vjb25kcyA9IHZhbHVlLnRvU2Vjb25kcygpO1xuICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHNlY29uZHMpIHx8IHNlY29uZHMgPCA2MCB8fCBzZWNvbmRzID4gbWF4TWludXRlcyAqIDYwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBXZWJGdW5jdGlvbkRlcGxveW1lbnQuJHtraW5kfTogJHtuYW1lfSBtdXN0IGJlIGZyb20gMSB0byAke21heE1pbnV0ZXN9IG1pbnV0ZXMsIGdvdCAke1Rva2VuLmlzVW5yZXNvbHZlZChzZWNvbmRzKSA/ICdhIHRva2VuJyA6IHZhbHVlLnRvSHVtYW5TdHJpbmcoKX1gKTtcbiAgfVxuICByZXR1cm4gRHVyYXRpb24uc2Vjb25kcyhzZWNvbmRzKTtcbn1cbiJdfQ==
97
+ function rollbackOn(kind, options) {
98
+ if (options === undefined)
99
+ return undefined;
100
+ const fail = (message) => {
101
+ throw new Error(`WebFunctionDeployment.${kind}: rollbackOn.${message}`);
102
+ };
103
+ if (options.serverErrorRate === undefined && options.clientErrorRate === undefined) {
104
+ fail('serverErrorRate or rollbackOn.clientErrorRate is required');
105
+ }
106
+ for (const [name, rate] of [['serverErrorRate', options.serverErrorRate], ['clientErrorRate', options.clientErrorRate]]) {
107
+ if (rate !== undefined && (aws_cdk_lib_1.Token.isUnresolved(rate) || !(rate >= 0 && rate < 100)))
108
+ fail(`${name} must be a percentage from 0 to below 100, got ${rate}`);
109
+ }
110
+ const minimumRequests = options.minimumRequests ?? 10;
111
+ if (aws_cdk_lib_1.Token.isUnresolved(minimumRequests) || !Number.isInteger(minimumRequests) || minimumRequests < 1) {
112
+ fail(`minimumRequests must be a whole number from 1, got ${minimumRequests}`);
113
+ }
114
+ const period = options.period ?? aws_cdk_lib_1.Duration.minutes(1);
115
+ const seconds = period.toSeconds();
116
+ if (aws_cdk_lib_1.Token.isUnresolved(seconds) || seconds < 60 || seconds % 60 !== 0) {
117
+ fail(`period must be whole minutes, at least 1, got ${aws_cdk_lib_1.Token.isUnresolved(seconds) ? 'a token' : period.toHumanString()}`);
118
+ }
119
+ const evaluationPeriods = options.evaluationPeriods ?? 2;
120
+ if (aws_cdk_lib_1.Token.isUnresolved(evaluationPeriods) || !Number.isInteger(evaluationPeriods) || evaluationPeriods < 1) {
121
+ fail(`evaluationPeriods must be a whole number from 1, got ${evaluationPeriods}`);
122
+ }
123
+ return { serverErrorRate: options.serverErrorRate, clientErrorRate: options.clientErrorRate, minimumRequests, period, evaluationPeriods };
124
+ }
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWRlcGxveW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd2ViLWZ1bmN0aW9uLWRlcGxveW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZDQUE4QztBQUk5QyxnSUFBZ0k7QUFDaEksTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDbEMsMEZBQTBGO0FBQzFGLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQXVIckI7O0dBRUc7QUFDSCxNQUFhLHFCQUFxQjs7SUFDaEM7O09BRUc7SUFDSSxNQUFNLENBQUMsU0FBUztRQUNyQixPQUFPLElBQUkscUJBQXFCLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQTJDO1FBQzlELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztRQUM3RSxPQUFPLElBQUkscUJBQXFCLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQy9JLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBMkM7UUFDOUQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFB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LGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLENBQUM7QUFDNUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uLCBUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlICogYXMgY2xvdWR3YXRjaCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkUm9sbGJhY2tPcHRpb25zIH0gZnJvbSAnLi9wcml2YXRlL3JvbGxiYWNrJztcblxuLyoqIExvbmdlc3QgdG90YWwgd2FpdCBvZiBhIGRlcGxveW1lbnQ6IHRoZSBkZXBsb3ltZW50IHN0ZXAgbXVzdCBmaW5pc2ggd2l0aGluIENsb3VkRm9ybWF0aW9uJ3MgMS1ob3VyIGN1c3RvbSByZXNvdXJjZSBsaW1pdC4gKi9cbmNvbnN0IE1BWF9UT1RBTF9XQUlUX01JTlVURVMgPSA0NTtcbi8qKiBNb3N0IHRyYWZmaWMgc3RlcHM6IGVhY2ggb25lIGFsc28gd2FpdHMgZm9yIHRoZSBlbmRwb2ludCB0byB1cGRhdGUgaW4gZXZlcnkgcmVnaW9uLiAqL1xuY29uc3QgTUFYX1NURVBTID0gMjA7XG5cbi8qKlxuICogQWxhcm1zIGFuIGVuZHBvaW50IGNyZWF0ZXMgb24gaXRzIG93biBtZXRyaWNzIHRvIHN0b3AgYSBjYW5hcnkgb3IgbGluZWFyIGRlcGxveW1lbnQuXG4gKlxuICogVGhlIGVuZHBvaW50IGNyZWF0ZXMgb25lIGFsYXJtIHBlciB0aHJlc2hvbGQgaW4gZXZlcnkgcmVnaW9uIGl0IHNlcnZlcyBmcm9tIChtZXRyaWNzIGFyZSBwdWJsaXNoZWRcbiAqIGluIHRoZSByZWdpb24gdGhhdCBzZXJ2ZWQgdGhlIHJlcXVlc3QsIGFuZCBhbiBhbGFybSBjYW4gb25seSB3YXRjaCBtZXRyaWNzIGluIGl0cyBvd24gcmVnaW9uKS5cbiAqIExhbWJkYSBXZWIgRnVuY3Rpb24gbWV0cmljcyBoYXZlIG5vIHJldmlzaW9uIGRpbWVuc2lvbiwgc28gdGhlIGFsYXJtcyB3YXRjaCB0aGUgd2hvbGUgZW5kcG9pbnQ6IHdoaWxlXG4gKiB0aGUgbmV3IHJldmlzaW9uIGdldHMgMTAlIG9mIHRoZSB0cmFmZmljLCBpdHMgZXJyb3JzIGFyZSBhYm91dCBhIHRlbnRoIG9mIHRoZSBlbmRwb2ludCdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uUm9sbGJhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJvbGwgYmFjayB3aGVuIG1vcmUgdGhhbiB0aGlzIHBlcmNlbnQgb2YgdGhlIGVuZHBvaW50J3MgcmVxdWVzdHMgZ2V0IGEgNVhYIHJlc3BvbnNlICgwLTEwMCkuXG4gICAqXG4gICAqIDVYWCBpbmNsdWRlcyB0aGUgcGxhdGZvcm0ncyA1MDNzIHdoaWxlIGFuIGVuZHBvaW50IHNjYWxlcyB1cCBmb3IgYSBzdWRkZW4gYnVyc3QsIG5vdCBvbmx5IHlvdXIgYXBwbGljYXRpb24ncyBlcnJvcnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc2VydmVyIGVycm9yIGFsYXJtXG4gICAqL1xuICByZWFkb25seSBzZXJ2ZXJFcnJvclJhdGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJvbGwgYmFjayB3aGVuIG1vcmUgdGhhbiB0aGlzIHBlcmNlbnQgb2YgdGhlIGVuZHBvaW50J3MgcmVxdWVzdHMgZ2V0IGEgNFhYIHJlc3BvbnNlICgwLTEwMCkuXG4gICAqIFJlcXVlc3RzIG92ZXIgYHJhdGVMaW1pdGAgb3IgYG1heEVudmlyb25tZW50c2AgZ2V0IDQyOSwgd2hpY2ggY291bnRzIGhlcmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY2xpZW50IGVycm9yIGFsYXJtXG4gICAqL1xuICByZWFkb25seSBjbGllbnRFcnJvclJhdGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFBlcmlvZHMgd2l0aCBmZXdlciByZXF1ZXN0cyB0aGFuIHRoaXMgZG9uJ3QgY291bnQsIHNvIG9uZSBmYWlsZWQgcmVxdWVzdCBvdXQgb2YgdHdvIGRvZXNuJ3Qgcm9sbCBiYWNrLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgcmVhZG9ubHkgbWluaW11bVJlcXVlc3RzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyaW9kIGVhY2ggcmF0ZSBpcyBtZWFzdXJlZCBvdmVyIChhdCBsZWFzdCAxIG1pbnV0ZSwgaW4gd2hvbGUgbWludXRlcykuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLm1pbnV0ZXMoMSlcbiAgICovXG4gIHJlYWRvbmx5IHBlcmlvZD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSBjb25zZWN1dGl2ZSBwZXJpb2RzIG11c3QgYnJlYWNoIGEgdGhyZXNob2xkIGJlZm9yZSB0aGUgZGVwbG95bWVudCByb2xscyBiYWNrLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyXG4gICAqL1xuICByZWFkb25seSBldmFsdWF0aW9uUGVyaW9kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIGNhbmFyeSBkZXBsb3ltZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uQ2FuYXJ5RGVwbG95bWVudE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHNoYXJlIG9mIHRyYWZmaWMsIGluIHdob2xlIHBlcmNlbnQgKDEtOTkpLCB0aGF0IHRoZSBuZXcgcmV2aXNpb24gZ2V0cyBmaXJzdC5cbiAgICovXG4gIHJlYWRvbmx5IHBlcmNlbnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IGxvbmcgdGhlIG5ldyByZXZpc2lvbiBzZXJ2ZXMgYHBlcmNlbnRgIGJlZm9yZSBpdCBnZXRzIGFsbCB0cmFmZmljICgxLTQ1IG1pbnV0ZXMpLlxuICAgKiBNYWtlIGl0IGxvbmdlciB0aGFuIHRoZSB0aW1lIHlvdXIgYWxhcm1zIG5lZWQgdG8gZmlyZSAocGVyaW9kIMOXIGV2YWx1YXRpb24gcGVyaW9kcykuXG4gICAqL1xuICByZWFkb25seSBiYWtlOiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQWxhcm1zIHRoYXQgc3RvcCB0aGUgZGVwbG95bWVudDogaWYgb25lIGlzIGluIEFMQVJNLCB0aGUgZW5kcG9pbnQgZ29lcyBiYWNrIHRvIHRoZSBwcmV2aW91c1xuICAgKiByZXZpc2lvbiBhbmQgdGhlIGRlcGxveW1lbnQgZmFpbHMsIHNvIENsb3VkRm9ybWF0aW9uIHJvbGxzIHRoZSBzdGFjayBiYWNrLlxuICAgKlxuICAgKiBUaGV5J3JlIGNoZWNrZWQgYmVmb3JlIHRyYWZmaWMgbW92ZXMsIGR1cmluZyB0aGUgYmFrZSwgYW5kIG9uY2UgdGhlIG5ldyByZXZpc2lvbiBoYXMgYWxsIHRyYWZmaWMuXG4gICAqIFVzZSBhbGFybXMgaW4gYW55IHJlZ2lvbiAoYnkgQVJOKSwgaW5jbHVkaW5nIGNvbXBvc2l0ZSBhbGFybXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWxhcm1zOiB0cmFmZmljIG1vdmVzIG9uIGEgdGltZXJcbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtcz86IGNsb3Vkd2F0Y2guSUFsYXJtW107XG5cbiAgLyoqXG4gICAqIEFsYXJtcyBvbiB0aGUgZW5kcG9pbnQncyBvd24gZXJyb3IgcmF0ZXMsIGNyZWF0ZWQgYnkgdGhlIGVuZHBvaW50IGluIGV2ZXJ5IHJlZ2lvbiBpdCBzZXJ2ZXMgZnJvbS5cbiAgICogVGhleSBzdG9wIHRoZSBkZXBsb3ltZW50IGxpa2UgYGFsYXJtc2AgKGJvdGggY2FuIGJlIHVzZWQgdG9nZXRoZXIpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGVuZHBvaW50IGFsYXJtc1xuICAgKi9cbiAgcmVhZG9ubHkgcm9sbGJhY2tPbj86IFdlYkZ1bmN0aW9uUm9sbGJhY2tPcHRpb25zO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgbGluZWFyIGRlcGxveW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViRnVuY3Rpb25MaW5lYXJEZXBsb3ltZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc2hhcmUgb2YgdHJhZmZpYywgaW4gd2hvbGUgcGVyY2VudCAoNS01MCksIHRoYXQgbW92ZXMgdG8gdGhlIG5ldyByZXZpc2lvbiBhdCBlYWNoIHN0ZXAuXG4gICAqL1xuICByZWFkb25seSBwZXJjZW50OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIGVhY2ggc3RlcCBzZXJ2ZXMgYmVmb3JlIHRoZSBuZXh0IG9uZSAoYXQgbGVhc3QgMSBtaW51dGUsIGFuZCBhdCBtb3N0IDQ1IG1pbnV0ZXMgaW4gdG90YWwpLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw6IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBBbGFybXMgdGhhdCBzdG9wIHRoZSBkZXBsb3ltZW50OiBpZiBvbmUgaXMgaW4gQUxBUk0sIHRoZSBlbmRwb2ludCBnb2VzIGJhY2sgdG8gdGhlIHByZXZpb3VzXG4gICAqIHJldmlzaW9uIGFuZCB0aGUgZGVwbG95bWVudCBmYWlscywgc28gQ2xvdWRGb3JtYXRpb24gcm9sbHMgdGhlIHN0YWNrIGJhY2suXG4gICAqXG4gICAqIFRoZXkncmUgY2hlY2tlZCBiZWZvcmUgdHJhZmZpYyBtb3ZlcywgZHVyaW5nIGV2ZXJ5IHN0ZXAsIGFuZCBvbmNlIHRoZSBuZXcgcmV2aXNpb24gaGFzIGFsbCB0cmFmZmljLlxuICAgKiBVc2UgYWxhcm1zIGluIGFueSByZWdpb24gKGJ5IEFSTiksIGluY2x1ZGluZyBjb21wb3NpdGUgYWxhcm1zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFsYXJtczogdHJhZmZpYyBtb3ZlcyBvbiBhIHRpbWVyXG4gICAqL1xuICByZWFkb25seSBhbGFybXM/OiBjbG91ZHdhdGNoLklBbGFybVtdO1xuXG4gIC8qKlxuICAgKiBBbGFybXMgb24gdGhlIGVuZHBvaW50J3Mgb3duIGVycm9yIHJhdGVzLCBjcmVhdGVkIGJ5IHRoZSBlbmRwb2ludCBpbiBldmVyeSByZWdpb24gaXQgc2VydmVzIGZyb20uXG4gICAqIFRoZXkgc3RvcCB0aGUgZGVwbG95bWVudCBsaWtlIGBhbGFybXNgIChib3RoIGNhbiBiZSB1c2VkIHRvZ2V0aGVyKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBlbmRwb2ludCBhbGFybXNcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxiYWNrT24/OiBXZWJGdW5jdGlvblJvbGxiYWNrT3B0aW9ucztcbn1cblxuLyoqXG4gKiBIb3cgYW4gZW5kcG9pbnQgbW92ZXMgaXRzIHRyYWZmaWMgdG8gYSBuZXcgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJGdW5jdGlvbkRlcGxveW1lbnQge1xuICAvKipcbiAgICogQWxsIHRyYWZmaWMgbW92ZXMgdG8gdGhlIG5ldyByZXZpc2lvbiBhdCBvbmNlLCBhcyBzb29uIGFzIGl0J3MgcmVhZHkgKHRoZSBkZWZhdWx0KS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYWxsQXRPbmNlKCk6IFdlYkZ1bmN0aW9uRGVwbG95bWVudCB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkRlcGxveW1lbnQoJ2FsbEF0T25jZScsIFsxMDBdLCAwLCBbXSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHJldmlzaW9uIGZpcnN0IGdldHMgYHBlcmNlbnRgIG9mIHRoZSB0cmFmZmljIGZvciBgYmFrZWAsIHRoZW4gYWxsIG9mIGl0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjYW5hcnkob3B0aW9uczogV2ViRnVuY3Rpb25DYW5hcnlEZXBsb3ltZW50T3B0aW9ucyk6IFdlYkZ1bmN0aW9uRGVwbG95bWVudCB7XG4gICAgY29uc3QgcGVyY2VudCA9IHdob2xlUGVyY2VudCgnY2FuYXJ5JywgJ3BlcmNlbnQnLCBvcHRpb25zLnBlcmNlbnQsIDEsIDk5KTtcbiAgICBjb25zdCBiYWtlID0gbWludXRlcygnY2FuYXJ5JywgJ2Jha2UnLCBvcHRpb25zLmJha2UsIE1BWF9UT1RBTF9XQUlUX01JTlVURVMpO1xuICAgIHJldHVybiBuZXcgV2ViRnVuY3Rpb25EZXBsb3ltZW50KCdjYW5hcnknLCBbcGVyY2VudCwgMTAwXSwgYmFrZS50b1NlY29uZHMoKSwgb3B0aW9ucy5hbGFybXMgPz8gW10sIHJvbGxiYWNrT24oJ2NhbmFyeScsIG9wdGlvbnMucm9sbGJhY2tPbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgcmV2aXNpb24gZ2V0cyBgcGVyY2VudGAgbW9yZSBvZiB0aGUgdHJhZmZpYyBldmVyeSBgaW50ZXJ2YWxgIHVudGlsIGl0IGhhcyBhbGwgb2YgaXQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxpbmVhcihvcHRpb25zOiBXZWJGdW5jdGlvbkxpbmVhckRlcGxveW1lbnRPcHRpb25zKTogV2ViRnVuY3Rpb25EZXBsb3ltZW50IHtcbiAgICBjb25zdCBwZXJjZW50ID0gd2hvbGVQZXJjZW50KCdsaW5lYXInLCAncGVyY2VudCcsIG9wdGlvbnMucGVyY2VudCwgMTAwIC8gTUFYX1NURVBTLCA1MCk7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBtaW51dGVzKCdsaW5lYXInLCAnaW50ZXJ2YWwnLCBvcHRpb25zLmludGVydmFsLCBNQVhfVE9UQUxfV0FJVF9NSU5VVEVTKTtcbiAgICBjb25zdCBzdGVwczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBwID0gcGVyY2VudDsgcCA8IDEwMDsgcCArPSBwZXJjZW50KSBzdGVwcy5wdXNoKHApO1xuICAgIHN0ZXBzLnB1c2goMTAwKTtcbiAgICBjb25zdCB0b3RhbCA9IGludGVydmFsLnRvU2Vjb25kcygpICogKHN0ZXBzLmxlbmd0aCAtIDEpO1xuICAgIGlmICh0b3RhbCA+IE1BWF9UT1RBTF9XQUlUX01JTlVURVMgKiA2MCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXZWJGdW5jdGlvbkRlcGxveW1lbnQubGluZWFyOiAke3N0ZXBzLmxlbmd0aCAtIDF9IGludGVydmFscyBvZiAke2ludGVydmFsLnRvSHVtYW5TdHJpbmcoKX0gdGFrZSAke3RvdGFsIC8gNjB9IG1pbnV0ZXM7IGF0IG1vc3QgJHtNQVhfVE9UQUxfV0FJVF9NSU5VVEVTfSBhcmUgYWxsb3dlZGApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uRGVwbG95bWVudCgnbGluZWFyJywgc3RlcHMsIGludGVydmFsLnRvU2Vjb25kcygpLCBvcHRpb25zLmFsYXJtcyA/PyBbXSwgcm9sbGJhY2tPbignbGluZWFyJywgb3B0aW9ucy5yb2xsYmFja09uKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5ldyByZXZpc2lvbidzIHNoYXJlIG9mIHRyYWZmaWMgYXQgZWFjaCBzdGVwLCBpbiBwZXJjZW50OyB0aGUgbGFzdCBpcyAxMDAuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IF9zdGVwczogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFNlY29uZHMgZWFjaCBzdGVwIHNlcnZlcyBiZWZvcmUgdGhlIG5leHQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IF93YWl0U2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIHJlYWRvbmx5IF9hbGFybXM6IGNsb3Vkd2F0Y2guSUFsYXJtW107XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgX2tpbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhyZXNob2xkcyBmb3IgdGhlIGFsYXJtcyB0aGUgZW5kcG9pbnQgY3JlYXRlcywgd2l0aCBkZWZhdWx0cyBhcHBsaWVkLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBfcm9sbGJhY2tPbj86IFJlc29sdmVkUm9sbGJhY2tPcHRpb25zO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAga2luZDogc3RyaW5nLCBzdGVwczogbnVtYmVyW10sIHdhaXRTZWNvbmRzOiBudW1iZXIsIGFsYXJtczogY2xvdWR3YXRjaC5JQWxhcm1bXSwgcm9sbGJhY2s6IFJlc29sdmVkUm9sbGJhY2tPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICB0aGlzLl9raW5kID0ga2luZDtcbiAgICB0aGlzLl9zdGVwcyA9IHN0ZXBzO1xuICAgIHRoaXMuX3dhaXRTZWNvbmRzID0gd2FpdFNlY29uZHM7XG4gICAgdGhpcy5fYWxhcm1zID0gYWxhcm1zO1xuICAgIHRoaXMuX3JvbGxiYWNrT24gPSByb2xsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRyYWZmaWMgbW92ZXMgaW4gc3RlcHMgKGNhbmFyeSBvciBsaW5lYXIpIHJhdGhlciB0aGFuIGFsbCBhdCBvbmNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBnZXQgX2dyYWR1YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0ZXBzLmxlbmd0aCA+IDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2hvbGVQZXJjZW50KGtpbmQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHZhbHVlKSB8fCAhTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgfHwgdmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFdlYkZ1bmN0aW9uRGVwbG95bWVudC4ke2tpbmR9OiAke25hbWV9IG11c3QgYmUgYSB3aG9sZSBudW1iZXIgZnJvbSAke01hdGguY2VpbChtaW4pfSB0byAke21heH0sIGdvdCAke3ZhbHVlfWApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gbWludXRlcyhraW5kOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgdmFsdWU6IER1cmF0aW9uLCBtYXhNaW51dGVzOiBudW1iZXIpOiBEdXJhdGlvbiB7XG4gIGNvbnN0IHNlY29uZHMgPSB2YWx1ZS50b1NlY29uZHMoKTtcbiAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChzZWNvbmRzKSB8fCBzZWNvbmRzIDwgNjAgfHwgc2Vjb25kcyA+IG1heE1pbnV0ZXMgKiA2MCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgV2ViRnVuY3Rpb25EZXBsb3ltZW50LiR7a2luZH06ICR7bmFtZX0gbXVzdCBiZSBmcm9tIDEgdG8gJHttYXhNaW51dGVzfSBtaW51dGVzLCBnb3QgJHtUb2tlbi5pc1VucmVzb2x2ZWQoc2Vjb25kcykgPyAnYSB0b2tlbicgOiB2YWx1ZS50b0h1bWFuU3RyaW5nKCl9YCk7XG4gIH1cbiAgcmV0dXJuIER1cmF0aW9uLnNlY29uZHMoc2Vjb25kcyk7XG59XG5cbmZ1bmN0aW9uIHJvbGxiYWNrT24oa2luZDogc3RyaW5nLCBvcHRpb25zOiBXZWJGdW5jdGlvblJvbGxiYWNrT3B0aW9ucyB8IHVuZGVmaW5lZCk6IFJlc29sdmVkUm9sbGJhY2tPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZmFpbCA9IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFdlYkZ1bmN0aW9uRGVwbG95bWVudC4ke2tpbmR9OiByb2xsYmFja09uLiR7bWVzc2FnZX1gKTtcbiAgfTtcbiAgaWYgKG9wdGlvbnMuc2VydmVyRXJyb3JSYXRlID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5jbGllbnRFcnJvclJhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgIGZhaWwoJ3NlcnZlckVycm9yUmF0ZSBvciByb2xsYmFja09uLmNsaWVudEVycm9yUmF0ZSBpcyByZXF1aXJlZCcpO1xuICB9XG4gIGZvciAoY29uc3QgW25hbWUsIHJhdGVdIG9mIFtbJ3NlcnZlckVycm9yUmF0ZScsIG9wdGlvbnMuc2VydmVyRXJyb3JSYXRlXSwgWydjbGllbnRFcnJvclJhdGUnLCBvcHRpb25zLmNsaWVudEVycm9yUmF0ZV1dIGFzIGNvbnN0KSB7XG4gICAgaWYgKHJhdGUgIT09IHVuZGVmaW5lZCAmJiAoVG9rZW4uaXNVbnJlc29sdmVkKHJhdGUpIHx8ICEocmF0ZSA+PSAwICYmIHJhdGUgPCAxMDApKSkgZmFpbChgJHtuYW1lfSBtdXN0IGJlIGEgcGVyY2VudGFnZSBmcm9tIDAgdG8gYmVsb3cgMTAwLCBnb3QgJHtyYXRlfWApO1xuICB9XG4gIGNvbnN0IG1pbmltdW1SZXF1ZXN0cyA9IG9wdGlvbnMubWluaW11bVJlcXVlc3RzID8/IDEwO1xuICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKG1pbmltdW1SZXF1ZXN0cykgfHwgIU51bWJlci5pc0ludGVnZXIobWluaW11bVJlcXVlc3RzKSB8fCBtaW5pbXVtUmVxdWVzdHMgPCAxKSB7XG4gICAgZmFpbChgbWluaW11bVJlcXVlc3RzIG11c3QgYmUgYSB3aG9sZSBudW1iZXIgZnJvbSAxLCBnb3QgJHttaW5pbXVtUmVxdWVzdHN9YCk7XG4gIH1cbiAgY29uc3QgcGVyaW9kID0gb3B0aW9ucy5wZXJpb2QgPz8gRHVyYXRpb24ubWludXRlcygxKTtcbiAgY29uc3Qgc2Vjb25kcyA9IHBlcmlvZC50b1NlY29uZHMoKTtcbiAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChzZWNvbmRzKSB8fCBzZWNvbmRzIDwgNjAgfHwgc2Vjb25kcyAlIDYwICE9PSAwKSB7XG4gICAgZmFpbChgcGVyaW9kIG11c3QgYmUgd2hvbGUgbWludXRlcywgYXQgbGVhc3QgMSwgZ290ICR7VG9rZW4uaXNVbnJlc29sdmVkKHNlY29uZHMpID8gJ2EgdG9rZW4nIDogcGVyaW9kLnRvSHVtYW5TdHJpbmcoKX1gKTtcbiAgfVxuICBjb25zdCBldmFsdWF0aW9uUGVyaW9kcyA9IG9wdGlvbnMuZXZhbHVhdGlvblBlcmlvZHMgPz8gMjtcbiAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChldmFsdWF0aW9uUGVyaW9kcykgfHwgIU51bWJlci5pc0ludGVnZXIoZXZhbHVhdGlvblBlcmlvZHMpIHx8IGV2YWx1YXRpb25QZXJpb2RzIDwgMSkge1xuICAgIGZhaWwoYGV2YWx1YXRpb25QZXJpb2RzIG11c3QgYmUgYSB3aG9sZSBudW1iZXIgZnJvbSAxLCBnb3QgJHtldmFsdWF0aW9uUGVyaW9kc31gKTtcbiAgfVxuICByZXR1cm4geyBzZXJ2ZXJFcnJvclJhdGU6IG9wdGlvbnMuc2VydmVyRXJyb3JSYXRlLCBjbGllbnRFcnJvclJhdGU6IG9wdGlvbnMuY2xpZW50RXJyb3JSYXRlLCBtaW5pbXVtUmVxdWVzdHMsIHBlcmlvZCwgZXZhbHVhdGlvblBlcmlvZHMgfTtcbn1cbiJdfQ==
@@ -1,3 +1,4 @@
1
+ import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
1
2
  import * as iam from 'aws-cdk-lib/aws-iam';
2
3
  import { Construct } from 'constructs';
3
4
  import { WebFunctionAuthType, WebFunctionEndpointType } from './enums';
@@ -151,6 +152,11 @@ export declare class WebFunctionEndpoint extends Construct {
151
152
  readonly url: string;
152
153
  /** Grants on this endpoint (e.g. `grants.invoke(principal)`). */
153
154
  readonly grants: WebFunctionGrants;
155
+ /**
156
+ * The alarms this endpoint created for its deployment's `rollbackOn`, one per threshold in every region it serves from
157
+ * (the home region's first). Empty without `rollbackOn`.
158
+ */
159
+ readonly rollbackAlarms: cloudwatch.IAlarm[];
154
160
  private readonly homeRegion;
155
161
  private readonly webFunction;
156
162
  private readonly resource;
@@ -181,10 +187,50 @@ export declare class WebFunctionEndpoint extends Construct {
181
187
  * @internal
182
188
  */
183
189
  _revisionIds(): string[];
190
+ /**
191
+ * A metric of this endpoint in `AWS/Lambda/Web` (dimensions `FunctionName` and `EndpointName`).
192
+ *
193
+ * Metrics are published in the region that served the request: pass `region` for one of the endpoint's
194
+ * other regions. An alarm can only use metrics from its own stack's region.
195
+ *
196
+ * @default - sum over 1 minute, in the home region
197
+ */
198
+ metric(metricName: string, props?: cloudwatch.MetricOptions): cloudwatch.Metric;
199
+ /** Requests the endpoint served (`ExecutedRequests`). There's no separate count of successful (2XX) responses. */
200
+ metricRequests(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
201
+ /**
202
+ * Requests answered with a 4XX status (`HTTPResponseStatusClass4XX`), including 429s from `rateLimit` and `maxEnvironments`.
203
+ * The metric only exists once it's non-zero, so alarms should treat missing data as not breaching.
204
+ */
205
+ metricClientErrors(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
206
+ /**
207
+ * Requests answered with a 5XX status (`HTTPResponseStatusClass5XX`). Includes the platform's 503s while the endpoint
208
+ * scales up for a sudden burst, not only your application's errors. The metric only exists once it's non-zero.
209
+ */
210
+ metricServerErrors(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
211
+ /** The percentage of requests answered with a 4XX status (math expression; periods with no 4XX count as 0). */
212
+ metricClientErrorRate(props?: cloudwatch.MetricOptions): cloudwatch.MathExpression;
213
+ /** The percentage of requests answered with a 5XX status (math expression; periods with no 5XX count as 0). */
214
+ metricServerErrorRate(props?: cloudwatch.MetricOptions): cloudwatch.MathExpression;
215
+ /**
216
+ * Execution environments serving the endpoint (`EndpointActiveEnvironments`), to compare with `maxEnvironments`.
217
+ *
218
+ * @default - maximum over 1 minute, in the home region
219
+ */
220
+ metricActiveEnvironments(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
221
+ /** Requests rejected with 429 because the endpoint reached its `rateLimit` (`EndpointRequestThrottles`). */
222
+ metricRequestThrottles(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
223
+ /** Requests rejected with 429 because the endpoint reached `maxEnvironments` (`EndpointActiveEnvironmentThrottles`). */
224
+ metricEnvironmentThrottles(props?: cloudwatch.MetricOptions): cloudwatch.Metric;
184
225
  /**
185
226
  * Allows `grantee` to call this endpoint. Shortcut for `grants.invoke(grantee)`.
186
227
  * [disable-awslint:no-grants]
187
228
  */
188
229
  grantInvoke(grantee: iam.IGrantable): iam.Grant;
230
+ private metricIds;
231
+ private rate;
232
+ private usageMetric;
233
+ /** One alarm per threshold in every serving region: a CloudFormation alarm at home, a custom resource elsewhere. Returns their ARNs. */
234
+ private createRollbackAlarms;
189
235
  }
190
236
  export {};