@liflig/cdk 2.6.1 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/alarms/database-alarms.d.ts +125 -0
- package/lib/alarms/database-alarms.js +175 -0
- package/lib/alarms/index.d.ts +1 -0
- package/lib/alarms/index.js +4 -2
- package/lib/alarms/service-alarms.d.ts +111 -6
- package/lib/alarms/service-alarms.js +74 -24
- package/lib/cdk-deploy/cdk-deploy.js +5 -5
- package/lib/cdk-pipelines/liflig-cdk-pipeline.js +2 -2
- package/lib/ecs-update-image/ecs-update-image.js +3 -3
- package/lib/pipelines/pipeline.js +3 -3
- package/lib/rds/database.d.ts +3 -0
- package/lib/rds/database.js +4 -1
- package/lib/ses/configurationsetsnsdestination/index.js +2 -2
- package/lib/ses/sesdomain/index.js +2 -2
- package/lib/ses/sesverifyemail/index.js +2 -2
- package/package.json +11 -11
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import * as constructs from "constructs";
|
|
2
|
+
import * as cdk from "aws-cdk-lib";
|
|
3
|
+
import * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
|
|
4
|
+
import * as ec2 from "aws-cdk-lib/aws-ec2";
|
|
5
|
+
export interface DatabaseAlarmsProps {
|
|
6
|
+
/**
|
|
7
|
+
* The default action to use for CloudWatch alarm state changes
|
|
8
|
+
*/
|
|
9
|
+
action: cloudwatch.IAlarmAction;
|
|
10
|
+
instanceIdentifier: string;
|
|
11
|
+
instanceType: ec2.InstanceType;
|
|
12
|
+
allocatedStorage: cdk.Size;
|
|
13
|
+
}
|
|
14
|
+
export declare class DatabaseAlarms extends constructs.Construct {
|
|
15
|
+
private readonly action;
|
|
16
|
+
private readonly databaseInstanceIdentifier;
|
|
17
|
+
private readonly instanceType;
|
|
18
|
+
private readonly allocatedStorage;
|
|
19
|
+
constructor(scope: constructs.Construct, id: string, props: DatabaseAlarmsProps);
|
|
20
|
+
/**
|
|
21
|
+
* Sets up a CloudWatch Alarm that triggers if the CPU credit balance for
|
|
22
|
+
* a burstable instance breach a certain threshold.
|
|
23
|
+
*
|
|
24
|
+
* NOTE: This alarm is only applicable for burstable instances, and a balance of 0 credits will only have performance
|
|
25
|
+
* implications for T2 instances. T3 and T4g instances will instead cost more for prolonged high CPU utilization after
|
|
26
|
+
* the balance is depleted.
|
|
27
|
+
*/
|
|
28
|
+
addCpuCreditsAlarm(
|
|
29
|
+
/**
|
|
30
|
+
* Configuration for an alarm.
|
|
31
|
+
*
|
|
32
|
+
* @default Configured with sane defaults.
|
|
33
|
+
*/
|
|
34
|
+
props?: {
|
|
35
|
+
/**
|
|
36
|
+
* An action to use for CloudWatch alarm state changes instead of the default action
|
|
37
|
+
*/
|
|
38
|
+
action?: cloudwatch.IAlarmAction;
|
|
39
|
+
/**
|
|
40
|
+
* The CloudWatch Alarm will change its state to ALARM if the number of CPU credits drops below this threshold.
|
|
41
|
+
*
|
|
42
|
+
* See https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-credits-baseline-concepts.html#earning-CPU-credits for an overview of maximum CPU credits for various instance types.
|
|
43
|
+
*
|
|
44
|
+
* @default 10% of the maximum earned CPU credits for the instance type.
|
|
45
|
+
*/
|
|
46
|
+
threshold?: number;
|
|
47
|
+
}): void;
|
|
48
|
+
/**
|
|
49
|
+
* Sets up two CloudWatch Alarms for monitoring disk storage space:
|
|
50
|
+
* 1) one that triggers if the available disk storage space is low.
|
|
51
|
+
* 2) one that triggers if the available disk storage space is critcally low.
|
|
52
|
+
*
|
|
53
|
+
* You may want to use different alarm actions for the two alarms, e.g., one can be
|
|
54
|
+
* categorized as a "warning", while the other one can be considered an "alarm".
|
|
55
|
+
*/
|
|
56
|
+
addStorageSpaceAlarms(props?: {
|
|
57
|
+
/**
|
|
58
|
+
* Configuration for an alarm.
|
|
59
|
+
*
|
|
60
|
+
* @default Configured with sane defaults.
|
|
61
|
+
*/
|
|
62
|
+
lowStorageSpaceAlarm?: {
|
|
63
|
+
/**
|
|
64
|
+
* @default true
|
|
65
|
+
*/
|
|
66
|
+
enabled?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* An action to use for CloudWatch alarm state changes instead of the default action
|
|
69
|
+
*/
|
|
70
|
+
action?: cloudwatch.IAlarmAction;
|
|
71
|
+
/**
|
|
72
|
+
* @default 25% of the allocated storage.
|
|
73
|
+
*/
|
|
74
|
+
threshold?: cdk.Size;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Configuration for an alarm.
|
|
78
|
+
*
|
|
79
|
+
* @default Configured with sane defaults.
|
|
80
|
+
*/
|
|
81
|
+
criticallyLowStorageSpaceAlarm?: {
|
|
82
|
+
/**
|
|
83
|
+
* @default true
|
|
84
|
+
*/
|
|
85
|
+
enabled?: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* An action to use for CloudWatch alarm state changes instead of the default action
|
|
88
|
+
*/
|
|
89
|
+
action?: cloudwatch.IAlarmAction;
|
|
90
|
+
/**
|
|
91
|
+
* @default 5% of the allocated storage.
|
|
92
|
+
*/
|
|
93
|
+
threshold?: cdk.Size;
|
|
94
|
+
};
|
|
95
|
+
}): void;
|
|
96
|
+
/**
|
|
97
|
+
* Sets up a CloudWatch Alarm that triggers if the average CPU utilization for
|
|
98
|
+
* the RDS instance exceeds a given threshold.
|
|
99
|
+
*/
|
|
100
|
+
addCpuUtilizationAlarm(
|
|
101
|
+
/**
|
|
102
|
+
* Configuration for an alarm.
|
|
103
|
+
*
|
|
104
|
+
* @default Configured with sane defaults.
|
|
105
|
+
*/
|
|
106
|
+
props?: {
|
|
107
|
+
/**
|
|
108
|
+
* An action to use for CloudWatch alarm state changes instead of the default action
|
|
109
|
+
*/
|
|
110
|
+
action?: cloudwatch.IAlarmAction;
|
|
111
|
+
/**
|
|
112
|
+
* The threshold defined as a percentage that determines if CPU utilization should trigger an alarm or not.
|
|
113
|
+
* @default 80
|
|
114
|
+
*/
|
|
115
|
+
threshold?: number;
|
|
116
|
+
/**
|
|
117
|
+
* @default 5
|
|
118
|
+
*/
|
|
119
|
+
evaluationPeriods?: number;
|
|
120
|
+
/**
|
|
121
|
+
* @default 2 minutes
|
|
122
|
+
*/
|
|
123
|
+
period?: cdk.Duration;
|
|
124
|
+
}): void;
|
|
125
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DatabaseAlarms = void 0;
|
|
4
|
+
const constructs = require("constructs");
|
|
5
|
+
const cdk = require("aws-cdk-lib");
|
|
6
|
+
const cloudwatch = require("aws-cdk-lib/aws-cloudwatch");
|
|
7
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
8
|
+
// Based on https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-credits-baseline-concepts.html#earning-CPU-credits
|
|
9
|
+
const cpuCreditBalanceByInstanceType = {
|
|
10
|
+
"t2.nano": 72,
|
|
11
|
+
"t2.micro": 144,
|
|
12
|
+
"t2.small": 288,
|
|
13
|
+
"t2.medium": 576,
|
|
14
|
+
"t2.large": 864,
|
|
15
|
+
"t2.xlarge": 1296,
|
|
16
|
+
"t2.2xlarge": 1958.4,
|
|
17
|
+
"t3.nano": 144,
|
|
18
|
+
"t3.micro": 288,
|
|
19
|
+
"t3.small": 576,
|
|
20
|
+
"t3.medium": 576,
|
|
21
|
+
"t3.large": 864,
|
|
22
|
+
"t3.xlarge": 2304,
|
|
23
|
+
"t3.2xlarge": 4608,
|
|
24
|
+
"t3a.nano": 144,
|
|
25
|
+
"t3a.micro": 288,
|
|
26
|
+
"t3a.small": 576,
|
|
27
|
+
"t3a.medium": 576,
|
|
28
|
+
"t3a.large": 864,
|
|
29
|
+
"t3a.xlarge": 2304,
|
|
30
|
+
"t3a.2xlarge": 4608,
|
|
31
|
+
"t4g.nano": 144,
|
|
32
|
+
"t4g.micro": 288,
|
|
33
|
+
"t4g.small": 576,
|
|
34
|
+
"t4g.medium": 576,
|
|
35
|
+
"t4g.large": 864,
|
|
36
|
+
"t4g.xlarge": 2304,
|
|
37
|
+
"t4g.2xlarge": 4608,
|
|
38
|
+
};
|
|
39
|
+
class DatabaseAlarms extends constructs.Construct {
|
|
40
|
+
constructor(scope, id, props) {
|
|
41
|
+
super(scope, id);
|
|
42
|
+
this.action = props.action;
|
|
43
|
+
this.databaseInstanceIdentifier = props.instanceIdentifier;
|
|
44
|
+
this.instanceType = props.instanceType;
|
|
45
|
+
this.allocatedStorage = props.allocatedStorage;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Sets up a CloudWatch Alarm that triggers if the CPU credit balance for
|
|
49
|
+
* a burstable instance breach a certain threshold.
|
|
50
|
+
*
|
|
51
|
+
* NOTE: This alarm is only applicable for burstable instances, and a balance of 0 credits will only have performance
|
|
52
|
+
* implications for T2 instances. T3 and T4g instances will instead cost more for prolonged high CPU utilization after
|
|
53
|
+
* the balance is depleted.
|
|
54
|
+
*/
|
|
55
|
+
addCpuCreditsAlarm(
|
|
56
|
+
/**
|
|
57
|
+
* Configuration for an alarm.
|
|
58
|
+
*
|
|
59
|
+
* @default Configured with sane defaults.
|
|
60
|
+
*/
|
|
61
|
+
props) {
|
|
62
|
+
var _a;
|
|
63
|
+
if (!["t2.", "t3.", "t4g."].some((s) => this.instanceType.toString().startsWith(s))) {
|
|
64
|
+
throw new Error("CPU credits are only relevant for burstable instance types.");
|
|
65
|
+
}
|
|
66
|
+
const defaultThreshold = cpuCreditBalanceByInstanceType[this.instanceType.toString()] * 0.1;
|
|
67
|
+
const threshold = (_a = props === null || props === void 0 ? void 0 : props.threshold) !== null && _a !== void 0 ? _a : defaultThreshold;
|
|
68
|
+
if (!threshold) {
|
|
69
|
+
throw new Error(`No threshold supplied, and unable to determine a default value for instance type '${this.instanceType.toString()}'`);
|
|
70
|
+
}
|
|
71
|
+
new cloudwatch.Metric({
|
|
72
|
+
metricName: "CPUCreditBalance",
|
|
73
|
+
namespace: "AWS/RDS",
|
|
74
|
+
statistic: "Minimum",
|
|
75
|
+
unit: aws_cloudwatch_1.Unit.COUNT,
|
|
76
|
+
period: cdk.Duration.minutes(5),
|
|
77
|
+
dimensionsMap: {
|
|
78
|
+
DBInstanceIdentifier: this.databaseInstanceIdentifier,
|
|
79
|
+
},
|
|
80
|
+
})
|
|
81
|
+
.createAlarm(this, "CreditsAlarm", {
|
|
82
|
+
alarmDescription: `Less than ${threshold} CPU credits remaining for RDS database '${this.databaseInstanceIdentifier}'. ${this.instanceType.toString().startsWith("t2.")
|
|
83
|
+
? "If this reaches 0, the instance will be limited to a baseline CPU utilization."
|
|
84
|
+
: "If the balance is depleted, AWS adds additional charges."}.`,
|
|
85
|
+
comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,
|
|
86
|
+
evaluationPeriods: 1,
|
|
87
|
+
threshold: threshold,
|
|
88
|
+
treatMissingData: cloudwatch.TreatMissingData.IGNORE,
|
|
89
|
+
})
|
|
90
|
+
.addAlarmAction(this.action);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Sets up two CloudWatch Alarms for monitoring disk storage space:
|
|
94
|
+
* 1) one that triggers if the available disk storage space is low.
|
|
95
|
+
* 2) one that triggers if the available disk storage space is critcally low.
|
|
96
|
+
*
|
|
97
|
+
* You may want to use different alarm actions for the two alarms, e.g., one can be
|
|
98
|
+
* categorized as a "warning", while the other one can be considered an "alarm".
|
|
99
|
+
*/
|
|
100
|
+
addStorageSpaceAlarms(props) {
|
|
101
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
102
|
+
const lowStorageSpaceAlarm = new cloudwatch.Metric({
|
|
103
|
+
metricName: "FreeStorageSpace",
|
|
104
|
+
namespace: "AWS/RDS",
|
|
105
|
+
statistic: "Minimum",
|
|
106
|
+
unit: aws_cloudwatch_1.Unit.GIGABYTES,
|
|
107
|
+
period: cdk.Duration.minutes(5),
|
|
108
|
+
dimensionsMap: {
|
|
109
|
+
DBInstanceIdentifier: this.databaseInstanceIdentifier,
|
|
110
|
+
},
|
|
111
|
+
}).createAlarm(this, "LowStorageSpaceAlarm", {
|
|
112
|
+
alarmDescription: `Low storage space available on RDS database '${this.databaseInstanceIdentifier}'.`,
|
|
113
|
+
comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,
|
|
114
|
+
evaluationPeriods: 1,
|
|
115
|
+
threshold: (_c = (_b = (_a = props === null || props === void 0 ? void 0 : props.lowStorageSpaceAlarm) === null || _a === void 0 ? void 0 : _a.threshold) === null || _b === void 0 ? void 0 : _b.toGibibytes()) !== null && _c !== void 0 ? _c : this.allocatedStorage.toGibibytes() * 0.25,
|
|
116
|
+
treatMissingData: cloudwatch.TreatMissingData.IGNORE,
|
|
117
|
+
});
|
|
118
|
+
if ((_e = (_d = props === null || props === void 0 ? void 0 : props.lowStorageSpaceAlarm) === null || _d === void 0 ? void 0 : _d.enabled) !== null && _e !== void 0 ? _e : true) {
|
|
119
|
+
lowStorageSpaceAlarm.addAlarmAction(((_f = props === null || props === void 0 ? void 0 : props.lowStorageSpaceAlarm) === null || _f === void 0 ? void 0 : _f.action) || this.action);
|
|
120
|
+
lowStorageSpaceAlarm.addOkAction(((_g = props === null || props === void 0 ? void 0 : props.lowStorageSpaceAlarm) === null || _g === void 0 ? void 0 : _g.action) || this.action);
|
|
121
|
+
}
|
|
122
|
+
const criticallyLowStorageSpaceAlarm = new cloudwatch.Metric({
|
|
123
|
+
metricName: "FreeStorageSpace",
|
|
124
|
+
namespace: "AWS/RDS",
|
|
125
|
+
statistic: "Minimum",
|
|
126
|
+
unit: aws_cloudwatch_1.Unit.GIGABYTES,
|
|
127
|
+
period: cdk.Duration.minutes(5),
|
|
128
|
+
dimensionsMap: {
|
|
129
|
+
DBInstanceIdentifier: this.databaseInstanceIdentifier,
|
|
130
|
+
},
|
|
131
|
+
}).createAlarm(this, "CriticallyLowStorageSpaceAlarm", {
|
|
132
|
+
alarmDescription: `Critically low storage space available on RDS database '${this.databaseInstanceIdentifier}'.`,
|
|
133
|
+
comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,
|
|
134
|
+
evaluationPeriods: 1,
|
|
135
|
+
threshold: (_k = (_j = (_h = props === null || props === void 0 ? void 0 : props.criticallyLowStorageSpaceAlarm) === null || _h === void 0 ? void 0 : _h.threshold) === null || _j === void 0 ? void 0 : _j.toGibibytes()) !== null && _k !== void 0 ? _k : this.allocatedStorage.toGibibytes() * 0.05,
|
|
136
|
+
treatMissingData: cloudwatch.TreatMissingData.IGNORE,
|
|
137
|
+
});
|
|
138
|
+
if ((_m = (_l = props === null || props === void 0 ? void 0 : props.criticallyLowStorageSpaceAlarm) === null || _l === void 0 ? void 0 : _l.enabled) !== null && _m !== void 0 ? _m : true) {
|
|
139
|
+
criticallyLowStorageSpaceAlarm.addAlarmAction(((_o = props === null || props === void 0 ? void 0 : props.criticallyLowStorageSpaceAlarm) === null || _o === void 0 ? void 0 : _o.action) || this.action);
|
|
140
|
+
criticallyLowStorageSpaceAlarm.addOkAction(((_p = props === null || props === void 0 ? void 0 : props.criticallyLowStorageSpaceAlarm) === null || _p === void 0 ? void 0 : _p.action) || this.action);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Sets up a CloudWatch Alarm that triggers if the average CPU utilization for
|
|
145
|
+
* the RDS instance exceeds a given threshold.
|
|
146
|
+
*/
|
|
147
|
+
addCpuUtilizationAlarm(
|
|
148
|
+
/**
|
|
149
|
+
* Configuration for an alarm.
|
|
150
|
+
*
|
|
151
|
+
* @default Configured with sane defaults.
|
|
152
|
+
*/
|
|
153
|
+
props) {
|
|
154
|
+
var _a, _b, _c, _d, _e;
|
|
155
|
+
const alarm = new cloudwatch.Metric({
|
|
156
|
+
metricName: "CPUUtilization",
|
|
157
|
+
namespace: "AWS/RDS",
|
|
158
|
+
statistic: "Average",
|
|
159
|
+
period: (_a = props === null || props === void 0 ? void 0 : props.period) !== null && _a !== void 0 ? _a : cdk.Duration.minutes(2),
|
|
160
|
+
dimensionsMap: {
|
|
161
|
+
DBInstanceIdentifier: this.databaseInstanceIdentifier,
|
|
162
|
+
},
|
|
163
|
+
}).createAlarm(this, "CpuUtilizationAlarm", {
|
|
164
|
+
alarmDescription: `RDS database '${this.databaseInstanceIdentifier}' has a higher than expected CPU utilization.`,
|
|
165
|
+
comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
|
|
166
|
+
evaluationPeriods: (_b = props === null || props === void 0 ? void 0 : props.evaluationPeriods) !== null && _b !== void 0 ? _b : 5,
|
|
167
|
+
threshold: (_c = props === null || props === void 0 ? void 0 : props.threshold) !== null && _c !== void 0 ? _c : 80,
|
|
168
|
+
treatMissingData: cloudwatch.TreatMissingData.IGNORE,
|
|
169
|
+
});
|
|
170
|
+
alarm.addAlarmAction((_d = props === null || props === void 0 ? void 0 : props.action) !== null && _d !== void 0 ? _d : this.action);
|
|
171
|
+
alarm.addOkAction((_e = props === null || props === void 0 ? void 0 : props.action) !== null && _e !== void 0 ? _e : this.action);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.DatabaseAlarms = DatabaseAlarms;
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UtYWxhcm1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FsYXJtcy9kYXRhYmFzZS1hbGFybXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBQ3hDLG1DQUFrQztBQUNsQyx5REFBd0Q7QUFFeEQsK0RBQWlEO0FBWWpELDRIQUE0SDtBQUM1SCxNQUFNLDhCQUE4QixHQUVoQztJQUNGLFNBQVMsRUFBRSxFQUFFO0lBQ2IsVUFBVSxFQUFFLEdBQUc7SUFDZixVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLElBQUk7SUFDakIsWUFBWSxFQUFFLE1BQU07SUFDcEIsU0FBUyxFQUFFLEdBQUc7SUFDZCxVQUFVLEVBQUUsR0FBRztJQUNmLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEdBQUc7SUFDaEIsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixZQUFZLEVBQUUsSUFBSTtJQUNsQixVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFlBQVksRUFBRSxHQUFHO0lBQ2pCLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFlBQVksRUFBRSxJQUFJO0lBQ2xCLGFBQWEsRUFBRSxJQUFJO0lBQ25CLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEdBQUc7SUFDaEIsV0FBVyxFQUFFLEdBQUc7SUFDaEIsWUFBWSxFQUFFLEdBQUc7SUFDakIsV0FBVyxFQUFFLEdBQUc7SUFDaEIsWUFBWSxFQUFFLElBQUk7SUFDbEIsYUFBYSxFQUFFLElBQUk7Q0FDcEIsQ0FBQTtBQUVELE1BQWEsY0FBZSxTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBTXRELFlBQ0UsS0FBMkIsRUFDM0IsRUFBVSxFQUNWLEtBQTBCO1FBRTFCLEtBQUssQ0FBQyxL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LENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNoRCxhQUFhLEVBQUU7Z0JBQ2Isb0JBQW9CLEVBQUUsSUFBSSxDQUFDLDBCQUEwQjthQUN0RDtTQUNGLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQzFDLGdCQUFnQixFQUFFLGlCQUFpQixJQUFJLENBQUMsMEJBQTBCLCtDQUErQztZQUNqSCxrQkFBa0IsRUFBRSxVQUFVLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCO1lBQ3hFLGlCQUFpQixFQUFFLE1BQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLGlCQUFpQixtQ0FBSSxDQUFDO1lBQ2hELFNBQVMsRUFBRSxNQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxTQUFTLG1DQUFJLEVBQUU7WUFDakMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE1BQU07U0FDckQsQ0FBQyxDQUFBO1FBQ0YsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxNQUFNLG1DQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNsRCxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLE1BQU0sbUNBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ2pELENBQUM7Q0FDRjtBQW5QRCx3Q0FtUEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0ICogYXMgY2xvdWR3YXRjaCBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIlxuaW1wb3J0ICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCJcbmltcG9ydCB7IFVuaXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIlxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlQWxhcm1zUHJvcHMge1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgYWN0aW9uIHRvIHVzZSBmb3IgQ2xvdWRXYXRjaCBhbGFybSBzdGF0ZSBjaGFuZ2VzXG4gICAqL1xuICBhY3Rpb246IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uXG4gIGluc3RhbmNlSWRlbnRpZmllcjogc3RyaW5nXG4gIGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZVxuICBhbGxvY2F0ZWRTdG9yYWdlOiBjZGsuU2l6ZVxufVxuXG4vLyBCYXNlZCBvbiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvYnVyc3RhYmxlLWNyZWRpdHMtYmFzZWxpbmUtY29uY2VwdHMuaHRtbCNlYXJuaW5nLUNQVS1jcmVkaXRzXG5jb25zdCBjcHVDcmVkaXRCYWxhbmNlQnlJbnN0YW5jZVR5cGU6IHtcbiAgW2luc3RhbmNlVHlwZTogc3RyaW5nXTogbnVtYmVyXG59ID0ge1xuICBcInQyLm5hbm9cIjogNzIsXG4gIFwidDIubWljcm9cIjogMTQ0LFxuICBcInQyLnNtYWxsXCI6IDI4OCxcbiAgXCJ0Mi5tZWRpdW1cIjogNTc2LFxuICBcInQyLmxhcmdlXCI6IDg2NCxcbiAgXCJ0Mi54bGFyZ2VcIjogMTI5NixcbiAgXCJ0Mi4yeGxhcmdlXCI6IDE5NTguNCxcbiAgXCJ0My5uYW5vXCI6IDE0NCxcbiAgXCJ0My5taWNyb1wiOiAyODgsXG4gIFwidDMuc21hbGxcIjogNTc2LFxuICBcInQzLm1lZGl1bVwiOiA1NzYsXG4gIFwidDMubGFyZ2VcIjogODY0LFxuICBcInQzLnhsYXJnZVwiOiAyMzA0LFxuICBcInQzLjJ4bGFyZ2VcIjogNDYwOCxcbiAgXCJ0M2EubmFub1wiOiAxNDQsXG4gIFwidDNhLm1pY3JvXCI6IDI4OCxcbiAgXCJ0M2Euc21hbGxcIjogNTc2LFxuICBcInQzYS5tZWRpdW1cIjogNTc2LFxuICBcInQzYS5sYXJnZVwiOiA4NjQsXG4gIFwidDNhLnhsYXJnZVwiOiAyMzA0LFxuICBcInQzYS4yeGxhcmdlXCI6IDQ2MDgsXG4gIFwidDRnLm5hbm9cIjogMTQ0LFxuICBcInQ0Zy5taWNyb1wiOiAyODgsXG4gIFwidDRnLnNtYWxsXCI6IDU3NixcbiAgXCJ0NGcubWVkaXVtXCI6IDU3NixcbiAgXCJ0NGcubGFyZ2VcIjogODY0LFxuICBcInQ0Zy54bGFyZ2VcIjogMjMwNCxcbiAgXCJ0NGcuMnhsYXJnZVwiOiA0NjA4LFxufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2VBbGFybXMgZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aW9uOiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFiYXNlSW5zdGFuY2VJZGVudGlmaWVyOiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZVR5cGU6IGVjMi5JbnN0YW5jZVR5cGVcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvY2F0ZWRTdG9yYWdlOiBjZGsuU2l6ZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBEYXRhYmFzZUFsYXJtc1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmFjdGlvbiA9IHByb3BzLmFjdGlvblxuICAgIHRoaXMuZGF0YWJhc2VJbnN0YW5jZUlkZW50aWZpZXIgPSBwcm9wcy5pbnN0YW5jZUlkZW50aWZpZXJcbiAgICB0aGlzLmluc3RhbmNlVHlwZSA9IHByb3BzLmluc3RhbmNlVHlwZVxuICAgIHRoaXMuYWxsb2NhdGVkU3RvcmFnZSA9IHByb3BzLmFsbG9jYXRlZFN0b3JhZ2VcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIGEgQ2xvdWRXYXRjaCBBbGFybSB0aGF0IHRyaWdnZXJzIGlmIHRoZSBDUFUgY3JlZGl0IGJhbGFuY2UgZm9yXG4gICAqIGEgYnVyc3RhYmxlIGluc3RhbmNlIGJyZWFjaCBhIGNlcnRhaW4gdGhyZXNob2xkLlxuICAgKlxuICAgKiBOT1RFOiBUaGlzIGFsYXJtIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgYnVyc3RhYmxlIGluc3RhbmNlcywgYW5kIGEgYmFsYW5jZSBvZiAwIGNyZWRpdHMgd2lsbCBvbmx5IGhhdmUgcGVyZm9ybWFuY2VcbiAgICogaW1wbGljYXRpb25zIGZvciBUMiBpbnN0YW5jZXMuIFQzIGFuZCBUNGcgaW5zdGFuY2VzIHdpbGwgaW5zdGVhZCBjb3N0IG1vcmUgZm9yIHByb2xvbmdlZCBoaWdoIENQVSB1dGlsaXphdGlvbiBhZnRlclxuICAgKiB0aGUgYmFsYW5jZSBpcyBkZXBsZXRlZC5cbiAgICovXG4gIGFkZENwdUNyZWRpdHNBbGFybShcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIGZvciBhbiBhbGFybS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IENvbmZpZ3VyZWQgd2l0aCBzYW5lIGRlZmF1bHRzLlxuICAgICAqL1xuICAgIHByb3BzPzoge1xuICAgICAgLyoqXG4gICAgICAgKiBBbiBhY3Rpb24gdG8gdXNlIGZvciBDbG91ZFdhdGNoIGFsYXJtIHN0YXRlIGNoYW5nZXMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBhY3Rpb25cbiAgICAgICAqL1xuICAgICAgYWN0aW9uPzogY2xvdWR3YXRjaC5JQWxhcm1BY3Rpb25cbiAgICAgIC8qKlxuICAgICAgICogVGhlIENsb3VkV2F0Y2ggQWxhcm0gd2lsbCBjaGFuZ2UgaXRzIHN0YXRlIHRvIEFMQVJNIGlmIHRoZSBudW1iZXIgb2YgQ1BVIGNyZWRpdHMgZHJvcHMgYmVsb3cgdGhpcyB0aHJlc2hvbGQuXG4gICAgICAgKlxuICAgICAgICogU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9idXJzdGFibGUtY3JlZGl0cy1iYXNlbGluZS1jb25jZXB0cy5odG1sI2Vhcm5pbmctQ1BVLWNyZWRpdHMgZm9yIGFuIG92ZXJ2aWV3IG9mIG1heGltdW0gQ1BVIGNyZWRpdHMgZm9yIHZhcmlvdXMgaW5zdGFuY2UgdHlwZXMuXG4gICAgICAgKlxuICAgICAgICogQGRlZmF1bHQgMTAlIG9mIHRoZSBtYXhpbXVtIGVhcm5lZCBDUFUgY3JlZGl0cyBmb3IgdGhlIGluc3RhbmNlIHR5cGUuXG4gICAgICAgKi9cbiAgICAgIHRocmVzaG9sZD86IG51bWJlclxuICAgIH0sXG4gICk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICFbXCJ0Mi5cIiwgXCJ0My5cIiwgXCJ0NGcuXCJdLnNvbWUoKHMpID0+XG4gICAgICAgIHRoaXMuaW5zdGFuY2VUeXBlLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChzKSxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDUFUgY3JlZGl0cyBhcmUgb25seSByZWxldmFudCBmb3IgYnVyc3RhYmxlIGluc3RhbmNlIHR5cGVzLlwiLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRUaHJlc2hvbGQgPVxuICAgICAgY3B1Q3JlZGl0QmFsYW5jZUJ5SW5zdGFuY2VUeXBlW3RoaXMuaW5zdGFuY2VUeXBlLnRvU3RyaW5nKCldICogMC4xXG4gICAgY29uc3QgdGhyZXNob2xkID0gcHJvcHM/LnRocmVzaG9sZCA/PyBkZWZhdWx0VGhyZXNob2xkXG4gICAgaWYgKCF0aHJlc2hvbGQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vIHRocmVzaG9sZCBzdXBwbGllZCwgYW5kIHVuYWJsZSB0byBkZXRlcm1pbmUgYSBkZWZhdWx0IHZhbHVlIGZvciBpbnN0YW5jZSB0eXBlICcke3RoaXMuaW5zdGFuY2VUeXBlLnRvU3RyaW5nKCl9J2AsXG4gICAgICApXG4gICAgfVxuICAgIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiBcIkNQVUNyZWRpdEJhbGFuY2VcIixcbiAgICAgIG5hbWVzcGFjZTogXCJBV1MvUkRTXCIsXG4gICAgICBzdGF0aXN0aWM6IFwiTWluaW11bVwiLFxuICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgIHBlcmlvZDogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIERCSW5zdGFuY2VJZGVudGlmaWVyOiB0aGlzLmRhdGFiYXNlSW5zdGFuY2VJZGVudGlmaWVyLFxuICAgICAgfSxcbiAgICB9KVxuICAgICAgLmNyZWF0ZUFsYXJtKHRoaXMsIFwiQ3JlZGl0c0FsYXJtXCIsIHtcbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYExlc3MgdGhhbiAke3RocmVzaG9sZH0gQ1BVIGNyZWRpdHMgcmVtYWluaW5nIGZvciBSRFMgZGF0YWJhc2UgJyR7XG4gICAgICAgICAgdGhpcy5kYXRhYmFzZUluc3RhbmNlSWRlbnRpZmllclxuICAgICAgICB9Jy4gJHtcbiAgICAgICAgICB0aGlzLmluc3RhbmNlVHlwZS50b1N0cmluZygpLnN0YXJ0c1dpdGgoXCJ0Mi5cIilcbiAgICAgICAgICAgID8gXCJJZiB0aGlzIHJlYWNoZXMgMCwgdGhlIGluc3RhbmNlIHdpbGwgYmUgbGltaXRlZCB0byBhIGJhc2VsaW5lIENQVSB1dGlsaXphdGlvbi5cIlxuICAgICAgICAgICAgOiBcIklmIHRoZSBiYWxhbmNlIGlzIGRlcGxldGVkLCBBV1MgYWRkcyBhZGRpdGlvbmFsIGNoYXJnZXMuXCJcbiAgICAgICAgfS5gLFxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkxFU1NfVEhBTl9USFJFU0hPTEQsXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgICB0aHJlc2hvbGQ6IHRocmVzaG9sZCxcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLklHTk9SRSxcbiAgICAgIH0pXG4gICAgICAuYWRkQWxhcm1BY3Rpb24odGhpcy5hY3Rpb24pXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0d28gQ2xvdWRXYXRjaCBBbGFybXMgZm9yIG1vbml0b3JpbmcgZGlzayBzdG9yYWdlIHNwYWNlOlxuICAgKiAxKSBvbmUgdGhhdCB0cmlnZ2VycyBpZiB0aGUgYXZhaWxhYmxlIGRpc2sgc3RvcmFnZSBzcGFjZSBpcyBsb3cuXG4gICAqIDIpIG9uZSB0aGF0IHRyaWdnZXJzIGlmIHRoZSBhdmFpbGFibGUgZGlzayBzdG9yYWdlIHNwYWNlIGlzIGNyaXRjYWxseSBsb3cuXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byB1c2UgZGlmZmVyZW50IGFsYXJtIGFjdGlvbnMgZm9yIHRoZSB0d28gYWxhcm1zLCBlLmcuLCBvbmUgY2FuIGJlXG4gICAqIGNhdGVnb3JpemVkIGFzIGEgXCJ3YXJuaW5nXCIsIHdoaWxlIHRoZSBvdGhlciBvbmUgY2FuIGJlIGNvbnNpZGVyZWQgYW4gXCJhbGFybVwiLlxuICAgKi9cbiAgYWRkU3RvcmFnZVNwYWNlQWxhcm1zKHByb3BzPzoge1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gZm9yIGFuIGFsYXJtLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgQ29uZmlndXJlZCB3aXRoIHNhbmUgZGVmYXVsdHMuXG4gICAgICovXG4gICAgbG93U3RvcmFnZVNwYWNlQWxhcm0/OiB7XG4gICAgICAvKipcbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICAgIC8qKlxuICAgICAgICogQW4gYWN0aW9uIHRvIHVzZSBmb3IgQ2xvdWRXYXRjaCBhbGFybSBzdGF0ZSBjaGFuZ2VzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgYWN0aW9uXG4gICAgICAgKi9cbiAgICAgIGFjdGlvbj86IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uXG4gICAgICAvKipcbiAgICAgICAqIEBkZWZhdWx0IDI1JSBvZiB0aGUgYWxsb2NhdGVkIHN0b3JhZ2UuXG4gICAgICAgKi9cbiAgICAgIHRocmVzaG9sZD86IGNkay5TaXplXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gZm9yIGFuIGFsYXJtLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgQ29uZmlndXJlZCB3aXRoIHNhbmUgZGVmYXVsdHMuXG4gICAgICovXG4gICAgY3JpdGljYWxseUxvd1N0b3JhZ2VTcGFjZUFsYXJtPzoge1xuICAgICAgLyoqXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgICAvKipcbiAgICAgICAqIEFuIGFjdGlvbiB0byB1c2UgZm9yIENsb3VkV2F0Y2ggYWxhcm0gc3RhdGUgY2hhbmdlcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGFjdGlvblxuICAgICAgICovXG4gICAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgICAgLyoqXG4gICAgICAgKiBAZGVmYXVsdCA1JSBvZiB0aGUgYWxsb2NhdGVkIHN0b3JhZ2UuXG4gICAgICAgKi9cbiAgICAgIHRocmVzaG9sZD86IGNkay5TaXplXG4gICAgfVxuICB9KTogdm9pZCB7XG4gICAgY29uc3QgbG93U3RvcmFnZVNwYWNlQWxhcm0gPSBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZTogXCJGcmVlU3RvcmFnZVNwYWNlXCIsXG4gICAgICBuYW1lc3BhY2U6IFwiQVdTL1JEU1wiLFxuICAgICAgc3RhdGlzdGljOiBcIk1pbmltdW1cIixcbiAgICAgIHVuaXQ6IFVuaXQuR0lHQUJZVEVTLFxuICAgICAgcGVyaW9kOiBjZGsuRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgREJJbnN0YW5jZUlkZW50aWZpZXI6IHRoaXMuZGF0YWJhc2VJbnN0YW5jZUlkZW50aWZpZXIsXG4gICAgICB9LFxuICAgIH0pLmNyZWF0ZUFsYXJtKHRoaXMsIFwiTG93U3RvcmFnZVNwYWNlQWxhcm1cIiwge1xuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYExvdyBzdG9yYWdlIHNwYWNlIGF2YWlsYWJsZSBvbiBSRFMgZGF0YWJhc2UgJyR7dGhpcy5kYXRhYmFzZUluc3RhbmNlSWRlbnRpZmllcn0nLmAsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkxFU1NfVEhBTl9USFJFU0hPTEQsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICAgIHRocmVzaG9sZDpcbiAgICAgICAgcHJvcHM/Lmxvd1N0b3JhZ2VTcGFjZUFsYXJtPy50aHJlc2hvbGQ/LnRvR2liaWJ5dGVzKCkgPz9cbiAgICAgICAgdGhpcy5hbGxvY2F0ZWRTdG9yYWdlLnRvR2liaWJ5dGVzKCkgKiAwLjI1LFxuICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLklHTk9SRSxcbiAgICB9KVxuICAgIGlmIChwcm9wcz8ubG93U3RvcmFnZVNwYWNlQWxhcm0/LmVuYWJsZWQgPz8gdHJ1ZSkge1xuICAgICAgbG93U3RvcmFnZVNwYWNlQWxhcm0uYWRkQWxhcm1BY3Rpb24oXG4gICAgICAgIHByb3BzPy5sb3dTdG9yYWdlU3BhY2VBbGFybT8uYWN0aW9uIHx8IHRoaXMuYWN0aW9uLFxuICAgICAgKVxuICAgICAgbG93U3RvcmFnZVNwYWNlQWxhcm0uYWRkT2tBY3Rpb24oXG4gICAgICAgIHByb3BzPy5sb3dTdG9yYWdlU3BhY2VBbGFybT8uYWN0aW9uIHx8IHRoaXMuYWN0aW9uLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGNyaXRpY2FsbHlMb3dTdG9yYWdlU3BhY2VBbGFybSA9IG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiBcIkZyZWVTdG9yYWdlU3BhY2VcIixcbiAgICAgIG5hbWVzcGFjZTogXCJBV1MvUkRTXCIsXG4gICAgICBzdGF0aXN0aWM6IFwiTWluaW11bVwiLFxuICAgICAgdW5pdDogVW5pdC5HSUdBQllURVMsXG4gICAgICBwZXJpb2Q6IGNkay5EdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBEQkluc3RhbmNlSWRlbnRpZmllcjogdGhpcy5kYXRhYmFzZUluc3RhbmNlSWRlbnRpZmllcixcbiAgICAgIH0sXG4gICAgfSkuY3JlYXRlQWxhcm0odGhpcywgXCJDcml0aWNhbGx5TG93U3RvcmFnZVNwYWNlQWxhcm1cIiwge1xuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYENyaXRpY2FsbHkgbG93IHN0b3JhZ2Ugc3BhY2UgYXZhaWxhYmxlIG9uIFJEUyBkYXRhYmFzZSAnJHt0aGlzLmRhdGFiYXNlSW5zdGFuY2VJZGVudGlmaWVyfScuYCxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuTEVTU19USEFOX1RIUkVTSE9MRCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgdGhyZXNob2xkOlxuICAgICAgICBwcm9wcz8uY3JpdGljYWxseUxvd1N0b3JhZ2VTcGFjZUFsYXJtPy50aHJlc2hvbGQ/LnRvR2liaWJ5dGVzKCkgPz9cbiAgICAgICAgdGhpcy5hbGxvY2F0ZWRTdG9yYWdlLnRvR2liaWJ5dGVzKCkgKiAwLjA1LFxuICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLklHTk9SRSxcbiAgICB9KVxuICAgIGlmIChwcm9wcz8uY3JpdGljYWxseUxvd1N0b3JhZ2VTcGFjZUFsYXJtPy5lbmFibGVkID8/IHRydWUpIHtcbiAgICAgIGNyaXRpY2FsbHlMb3dTdG9yYWdlU3BhY2VBbGFybS5hZGRBbGFybUFjdGlvbihcbiAgICAgICAgcHJvcHM/LmNyaXRpY2FsbHlMb3dTdG9yYWdlU3BhY2VBbGFybT8uYWN0aW9uIHx8IHRoaXMuYWN0aW9uLFxuICAgICAgKVxuICAgICAgY3JpdGljYWxseUxvd1N0b3JhZ2VTcGFjZUFsYXJtLmFkZE9rQWN0aW9uKFxuICAgICAgICBwcm9wcz8uY3JpdGljYWxseUxvd1N0b3JhZ2VTcGFjZUFsYXJtPy5hY3Rpb24gfHwgdGhpcy5hY3Rpb24sXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgYSBDbG91ZFdhdGNoIEFsYXJtIHRoYXQgdHJpZ2dlcnMgaWYgdGhlIGF2ZXJhZ2UgQ1BVIHV0aWxpemF0aW9uIGZvclxuICAgKiB0aGUgUkRTIGluc3RhbmNlIGV4Y2VlZHMgYSBnaXZlbiB0aHJlc2hvbGQuXG4gICAqL1xuICBhZGRDcHVVdGlsaXphdGlvbkFsYXJtKFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gZm9yIGFuIGFsYXJtLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgQ29uZmlndXJlZCB3aXRoIHNhbmUgZGVmYXVsdHMuXG4gICAgICovXG4gICAgcHJvcHM/OiB7XG4gICAgICAvKipcbiAgICAgICAqIEFuIGFjdGlvbiB0byB1c2UgZm9yIENsb3VkV2F0Y2ggYWxhcm0gc3RhdGUgY2hhbmdlcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGFjdGlvblxuICAgICAgICovXG4gICAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdGhyZXNob2xkIGRlZmluZWQgYXMgYSBwZXJjZW50YWdlIHRoYXQgZGV0ZXJtaW5lcyBpZiBDUFUgdXRpbGl6YXRpb24gc2hvdWxkIHRyaWdnZXIgYW4gYWxhcm0gb3Igbm90LlxuICAgICAgICogQGRlZmF1bHQgODBcbiAgICAgICAqL1xuICAgICAgdGhyZXNob2xkPzogbnVtYmVyXG4gICAgICAvKipcbiAgICAgICAqIEBkZWZhdWx0IDVcbiAgICAgICAqL1xuICAgICAgZXZhbHVhdGlvblBlcmlvZHM/OiBudW1iZXJcbiAgICAgIC8qKlxuICAgICAgICogQGRlZmF1bHQgMiBtaW51dGVzXG4gICAgICAgKi9cbiAgICAgIHBlcmlvZD86IGNkay5EdXJhdGlvblxuICAgIH0sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGFsYXJtID0gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG1ldHJpY05hbWU6IFwiQ1BVVXRpbGl6YXRpb25cIixcbiAgICAgIG5hbWVzcGFjZTogXCJBV1MvUkRTXCIsXG4gICAgICBzdGF0aXN0aWM6IFwiQXZlcmFnZVwiLFxuICAgICAgcGVyaW9kOiBwcm9wcz8ucGVyaW9kID8/IGNkay5EdXJhdGlvbi5taW51dGVzKDIpLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBEQkluc3RhbmNlSWRlbnRpZmllcjogdGhpcy5kYXRhYmFzZUluc3RhbmNlSWRlbnRpZmllcixcbiAgICAgIH0sXG4gICAgfSkuY3JlYXRlQWxhcm0odGhpcywgXCJDcHVVdGlsaXphdGlvbkFsYXJtXCIsIHtcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBSRFMgZGF0YWJhc2UgJyR7dGhpcy5kYXRhYmFzZUluc3RhbmNlSWRlbnRpZmllcn0nIGhhcyBhIGhpZ2hlciB0aGFuIGV4cGVjdGVkIENQVSB1dGlsaXphdGlvbi5gLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IHByb3BzPy5ldmFsdWF0aW9uUGVyaW9kcyA/PyA1LFxuICAgICAgdGhyZXNob2xkOiBwcm9wcz8udGhyZXNob2xkID8/IDgwLFxuICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLklHTk9SRSxcbiAgICB9KVxuICAgIGFsYXJtLmFkZEFsYXJtQWN0aW9uKHByb3BzPy5hY3Rpb24gPz8gdGhpcy5hY3Rpb24pXG4gICAgYWxhcm0uYWRkT2tBY3Rpb24ocHJvcHM/LmFjdGlvbiA/PyB0aGlzLmFjdGlvbilcbiAgfVxufVxuIl19
|
package/lib/alarms/index.d.ts
CHANGED
package/lib/alarms/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SlackAlarm = exports.ServiceAlarms = void 0;
|
|
3
|
+
exports.SlackAlarm = exports.ServiceAlarms = exports.DatabaseAlarms = void 0;
|
|
4
|
+
var database_alarms_1 = require("./database-alarms");
|
|
5
|
+
Object.defineProperty(exports, "DatabaseAlarms", { enumerable: true, get: function () { return database_alarms_1.DatabaseAlarms; } });
|
|
4
6
|
var service_alarms_1 = require("./service-alarms");
|
|
5
7
|
Object.defineProperty(exports, "ServiceAlarms", { enumerable: true, get: function () { return service_alarms_1.ServiceAlarms; } });
|
|
6
8
|
var slack_alarm_1 = require("./slack-alarm");
|
|
7
9
|
Object.defineProperty(exports, "SlackAlarm", { enumerable: true, get: function () { return slack_alarm_1.SlackAlarm; } });
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWxhcm1zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUF1RTtBQUE5RCxpSEFBQSxjQUFjLE9BQUE7QUFDdkIsbURBQW9FO0FBQTNELCtHQUFBLGFBQWEsT0FBQTtBQUN0Qiw2Q0FBMkQ7QUFBbEQseUdBQUEsVUFBVSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgRGF0YWJhc2VBbGFybXMsIERhdGFiYXNlQWxhcm1zUHJvcHMgfSBmcm9tIFwiLi9kYXRhYmFzZS1hbGFybXNcIlxuZXhwb3J0IHsgU2VydmljZUFsYXJtcywgU2VydmljZUFsYXJtc1Byb3BzIH0gZnJvbSBcIi4vc2VydmljZS1hbGFybXNcIlxuZXhwb3J0IHsgU2xhY2tBbGFybSwgU2xhY2tBbGFybVByb3BzIH0gZnJvbSBcIi4vc2xhY2stYWxhcm1cIlxuIl19
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as cdk from "aws-cdk-lib";
|
|
2
2
|
import * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
|
|
3
3
|
import * as logs from "aws-cdk-lib/aws-logs";
|
|
4
|
-
import * as
|
|
4
|
+
import * as constructs from "constructs";
|
|
5
5
|
export interface ServiceAlarmsProps extends cdk.StackProps {
|
|
6
|
+
/**
|
|
7
|
+
* The default action to use for CloudWatch alarm state changes
|
|
8
|
+
*/
|
|
6
9
|
action: cloudwatch.IAlarmAction;
|
|
10
|
+
/**
|
|
11
|
+
* The name of the ECS service.
|
|
12
|
+
*/
|
|
7
13
|
serviceName: string;
|
|
8
14
|
}
|
|
9
15
|
/**
|
|
@@ -26,15 +32,114 @@ export declare class ServiceAlarms extends constructs.Construct {
|
|
|
26
32
|
addJsonErrorAlarm(props: {
|
|
27
33
|
logGroup: logs.ILogGroup;
|
|
28
34
|
alarmDescription?: string;
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
35
|
+
/**
|
|
36
|
+
* Set to `false` to stop the alarm from sending OK events.
|
|
37
|
+
* @default true
|
|
38
|
+
* */
|
|
31
39
|
enableOkAction?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* An action to use for CloudWatch alarm state changes instead of the default action
|
|
42
|
+
*/
|
|
43
|
+
action?: cloudwatch.IAlarmAction;
|
|
32
44
|
}): void;
|
|
33
45
|
/**
|
|
34
|
-
*
|
|
46
|
+
* Sets up three CloudWatch Alarms for monitoring an ECS service behind a target group:
|
|
47
|
+
* 1) one that triggers if the target is responding with too many 5xx errors.
|
|
48
|
+
* 2) one that triggers if the 95% percentile of response times from the target is too high.
|
|
49
|
+
* 3) one that triggers if there are no healthy targets or if the load balancer fails to connect to targets.
|
|
35
50
|
*/
|
|
36
|
-
|
|
51
|
+
addTargetGroupAlarms(props: {
|
|
52
|
+
/**
|
|
53
|
+
* The full name of the target group.
|
|
54
|
+
*/
|
|
37
55
|
targetGroupFullName: string;
|
|
56
|
+
/**
|
|
57
|
+
* The full name of the application load balancer.
|
|
58
|
+
*/
|
|
38
59
|
loadBalancerFullName: string;
|
|
60
|
+
/**
|
|
61
|
+
* Configuration for a composite alarm.
|
|
62
|
+
*
|
|
63
|
+
* @default Configured with sane defaults.
|
|
64
|
+
*/
|
|
65
|
+
targetHealthAlarm?: {
|
|
66
|
+
/**
|
|
67
|
+
* @default true
|
|
68
|
+
*/
|
|
69
|
+
enabled?: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* An action to use for CloudWatch alarm state changes instead of the default action
|
|
72
|
+
*/
|
|
73
|
+
action?: cloudwatch.IAlarmAction;
|
|
74
|
+
/**
|
|
75
|
+
* @default 60 seconds
|
|
76
|
+
*/
|
|
77
|
+
period?: cdk.Duration;
|
|
78
|
+
/**
|
|
79
|
+
* @default 1
|
|
80
|
+
*/
|
|
81
|
+
evaluationPeriods?: number;
|
|
82
|
+
/**
|
|
83
|
+
* @default 1
|
|
84
|
+
*/
|
|
85
|
+
threshold?: number;
|
|
86
|
+
description?: string;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Configuration for an alarm.
|
|
90
|
+
*
|
|
91
|
+
* @default Configured with sane defaults.
|
|
92
|
+
*/
|
|
93
|
+
tooMany5xxResponsesFromTargetsAlarm?: {
|
|
94
|
+
/**
|
|
95
|
+
* @default true
|
|
96
|
+
*/
|
|
97
|
+
enabled?: boolean;
|
|
98
|
+
/**
|
|
99
|
+
* An action to use for CloudWatch alarm state changes instead of the default action
|
|
100
|
+
*/
|
|
101
|
+
action?: cloudwatch.IAlarmAction;
|
|
102
|
+
/**
|
|
103
|
+
* @default 60 seconds
|
|
104
|
+
*/
|
|
105
|
+
period?: cdk.Duration;
|
|
106
|
+
/**
|
|
107
|
+
* @default 3
|
|
108
|
+
*/
|
|
109
|
+
evaluationPeriods?: number;
|
|
110
|
+
/**
|
|
111
|
+
* @default 10
|
|
112
|
+
*/
|
|
113
|
+
threshold?: number;
|
|
114
|
+
description?: string;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Configuration for an alarm.
|
|
118
|
+
*
|
|
119
|
+
* @default Configured with sane defaults.
|
|
120
|
+
*/
|
|
121
|
+
targetResponseTimeAlarm?: {
|
|
122
|
+
/**
|
|
123
|
+
* @default true
|
|
124
|
+
*/
|
|
125
|
+
enabled?: boolean;
|
|
126
|
+
/**
|
|
127
|
+
* An action to use for CloudWatch alarm state changes instead of the default action
|
|
128
|
+
*/
|
|
129
|
+
action?: cloudwatch.IAlarmAction;
|
|
130
|
+
/**
|
|
131
|
+
* @default 5 minutes
|
|
132
|
+
*/
|
|
133
|
+
period?: cdk.Duration;
|
|
134
|
+
/**
|
|
135
|
+
* @default 1
|
|
136
|
+
*/
|
|
137
|
+
evaluationPeriods?: number;
|
|
138
|
+
/**
|
|
139
|
+
* @default 500 milliseconds
|
|
140
|
+
*/
|
|
141
|
+
threshold?: cdk.Duration;
|
|
142
|
+
description?: string;
|
|
143
|
+
};
|
|
39
144
|
}): void;
|
|
40
145
|
}
|