@digitraffic/common 2022.10.5 → 2022.10.7-1
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/README.md +49 -0
- package/aws/index.d.ts +1 -0
- package/aws/index.js +18 -0
- package/aws/infra/api/index.d.ts +1 -0
- package/aws/infra/api/index.js +18 -0
- package/aws/infra/api/responses.js +1 -1
- package/aws/infra/stack/lambda-configs.js +1 -1
- package/aws/infra/stack/rest_apis.d.ts +1 -0
- package/aws/infra/stack/rest_apis.js +8 -2
- package/aws/infra/stack/stack.d.ts +4 -1
- package/aws/infra/stack/stack.js +1 -1
- package/aws/infra/usage-plans.js +1 -1
- package/aws/types/errors.js +1 -1
- package/aws/types/tags.js +1 -1
- package/database/last-updated.js +10 -10
- package/package.json +27 -13
- package/test/httpserver.js +1 -1
- package/types/index.d.ts +1 -0
- package/types/index.js +18 -0
- package/types/language.js +1 -1
- package/utils/geometry.js +1 -1
- package/src/aws/infra/api/integration.js +0 -52
- package/src/aws/infra/api/response.js +0 -61
- package/src/aws/infra/api/responses.js +0 -79
- package/src/aws/infra/api/static-integration.js +0 -54
- package/src/aws/infra/canaries/canary-alarm.js +0 -26
- package/src/aws/infra/canaries/canary-parameters.js +0 -3
- package/src/aws/infra/canaries/canary-role.js +0 -46
- package/src/aws/infra/canaries/canary.js +0 -29
- package/src/aws/infra/canaries/database-canary.js +0 -55
- package/src/aws/infra/canaries/database-checker.js +0 -109
- package/src/aws/infra/canaries/url-canary.js +0 -46
- package/src/aws/infra/canaries/url-checker.js +0 -238
- package/src/aws/infra/documentation.js +0 -95
- package/src/aws/infra/scheduler.js +0 -31
- package/src/aws/infra/security-rule.js +0 -39
- package/src/aws/infra/sqs-integration.js +0 -93
- package/src/aws/infra/sqs-queue.js +0 -130
- package/src/aws/infra/stack/lambda-configs.js +0 -93
- package/src/aws/infra/stack/monitoredfunction.js +0 -135
- package/src/aws/infra/stack/rest_apis.js +0 -179
- package/src/aws/infra/stack/stack-checking-aspect.js +0 -163
- package/src/aws/infra/stack/stack.js +0 -58
- package/src/aws/infra/stack/subscription.js +0 -41
- package/src/aws/infra/usage-plans.js +0 -42
- package/src/aws/runtime/apikey.js +0 -13
- package/src/aws/runtime/digitraffic-integration-response.js +0 -26
- package/src/aws/runtime/messaging.js +0 -31
- package/src/aws/runtime/s3.js +0 -30
- package/src/aws/runtime/secrets/dbsecret.js +0 -96
- package/src/aws/runtime/secrets/proxy-holder.js +0 -26
- package/src/aws/runtime/secrets/rds-holder.js +0 -26
- package/src/aws/runtime/secrets/secret-holder.js +0 -73
- package/src/aws/runtime/secrets/secret.js +0 -43
- package/src/aws/types/errors.js +0 -9
- package/src/aws/types/lambda-response.js +0 -28
- package/src/aws/types/mediatypes.js +0 -15
- package/src/aws/types/model-with-reference.js +0 -3
- package/src/aws/types/proxytypes.js +0 -3
- package/src/aws/types/tags.js +0 -7
- package/src/database/cached.js +0 -32
- package/src/database/database.js +0 -62
- package/src/database/last-updated.js +0 -54
- package/src/marine/id_utils.js +0 -33
- package/src/marine/rtz.js +0 -3
- package/src/test/asserter.js +0 -45
- package/src/test/db-testutils.js +0 -31
- package/src/test/httpserver.js +0 -67
- package/src/test/secret.js +0 -25
- package/src/test/secrets-manager.js +0 -59
- package/src/test/testutils.js +0 -44
- package/src/types/input-error.js +0 -7
- package/src/types/language.js +0 -10
- package/src/types/traffictype.js +0 -13
- package/src/types/validator.js +0 -14
- package/src/utils/api-model.js +0 -129
- package/src/utils/base64.js +0 -21
- package/src/utils/date-utils.js +0 -34
- package/src/utils/geojson-types.js +0 -18
- package/src/utils/geometry.js +0 -140
- package/src/utils/retry.js +0 -50
- package/src/utils/slack.js +0 -25
- package/src/utils/utils.js +0 -40
- package/test/marine/id_utils.test.js +0 -69
- package/test/promise/promise.test.js +0 -125
- package/test/secrets/dbsecret.test.js +0 -71
- package/test/secrets/secret-holder.test.js +0 -124
- package/test/secrets/secret.test.js +0 -66
- package/test/test/httpserver.test.js +0 -87
- package/test/utils/date-utils.test.js +0 -51
- package/test/utils/geometry.test.js +0 -49
- package/test/utils/utils.test.js +0 -49
@@ -1,39 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.DigitrafficSecurityRule = void 0;
|
4
|
-
const aws_events_1 = require("aws-cdk-lib/aws-events");
|
5
|
-
const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
|
6
|
-
/**
|
7
|
-
* Automatic rule for Security Hub. Send notification to given topic if the following conditions apply:
|
8
|
-
* * There is a finding with a status of NEW
|
9
|
-
* * It has severity of HIGH or CRITICAL
|
10
|
-
* * It is in a FAILED state
|
11
|
-
*/
|
12
|
-
class DigitrafficSecurityRule extends aws_events_1.Rule {
|
13
|
-
constructor(scope, topic) {
|
14
|
-
const ruleName = 'SecurityHubRule';
|
15
|
-
super(scope, ruleName, {
|
16
|
-
ruleName,
|
17
|
-
eventPattern: {
|
18
|
-
source: ['aws.securityhub'],
|
19
|
-
detailType: ["Security Hub Findings - Imported"],
|
20
|
-
detail: {
|
21
|
-
findings: {
|
22
|
-
"Compliance": {
|
23
|
-
"Status": ["FAILED"],
|
24
|
-
},
|
25
|
-
"Workflow": {
|
26
|
-
"Status": ["NEW"],
|
27
|
-
},
|
28
|
-
"Severity": {
|
29
|
-
"Label": ["HIGH", "CRITICAL"],
|
30
|
-
},
|
31
|
-
},
|
32
|
-
},
|
33
|
-
},
|
34
|
-
});
|
35
|
-
this.addTarget(new aws_events_targets_1.SnsTopic(topic));
|
36
|
-
}
|
37
|
-
}
|
38
|
-
exports.DigitrafficSecurityRule = DigitrafficSecurityRule;
|
39
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktcnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hd3MvaW5mcmEvc2VjdXJpdHktcnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx1REFBNEM7QUFFNUMsdUVBQXdEO0FBRXhEOzs7OztHQUtHO0FBQ0gsTUFBYSx1QkFBd0IsU0FBUSxpQkFBSTtJQUM3QyxZQUFZLEtBQWdCLEVBQUUsS0FBYTtRQUN2QyxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQztRQUNuQyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRTtZQUNuQixRQUFRO1lBQ1IsWUFBWSxFQUFFO2dCQUNWLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixDQUFDO2dCQUMzQixVQUFVLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQztnQkFDaEQsTUFBTSxFQUFFO29CQUNKLFFBQVEsRUFBRTt3QkFDTixZQUFZLEVBQUU7NEJBQ1YsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO3lCQUN2Qjt3QkFDRCxVQUFVLEVBQUU7NEJBQ1IsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDO3lCQUNwQjt3QkFDRCxVQUFVLEVBQUU7NEJBQ1IsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQzt5QkFDaEM7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSw2QkFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNKO0FBMUJELDBEQTBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29uc3RydWN0fSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtSdWxlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHtJVG9waWN9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc25zXCI7XG5pbXBvcnQge1Nuc1RvcGljfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCI7XG5cbi8qKlxuICogQXV0b21hdGljIHJ1bGUgZm9yIFNlY3VyaXR5IEh1Yi4gIFNlbmQgbm90aWZpY2F0aW9uIHRvIGdpdmVuIHRvcGljIGlmIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcHBseTpcbiAqICogVGhlcmUgaXMgYSBmaW5kaW5nIHdpdGggYSBzdGF0dXMgb2YgTkVXXG4gKiAqIEl0IGhhcyBzZXZlcml0eSBvZiBISUdIIG9yIENSSVRJQ0FMXG4gKiAqIEl0IGlzIGluIGEgRkFJTEVEIHN0YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBEaWdpdHJhZmZpY1NlY3VyaXR5UnVsZSBleHRlbmRzIFJ1bGUge1xuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIHRvcGljOiBJVG9waWMpIHtcbiAgICAgICAgY29uc3QgcnVsZU5hbWUgPSAnU2VjdXJpdHlIdWJSdWxlJztcbiAgICAgICAgc3VwZXIoc2NvcGUsIHJ1bGVOYW1lLCB7XG4gICAgICAgICAgICBydWxlTmFtZSxcbiAgICAgICAgICAgIGV2ZW50UGF0dGVybjoge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogWydhd3Muc2VjdXJpdHlodWInXSxcbiAgICAgICAgICAgICAgICBkZXRhaWxUeXBlOiBbXCJTZWN1cml0eSBIdWIgRmluZGluZ3MgLSBJbXBvcnRlZFwiXSxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgZmluZGluZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29tcGxpYW5jZVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTdGF0dXNcIjogW1wiRkFJTEVEXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiV29ya2Zsb3dcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhdHVzXCI6IFtcIk5FV1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlNldmVyaXR5XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkxhYmVsXCI6IFtcIkhJR0hcIiwgXCJDUklUSUNBTFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkVGFyZ2V0KG5ldyBTbnNUb3BpYyh0b3BpYykpO1xuICAgIH1cbn1cbiJdfQ==
|
@@ -1,93 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.attachQueueToApiGatewayResource = void 0;
|
4
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
5
|
-
const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
|
6
|
-
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
7
|
-
function attachQueueToApiGatewayResource(stack, queue, resource, requestValidator, resourceName, apiKeyRequired, requestModels) {
|
8
|
-
// role for API Gateway
|
9
|
-
const apiGwRole = new aws_iam_1.Role(stack, `${resourceName}APIGatewayToSQSRole`, {
|
10
|
-
assumedBy: new aws_iam_1.ServicePrincipal('apigateway.amazonaws.com'),
|
11
|
-
});
|
12
|
-
// grants API Gateway the right to send SQS messages
|
13
|
-
apiGwRole.addToPolicy(new aws_iam_1.PolicyStatement({
|
14
|
-
resources: [
|
15
|
-
queue.queueArn,
|
16
|
-
],
|
17
|
-
actions: [
|
18
|
-
'sqs:SendMessage',
|
19
|
-
],
|
20
|
-
}));
|
21
|
-
// grants API Gateway the right write CloudWatch Logs
|
22
|
-
apiGwRole.addToPolicy(new aws_iam_1.PolicyStatement({
|
23
|
-
resources: [
|
24
|
-
'*',
|
25
|
-
],
|
26
|
-
actions: [
|
27
|
-
'logs:CreateLogGroup',
|
28
|
-
'logs:CreateLogStream',
|
29
|
-
'logs:DescribeLogGroups',
|
30
|
-
'logs:DescribeLogStreams',
|
31
|
-
'logs:PutLogEvents',
|
32
|
-
'logs:GetLogEvents',
|
33
|
-
'logs:FilterLogEvents',
|
34
|
-
],
|
35
|
-
}));
|
36
|
-
// create an integration between API Gateway and an SQS queue
|
37
|
-
const fifoMessageGroupId = queue.fifo ? '&MessageGroupId=AlwaysSameFifoGroup' : '';
|
38
|
-
const sqsIntegration = new aws_apigateway_1.AwsIntegration({
|
39
|
-
service: 'sqs',
|
40
|
-
integrationHttpMethod: 'POST',
|
41
|
-
options: {
|
42
|
-
passthroughBehavior: aws_apigateway_1.PassthroughBehavior.NEVER,
|
43
|
-
credentialsRole: apiGwRole,
|
44
|
-
requestParameters: {
|
45
|
-
// SQS requires the Content-Type of the HTTP request to be application/x-www-form-urlencoded
|
46
|
-
'integration.request.header.Content-Type': "'application/x-www-form-urlencoded'",
|
47
|
-
},
|
48
|
-
requestTemplates: {
|
49
|
-
// map the JSON request to a form parameter, FIFO needs also MessageGroupId
|
50
|
-
// https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html
|
51
|
-
'application/json': `Action=SendMessage${fifoMessageGroupId}&MessageBody=$util.urlEncode($input.body)`,
|
52
|
-
},
|
53
|
-
// these are required by SQS
|
54
|
-
integrationResponses: [
|
55
|
-
{
|
56
|
-
statusCode: '200',
|
57
|
-
responseTemplates: {
|
58
|
-
'text/html': 'Success',
|
59
|
-
},
|
60
|
-
},
|
61
|
-
{
|
62
|
-
statusCode: '500',
|
63
|
-
responseTemplates: {
|
64
|
-
'text/html': 'Error',
|
65
|
-
},
|
66
|
-
selectionPattern: '500',
|
67
|
-
},
|
68
|
-
],
|
69
|
-
},
|
70
|
-
path: `${aws_cdk_lib_1.Aws.ACCOUNT_ID}/${queue.queueName}`,
|
71
|
-
});
|
72
|
-
resource.addMethod('POST', sqsIntegration, {
|
73
|
-
requestValidator,
|
74
|
-
apiKeyRequired,
|
75
|
-
requestModels: requestModels ?? {},
|
76
|
-
methodResponses: [
|
77
|
-
{
|
78
|
-
statusCode: '200',
|
79
|
-
responseParameters: {
|
80
|
-
'method.response.header.Content-Type': true,
|
81
|
-
},
|
82
|
-
},
|
83
|
-
{
|
84
|
-
statusCode: '500',
|
85
|
-
responseParameters: {
|
86
|
-
'method.response.header.Content-Type': true,
|
87
|
-
},
|
88
|
-
},
|
89
|
-
],
|
90
|
-
});
|
91
|
-
}
|
92
|
-
exports.attachQueueToApiGatewayResource = attachQueueToApiGatewayResource;
|
93
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FzLWludGVncmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2F3cy9pbmZyYS9zcXMtaW50ZWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQWdDO0FBQ2hDLCtEQUEyRztBQUUzRyxpREFBNEU7QUFJNUUsU0FBZ0IsK0JBQStCLENBQzNDLEtBQWdCLEVBQ2hCLEtBQVksRUFDWixRQUFrQixFQUNsQixnQkFBa0MsRUFDbEMsWUFBb0IsRUFDcEIsY0FBdUIsRUFDdkIsYUFBeUM7SUFFekMsdUJBQXVCO0lBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksY0FBSSxDQUFDLEtBQUssRUFBRSxHQUFHLFlBQVkscUJBQXFCLEVBQUU7UUFDcEUsU0FBUyxFQUFFLElBQUksMEJBQWdCLENBQUMsMEJBQTBCLENBQUM7S0FDOUQsQ0FBQyxDQUFDO0lBQ0gsb0RBQW9EO0lBQ3BELFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSx5QkFBZSxDQUFDO1FBQ3RDLFNBQVMsRUFBRTtZQUNQLEtBQUssQ0FBQyxRQUFRO1NBQ2pCO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsaUJBQWlCO1NBQ3BCO0tBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSixxREFBcUQ7SUFDckQsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLHlCQUFlLENBQUM7UUFDdEMsU0FBUyxFQUFFO1lBQ1AsR0FBRztTQUNOO1FBQ0QsT0FBTyxFQUFFO1lBQ0wscUJBQXFCO1lBQ3JCLHNCQUFzQjtZQUN0Qix3QkFBd0I7WUFDeEIseUJBQXlCO1lBQ3pCLG1CQUFtQjtZQUNuQixtQkFBbUI7WUFDbkIsc0JBQXNCO1NBQ3pCO0tBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSiw2REFBNkQ7SUFDN0QsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ25GLE1BQU0sY0FBYyxHQUFHLElBQUksK0JBQWMsQ0FBQztRQUN0QyxPQUFPLEVBQUUsS0FBSztRQUNkLHFCQUFxQixFQUFFLE1BQU07UUFDN0IsT0FBTyxFQUFFO1lBQ0wsbUJBQW1CLEVBQUUsb0NBQW1CLENBQUMsS0FBSztZQUM5QyxlQUFlLEVBQUUsU0FBUztZQUMxQixpQkFBaUIsRUFBRTtnQkFDZiw0RkFBNEY7Z0JBQzVGLHlDQUF5QyxFQUFFLHFDQUFxQzthQUNuRjtZQUNELGdCQUFnQixFQUFFO2dCQUNkLDJFQUEyRTtnQkFDM0UsNkZBQTZGO2dCQUM3RixrQkFBa0IsRUFBRSxxQkFBcUIsa0JBQWtCLDJDQUEyQzthQUN6RztZQUNELDRCQUE0QjtZQUM1QixvQkFBb0IsRUFBRTtnQkFDbEI7b0JBQ0ksVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLGlCQUFpQixFQUFFO3dCQUNmLFdBQVcsRUFBRSxTQUFTO3FCQUN6QjtpQkFDSjtnQkFDRDtvQkFDSSxVQUFVLEVBQUUsS0FBSztvQkFDakIsaUJBQWlCLEVBQUU7d0JBQ2YsV0FBVyxFQUFFLE9BQU87cUJBQ3ZCO29CQUNELGdCQUFnQixFQUFFLEtBQUs7aUJBQzFCO2FBRUo7U0FFSjtRQUNELElBQUksRUFBRSxHQUFHLGlCQUFHLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUU7S0FDL0MsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFO1FBQ3ZDLGdCQUFnQjtRQUNoQixjQUFjO1FBQ2QsYUFBYSxFQUFFLGFBQWEsSUFBSSxFQUFFO1FBQ2xDLGVBQWUsRUFBRTtZQUNiO2dCQUNJLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixrQkFBa0IsRUFBRTtvQkFDaEIscUNBQXFDLEVBQUUsSUFBSTtpQkFDOUM7YUFDSjtZQUNEO2dCQUNJLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixrQkFBa0IsRUFBRTtvQkFDaEIscUNBQXFDLEVBQUUsSUFBSTtpQkFDOUM7YUFDSjtTQUNKO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQTlGRCwwRUE4RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0F3c30gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge0F3c0ludGVncmF0aW9uLCBQYXNzdGhyb3VnaEJlaGF2aW9yLCBSZXF1ZXN0VmFsaWRhdG9yLCBSZXNvdXJjZX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5XCI7XG5pbXBvcnQge1F1ZXVlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiO1xuaW1wb3J0IHtQb2xpY3lTdGF0ZW1lbnQsIFJvbGUsIFNlcnZpY2VQcmluY2lwYWx9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQge0lNb2RlbH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5L2xpYi9tb2RlbFwiO1xuaW1wb3J0IHtDb25zdHJ1Y3R9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hRdWV1ZVRvQXBpR2F0ZXdheVJlc291cmNlKFxuICAgIHN0YWNrOiBDb25zdHJ1Y3QsXG4gICAgcXVldWU6IFF1ZXVlLFxuICAgIHJlc291cmNlOiBSZXNvdXJjZSxcbiAgICByZXF1ZXN0VmFsaWRhdG9yOiBSZXF1ZXN0VmFsaWRhdG9yLFxuICAgIHJlc291cmNlTmFtZTogc3RyaW5nLFxuICAgIGFwaUtleVJlcXVpcmVkOiBib29sZWFuLFxuICAgIHJlcXVlc3RNb2RlbHM/OiB7W3BhcmFtOiBzdHJpbmddOiBJTW9kZWx9LFxuKSB7XG4gICAgLy8gcm9sZSBmb3IgQVBJIEdhdGV3YXlcbiAgICBjb25zdCBhcGlHd1JvbGUgPSBuZXcgUm9sZShzdGFjaywgYCR7cmVzb3VyY2VOYW1lfUFQSUdhdGV3YXlUb1NRU1JvbGVgLCB7XG4gICAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2FwaWdhdGV3YXkuYW1hem9uYXdzLmNvbScpLFxuICAgIH0pO1xuICAgIC8vIGdyYW50cyBBUEkgR2F0ZXdheSB0aGUgcmlnaHQgdG8gc2VuZCBTUVMgbWVzc2FnZXNcbiAgICBhcGlHd1JvbGUuYWRkVG9Qb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgcXVldWUucXVldWVBcm4sXG4gICAgICAgIF0sXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdzcXM6U2VuZE1lc3NhZ2UnLFxuICAgICAgICBdLFxuICAgIH0pKTtcbiAgICAvLyBncmFudHMgQVBJIEdhdGV3YXkgdGhlIHJpZ2h0IHdyaXRlIENsb3VkV2F0Y2ggTG9nc1xuICAgIGFwaUd3Um9sZS5hZGRUb1BvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAnKicsXG4gICAgICAgIF0sXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdsb2dzOkNyZWF0ZUxvZ0dyb3VwJyxcbiAgICAgICAgICAgICdsb2dzOkNyZWF0ZUxvZ1N0cmVhbScsXG4gICAgICAgICAgICAnbG9nczpEZXNjcmliZUxvZ0dyb3VwcycsXG4gICAgICAgICAgICAnbG9nczpEZXNjcmliZUxvZ1N0cmVhbXMnLFxuICAgICAgICAgICAgJ2xvZ3M6UHV0TG9nRXZlbnRzJyxcbiAgICAgICAgICAgICdsb2dzOkdldExvZ0V2ZW50cycsXG4gICAgICAgICAgICAnbG9nczpGaWx0ZXJMb2dFdmVudHMnLFxuICAgICAgICBdLFxuICAgIH0pKTtcbiAgICAvLyBjcmVhdGUgYW4gaW50ZWdyYXRpb24gYmV0d2VlbiBBUEkgR2F0ZXdheSBhbmQgYW4gU1FTIHF1ZXVlXG4gICAgY29uc3QgZmlmb01lc3NhZ2VHcm91cElkID0gcXVldWUuZmlmbyA/ICcmTWVzc2FnZUdyb3VwSWQ9QWx3YXlzU2FtZUZpZm9Hcm91cCcgOiAnJztcbiAgICBjb25zdCBzcXNJbnRlZ3JhdGlvbiA9IG5ldyBBd3NJbnRlZ3JhdGlvbih7XG4gICAgICAgIHNlcnZpY2U6ICdzcXMnLFxuICAgICAgICBpbnRlZ3JhdGlvbkh0dHBNZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgcGFzc3Rocm91Z2hCZWhhdmlvcjogUGFzc3Rocm91Z2hCZWhhdmlvci5ORVZFUixcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzUm9sZTogYXBpR3dSb2xlLFxuICAgICAgICAgICAgcmVxdWVzdFBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAvLyBTUVMgcmVxdWlyZXMgdGhlIENvbnRlbnQtVHlwZSBvZiB0aGUgSFRUUCByZXF1ZXN0IHRvIGJlIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICAgICAgICAgICAgICAgICdpbnRlZ3JhdGlvbi5yZXF1ZXN0LmhlYWRlci5Db250ZW50LVR5cGUnOiBcIidhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdFRlbXBsYXRlczoge1xuICAgICAgICAgICAgICAgIC8vIG1hcCB0aGUgSlNPTiByZXF1ZXN0IHRvIGEgZm9ybSBwYXJhbWV0ZXIsIEZJRk8gbmVlZHMgYWxzbyBNZXNzYWdlR3JvdXBJZFxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NTaW1wbGVRdWV1ZVNlcnZpY2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU2VuZE1lc3NhZ2UuaHRtbFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJzogYEFjdGlvbj1TZW5kTWVzc2FnZSR7Zmlmb01lc3NhZ2VHcm91cElkfSZNZXNzYWdlQm9keT0kdXRpbC51cmxFbmNvZGUoJGlucHV0LmJvZHkpYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyB0aGVzZSBhcmUgcmVxdWlyZWQgYnkgU1FTXG4gICAgICAgICAgICBpbnRlZ3JhdGlvblJlc3BvbnNlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogJzIwMCcsXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAndGV4dC9odG1sJzogJ1N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAnNTAwJyxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUZW1wbGF0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0L2h0bWwnOiAnRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25QYXR0ZXJuOiAnNTAwJyxcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBdLFxuXG4gICAgICAgIH0sXG4gICAgICAgIHBhdGg6IGAke0F3cy5BQ0NPVU5UX0lEfS8ke3F1ZXVlLnF1ZXVlTmFtZX1gLFxuICAgIH0pO1xuICAgIHJlc291cmNlLmFkZE1ldGhvZCgnUE9TVCcsIHNxc0ludGVncmF0aW9uLCB7XG4gICAgICAgIHJlcXVlc3RWYWxpZGF0b3IsXG4gICAgICAgIGFwaUtleVJlcXVpcmVkLFxuICAgICAgICByZXF1ZXN0TW9kZWxzOiByZXF1ZXN0TW9kZWxzID8/IHt9LFxuICAgICAgICBtZXRob2RSZXNwb25zZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAnMjAwJyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ21ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAnNTAwJyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ21ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICB9KTtcbn1cbiJdfQ==
|
@@ -1,130 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.DigitrafficDLQueue = exports.DigitrafficSqsQueue = void 0;
|
4
|
-
const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
|
5
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
6
|
-
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
7
|
-
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
8
|
-
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
9
|
-
const aws_logs_1 = require("aws-cdk-lib/aws-logs");
|
10
|
-
const aws_lambda_event_sources_1 = require("aws-cdk-lib/aws-lambda-event-sources");
|
11
|
-
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
12
|
-
const aws_cloudwatch_actions_1 = require("aws-cdk-lib/aws-cloudwatch-actions");
|
13
|
-
const monitoredfunction_1 = require("./stack/monitoredfunction");
|
14
|
-
/**
|
15
|
-
* Construct for creating SQS-queues.
|
16
|
-
*
|
17
|
-
* If you don't config your own deadLetterQueue, this will create a dlq for you, also a lambda function, a s3 bucket
|
18
|
-
* and an alarm for the queue. Anything that goes to the dlq will be written into the bucket and the alarm is activated.
|
19
|
-
*/
|
20
|
-
class DigitrafficSqsQueue extends aws_sqs_1.Queue {
|
21
|
-
constructor(scope, name, props) {
|
22
|
-
super(scope, name, props);
|
23
|
-
}
|
24
|
-
static create(stack, name, props) {
|
25
|
-
const queueName = `${stack.configuration.shortName}-${name}-Queue`;
|
26
|
-
const queueProps = { ...props, ...{
|
27
|
-
encryption: aws_sqs_1.QueueEncryption.KMS_MANAGED,
|
28
|
-
queueName,
|
29
|
-
deadLetterQueue: props.deadLetterQueue || {
|
30
|
-
maxReceiveCount: 2,
|
31
|
-
queue: DigitrafficDLQueue.create(stack, name),
|
32
|
-
},
|
33
|
-
} };
|
34
|
-
return new DigitrafficSqsQueue(stack, queueName, queueProps);
|
35
|
-
}
|
36
|
-
}
|
37
|
-
exports.DigitrafficSqsQueue = DigitrafficSqsQueue;
|
38
|
-
class DigitrafficDLQueue {
|
39
|
-
static create(stack, name) {
|
40
|
-
const dlqName = `${stack.configuration.shortName}-${name}-DLQ`;
|
41
|
-
const dlq = new DigitrafficSqsQueue(stack, dlqName, {
|
42
|
-
queueName: dlqName,
|
43
|
-
visibilityTimeout: aws_cdk_lib_1.Duration.seconds(60),
|
44
|
-
encryption: aws_sqs_1.QueueEncryption.KMS_MANAGED,
|
45
|
-
});
|
46
|
-
const dlqBucket = new aws_s3_1.Bucket(stack, `${dlqName}-Bucket`, {
|
47
|
-
blockPublicAccess: aws_s3_1.BlockPublicAccess.BLOCK_ALL,
|
48
|
-
});
|
49
|
-
const dlqFunctionName = `${dlqName}-Function`;
|
50
|
-
const lambda = monitoredfunction_1.MonitoredFunction.create(stack, dlqFunctionName, {
|
51
|
-
runtime: aws_lambda_1.Runtime.NODEJS_14_X,
|
52
|
-
logRetention: aws_logs_1.RetentionDays.ONE_YEAR,
|
53
|
-
functionName: dlqFunctionName,
|
54
|
-
code: getDlqCode(dlqBucket.bucketName),
|
55
|
-
timeout: aws_cdk_lib_1.Duration.seconds(10),
|
56
|
-
handler: 'index.handler',
|
57
|
-
memorySize: 128,
|
58
|
-
reservedConcurrentExecutions: 1,
|
59
|
-
});
|
60
|
-
const statement = new aws_iam_1.PolicyStatement();
|
61
|
-
statement.addActions('s3:PutObject');
|
62
|
-
statement.addActions('s3:PutObjectAcl');
|
63
|
-
statement.addResources(dlqBucket.bucketArn + '/*');
|
64
|
-
lambda.addToRolePolicy(statement);
|
65
|
-
lambda.addEventSource(new aws_lambda_event_sources_1.SqsEventSource(dlq));
|
66
|
-
addDLQAlarm(stack, dlqName, dlq);
|
67
|
-
return dlq;
|
68
|
-
}
|
69
|
-
}
|
70
|
-
exports.DigitrafficDLQueue = DigitrafficDLQueue;
|
71
|
-
function addDLQAlarm(stack, dlqName, dlq) {
|
72
|
-
const alarmName = `${dlqName}-Alarm`;
|
73
|
-
dlq.metricNumberOfMessagesReceived({
|
74
|
-
period: aws_cdk_lib_1.Duration.minutes(5),
|
75
|
-
}).createAlarm(stack, alarmName, {
|
76
|
-
alarmName,
|
77
|
-
threshold: 0,
|
78
|
-
evaluationPeriods: 1,
|
79
|
-
treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING,
|
80
|
-
comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD,
|
81
|
-
}).addAlarmAction(new aws_cloudwatch_actions_1.SnsAction(stack.warningTopic));
|
82
|
-
}
|
83
|
-
function getDlqCode(bName) {
|
84
|
-
const functionBody = DLQ_LAMBDA_CODE
|
85
|
-
.replace("__bucketName__", bName)
|
86
|
-
.replace("__upload__", uploadToS3.toString())
|
87
|
-
.replace("__doUpload__", doUpload.toString())
|
88
|
-
.replace("__handler__", createHandler().toString().substring(23)); // remove function handler() from signature
|
89
|
-
return new aws_lambda_1.InlineCode(functionBody);
|
90
|
-
}
|
91
|
-
async function uploadToS3(s3, bName, body, objectName) {
|
92
|
-
try {
|
93
|
-
console.info('writing %s to %s', objectName, bName);
|
94
|
-
await doUpload(s3, bName, body, objectName);
|
95
|
-
}
|
96
|
-
catch (error) {
|
97
|
-
console.warn(error);
|
98
|
-
console.warn('method=uploadToS3 retrying upload to bucket %s', bName);
|
99
|
-
try {
|
100
|
-
await doUpload(s3, bName, body, objectName);
|
101
|
-
}
|
102
|
-
catch (e2) {
|
103
|
-
console.error('method=uploadToS3 failed retrying upload to bucket %s', bName);
|
104
|
-
}
|
105
|
-
}
|
106
|
-
}
|
107
|
-
function doUpload(s3, bName, Body, Key) {
|
108
|
-
return s3.upload({
|
109
|
-
Bucket: bName, Body, Key,
|
110
|
-
}).promise();
|
111
|
-
}
|
112
|
-
// bucketName is unused, will be overridden in the actual lambda code below
|
113
|
-
const bucketName = '';
|
114
|
-
function createHandler() {
|
115
|
-
return async function handler(event) {
|
116
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
117
|
-
const AWS = require('aws-sdk');
|
118
|
-
const millis = new Date().getTime();
|
119
|
-
await Promise.all(event.Records.map((e, idx) => uploadToS3(new AWS.S3(), bucketName, e.body, `dlq-${millis}-${idx}.json`)));
|
120
|
-
};
|
121
|
-
}
|
122
|
-
const DLQ_LAMBDA_CODE = `const AWS = require('aws-sdk');
|
123
|
-
const bucketName = "__bucketName__";
|
124
|
-
|
125
|
-
__upload__
|
126
|
-
__doUpload__
|
127
|
-
|
128
|
-
exports.handler = async (event) => __handler__
|
129
|
-
`;
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FzLXF1ZXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2F3cy9pbmZyYS9zcXMtcXVldWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQXVFO0FBQ3ZFLDZDQUFxQztBQUNyQywrQ0FBNkQ7QUFDN0QsaURBQW9EO0FBQ3BELHVEQUEyRDtBQUMzRCxtREFBbUQ7QUFDbkQsbUZBQW9FO0FBQ3BFLCtEQUFnRjtBQUNoRiwrRUFBNkQ7QUFNN0QsaUVBQTREO0FBRTVEOzs7OztHQUtHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxlQUFLO0lBQzFDLFlBQVksS0FBZ0IsRUFBRSxJQUFZLEVBQUUsS0FBaUI7UUFDekQsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBdUIsRUFBRSxJQUFZLEVBQUUsS0FBaUI7UUFDbEUsTUFBTSxTQUFTLEdBQUcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxJQUFJLFFBQVEsQ0FBQztRQUNuRSxNQUFNLFVBQVUsR0FBRyxFQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUc7Z0JBQzdCLFVBQVUsRUFBRSx5QkFBZSxDQUFDLFdBQVc7Z0JBQ3ZDLFNBQVM7Z0JBQ1QsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLElBQUk7b0JBQ3RDLGVBQWUsRUFBRSxDQUFDO29CQUNsQixLQUFLLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7aUJBQ2hEO2FBQ0osRUFBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNKO0FBbEJELGtEQWtCQztBQUVELE1BQWEsa0JBQWtCO0lBQzNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBdUIsRUFBRSxJ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TSxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFZLEVBQUUsR0FBVyxFQUFFLEVBQUUsQ0FDOUQsVUFBVSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFNLGVBQWUsR0FBRzs7Ozs7OztDQU92QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtRdWV1ZSwgUXVldWVFbmNyeXB0aW9uLCBRdWV1ZVByb3BzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiO1xuaW1wb3J0IHtEdXJhdGlvbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge0Jsb2NrUHVibGljQWNjZXNzLCBCdWNrZXR9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7UG9saWN5U3RhdGVtZW50fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtJbmxpbmVDb2RlLCBSdW50aW1lfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtSZXRlbnRpb25EYXlzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCB7U3FzRXZlbnRTb3VyY2V9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXNcIjtcbmltcG9ydCB7Q29tcGFyaXNvbk9wZXJhdG9yLCBUcmVhdE1pc3NpbmdEYXRhfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7U25zQWN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gtYWN0aW9uc1wiO1xuaW1wb3J0IHtNYW5hZ2VkVXBsb2FkfSBmcm9tIFwiYXdzLXNkay9jbGllbnRzL3MzXCI7XG5pbXBvcnQge1MzfSBmcm9tIFwiYXdzLXNka1wiO1xuaW1wb3J0IHtTUVNFdmVudCwgU1FTSGFuZGxlciwgU1FTUmVjb3JkfSBmcm9tIFwiYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtDb25zdHJ1Y3R9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge0RpZ2l0cmFmZmljU3RhY2t9IGZyb20gXCIuL3N0YWNrL3N0YWNrXCI7XG5pbXBvcnQge01vbml0b3JlZEZ1bmN0aW9ufSBmcm9tIFwiLi9zdGFjay9tb25pdG9yZWRmdW5jdGlvblwiO1xuXG4vKipcbiAqIENvbnN0cnVjdCBmb3IgY3JlYXRpbmcgU1FTLXF1ZXVlcy5cbiAqXG4gKiBJZiB5b3UgZG9uJ3QgY29uZmlnIHlvdXIgb3duIGRlYWRMZXR0ZXJRdWV1ZSwgdGhpcyB3aWxsIGNyZWF0ZSBhIGRscSBmb3IgeW91LCBhbHNvIGEgbGFtYmRhIGZ1bmN0aW9uLCBhIHMzIGJ1Y2tldFxuICogYW5kIGFuIGFsYXJtIGZvciB0aGUgcXVldWUuICBBbnl0aGluZyB0aGF0IGdvZXMgdG8gdGhlIGRscSB3aWxsIGJlIHdyaXR0ZW4gaW50byB0aGUgYnVja2V0IGFuZCB0aGUgYWxhcm0gaXMgYWN0aXZhdGVkLlxuICovXG5leHBvcnQgY2xhc3MgRGlnaXRyYWZmaWNTcXNRdWV1ZSBleHRlbmRzIFF1ZXVlIHtcbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBuYW1lOiBzdHJpbmcsIHByb3BzOiBRdWV1ZVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBuYW1lLCBwcm9wcyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShzdGFjazogRGlnaXRyYWZmaWNTdGFjaywgbmFtZTogc3RyaW5nLCBwcm9wczogUXVldWVQcm9wcyk6IERpZ2l0cmFmZmljU3FzUXVldWUge1xuICAgICAgICBjb25zdCBxdWV1ZU5hbWUgPSBgJHtzdGFjay5jb25maWd1cmF0aW9uLnNob3J0TmFtZX0tJHtuYW1lfS1RdWV1ZWA7XG4gICAgICAgIGNvbnN0IHF1ZXVlUHJvcHMgPSB7Li4ucHJvcHMsIC4uLntcbiAgICAgICAgICAgIGVuY3J5cHRpb246IFF1ZXVlRW5jcnlwdGlvbi5LTVNfTUFOQUdFRCxcbiAgICAgICAgICAgIHF1ZXVlTmFtZSxcbiAgICAgICAgICAgIGRlYWRMZXR0ZXJRdWV1ZTogcHJvcHMuZGVhZExldHRlclF1ZXVlIHx8IHtcbiAgICAgICAgICAgICAgICBtYXhSZWNlaXZlQ291bnQ6IDIsXG4gICAgICAgICAgICAgICAgcXVldWU6IERpZ2l0cmFmZmljRExRdWV1ZS5jcmVhdGUoc3RhY2ssIG5hbWUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfX07XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEaWdpdHJhZmZpY1Nxc1F1ZXVlKHN0YWNrLCBxdWV1ZU5hbWUsIHF1ZXVlUHJvcHMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpZ2l0cmFmZmljRExRdWV1ZSB7XG4gICAgc3RhdGljIGNyZWF0ZShzdGFjazogRGlnaXRyYWZmaWNTdGFjaywgbmFtZTogc3RyaW5nKTogRGlnaXRyYWZmaWNTcXNRdWV1ZSB7XG4gICAgICAgIGNvbnN0IGRscU5hbWUgPSBgJHtzdGFjay5jb25maWd1cmF0aW9uLnNob3J0TmFtZX0tJHtuYW1lfS1ETFFgO1xuXG4gICAgICAgIGNvbnN0IGRscSA9IG5ldyBEaWdpdHJhZmZpY1Nxc1F1ZXVlKHN0YWNrLCBkbHFOYW1lLCB7XG4gICAgICAgICAgICBxdWV1ZU5hbWU6IGRscU5hbWUsXG4gICAgICAgICAgICB2aXNpYmlsaXR5VGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBRdWV1ZUVuY3J5cHRpb24uS01TX01BTkFHRUQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRscUJ1Y2tldCA9IG5ldyBCdWNrZXQoc3RhY2ssIGAke2RscU5hbWV9LUJ1Y2tldGAsIHtcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRscUZ1bmN0aW9uTmFtZSA9IGAke2RscU5hbWV9LUZ1bmN0aW9uYDtcbiAgICAgICAgY29uc3QgbGFtYmRhID0gTW9uaXRvcmVkRnVuY3Rpb24uY3JlYXRlKHN0YWNrLCBkbHFGdW5jdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX1lFQVIsXG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGRscUZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIGNvZGU6IGdldERscUNvZGUoZGxxQnVja2V0LmJ1Y2tldE5hbWUpLFxuICAgICAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICAgICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiAxLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzdGF0ZW1lbnQgPSBuZXcgUG9saWN5U3RhdGVtZW50KCk7XG4gICAgICAgIHN0YXRlbWVudC5hZGRBY3Rpb25zKCdzMzpQdXRPYmplY3QnKTtcbiAgICAgICAgc3RhdGVtZW50LmFkZEFjdGlvbnMoJ3MzOlB1dE9iamVjdEFjbCcpO1xuICAgICAgICBzdGF0ZW1lbnQuYWRkUmVzb3VyY2VzKGRscUJ1Y2tldC5idWNrZXRBcm4gKyAnLyonKTtcblxuICAgICAgICBsYW1iZGEuYWRkVG9Sb2xlUG9saWN5KHN0YXRlbWVudCk7XG4gICAgICAgIGxhbWJkYS5hZGRFdmVudFNvdXJjZShuZXcgU3FzRXZlbnRTb3VyY2UoZGxxKSk7XG5cbiAgICAgICAgYWRkRExRQWxhcm0oc3RhY2ssIGRscU5hbWUsIGRscSk7XG5cbiAgICAgICAgcmV0dXJuIGRscTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZERMUUFsYXJtKHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLCBkbHFOYW1lOiBzdHJpbmcsIGRscTogUXVldWUpIHtcbiAgICBjb25zdCBhbGFybU5hbWUgPSBgJHtkbHFOYW1lfS1BbGFybWA7XG4gICAgZGxxLm1ldHJpY051bWJlck9mTWVzc2FnZXNSZWNlaXZlZCh7XG4gICAgICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICB9KS5jcmVhdGVBbGFybShzdGFjaywgYWxhcm1OYW1lLCB7XG4gICAgICAgIGFsYXJtTmFtZSxcbiAgICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HLFxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgIH0pLmFkZEFsYXJtQWN0aW9uKG5ldyBTbnNBY3Rpb24oc3RhY2sud2FybmluZ1RvcGljKSk7XG59XG5cbmZ1bmN0aW9uIGdldERscUNvZGUoYk5hbWU6IHN0cmluZyk6IElubGluZUNvZGUge1xuICAgIGNvbnN0IGZ1bmN0aW9uQm9keSA9IERMUV9MQU1CREFfQ09ERVxuICAgICAgICAucmVwbGFjZShcIl9fYnVja2V0TmFtZV9fXCIsIGJOYW1lKVxuICAgICAgICAucmVwbGFjZShcIl9fdXBsb2FkX19cIiwgdXBsb2FkVG9TMy50b1N0cmluZygpKVxuICAgICAgICAucmVwbGFjZShcIl9fZG9VcGxvYWRfX1wiLCBkb1VwbG9hZC50b1N0cmluZygpKVxuICAgICAgICAucmVwbGFjZShcIl9faGFuZGxlcl9fXCIsIGNyZWF0ZUhhbmRsZXIoKS50b1N0cmluZygpLnN1YnN0cmluZygyMykpOyAvLyByZW1vdmUgZnVuY3Rpb24gaGFuZGxlcigpIGZyb20gc2lnbmF0dXJlXG5cbiAgICByZXR1cm4gbmV3IElubGluZUNvZGUoZnVuY3Rpb25Cb2R5KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkVG9TMyhzMzogUzMsIGJOYW1lOiBzdHJpbmcsIGJvZHk6IHN0cmluZywgb2JqZWN0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5pbmZvKCd3cml0aW5nICVzIHRvICVzJywgb2JqZWN0TmFtZSwgYk5hbWUpO1xuICAgICAgICBhd2FpdCBkb1VwbG9hZChzMywgYk5hbWUsIGJvZHksIG9iamVjdE5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgIGNvbnNvbGUud2FybignbWV0aG9kPXVwbG9hZFRvUzMgcmV0cnlpbmcgdXBsb2FkIHRvIGJ1Y2tldCAlcycsIGJOYW1lKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGRvVXBsb2FkKHMzLCBiTmFtZSwgYm9keSwgb2JqZWN0TmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdtZXRob2Q9dXBsb2FkVG9TMyBmYWlsZWQgcmV0cnlpbmcgdXBsb2FkIHRvIGJ1Y2tldCAlcycsIGJOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZG9VcGxvYWQoczM6IFMzLCBiTmFtZTogc3RyaW5nLCBCb2R5OiBzdHJpbmcsIEtleTogc3RyaW5nKTogUHJvbWlzZTxNYW5hZ2VkVXBsb2FkLlNlbmREYXRhPiB7XG4gICAgcmV0dXJuIHMzLnVwbG9hZCh7XG4gICAgICAgIEJ1Y2tldDogYk5hbWUsIEJvZHksIEtleSxcbiAgICB9KS5wcm9taXNlKCk7XG59XG5cbi8vIGJ1Y2tldE5hbWUgaXMgdW51c2VkLCB3aWxsIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGFjdHVhbCBsYW1iZGEgY29kZSBiZWxvd1xuY29uc3QgYnVja2V0TmFtZSA9ICcnO1xuXG5mdW5jdGlvbiBjcmVhdGVIYW5kbGVyKCk6IFNRU0hhbmRsZXIge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBTUVNFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgICAgICBjb25zdCBBV1MgPSByZXF1aXJlKCdhd3Mtc2RrJyk7XG5cbiAgICAgICAgY29uc3QgbWlsbGlzID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGV2ZW50LlJlY29yZHMubWFwKChlOiBTUVNSZWNvcmQsIGlkeDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgdXBsb2FkVG9TMyhuZXcgQVdTLlMzKCksIGJ1Y2tldE5hbWUsIGUuYm9keSwgYGRscS0ke21pbGxpc30tJHtpZHh9Lmpzb25gKSkpO1xuICAgIH07XG59XG5cbmNvbnN0IERMUV9MQU1CREFfQ09ERSA9IGBjb25zdCBBV1MgPSByZXF1aXJlKCdhd3Mtc2RrJyk7XG5jb25zdCBidWNrZXROYW1lID0gXCJfX2J1Y2tldE5hbWVfX1wiO1xuXG5fX3VwbG9hZF9fXG5fX2RvVXBsb2FkX19cblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiBfX2hhbmRsZXJfX1xuYDtcbiJdfQ==
|
@@ -1,93 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.defaultLambdaConfiguration = exports.dbLambdaConfiguration = exports.lambdaFunctionProps = exports.databaseFunctionProps = void 0;
|
4
|
-
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
5
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
6
|
-
const aws_logs_1 = require("aws-cdk-lib/aws-logs");
|
7
|
-
function databaseFunctionProps(stack, environment, lambdaName, simpleLambdaName, config) {
|
8
|
-
const vpcSubnets = stack.vpc ? {
|
9
|
-
subnets: stack.vpc.privateSubnets,
|
10
|
-
} : undefined;
|
11
|
-
return { ...lambdaFunctionProps(stack, environment, lambdaName, simpleLambdaName, config), ...{
|
12
|
-
vpc: stack.vpc || undefined,
|
13
|
-
vpcSubnets,
|
14
|
-
securityGroup: stack.lambdaDbSg || undefined,
|
15
|
-
} };
|
16
|
-
}
|
17
|
-
exports.databaseFunctionProps = databaseFunctionProps;
|
18
|
-
function lambdaFunctionProps(stack, environment, lambdaName, simpleLambdaName, config) {
|
19
|
-
return {
|
20
|
-
runtime: config?.runtime || aws_lambda_1.Runtime.NODEJS_14_X,
|
21
|
-
architecture: config?.architecture || aws_lambda_1.Architecture.ARM_64,
|
22
|
-
memorySize: config?.memorySize || 128,
|
23
|
-
functionName: lambdaName,
|
24
|
-
role: config?.role,
|
25
|
-
timeout: aws_cdk_lib_1.Duration.seconds(config?.timeout || 60),
|
26
|
-
logRetention: aws_logs_1.RetentionDays.ONE_YEAR,
|
27
|
-
reservedConcurrentExecutions: config?.reservedConcurrentExecutions || 2,
|
28
|
-
code: getAssetCode(simpleLambdaName, config),
|
29
|
-
handler: `${simpleLambdaName}.handler`,
|
30
|
-
environment,
|
31
|
-
};
|
32
|
-
}
|
33
|
-
exports.lambdaFunctionProps = lambdaFunctionProps;
|
34
|
-
function getAssetCode(simpleLambdaName, config) {
|
35
|
-
const lambdaPath = config?.singleLambda ? `dist/lambda/` : `dist/lambda/${simpleLambdaName}`;
|
36
|
-
return new aws_lambda_1.AssetCode(lambdaPath);
|
37
|
-
}
|
38
|
-
/**
|
39
|
-
* Creates a base configuration for a Lambda that uses an RDS database
|
40
|
-
* @param vpc "Private" Lambdas are associated with a VPC
|
41
|
-
* @param lambdaDbSg Security Group shared by Lambda and RDS
|
42
|
-
* @param props Database connection properties for the Lambda
|
43
|
-
* @param config Lambda configuration
|
44
|
-
*/
|
45
|
-
function dbLambdaConfiguration(vpc, lambdaDbSg, props, config) {
|
46
|
-
return {
|
47
|
-
runtime: props.runtime || aws_lambda_1.Runtime.NODEJS_14_X,
|
48
|
-
memorySize: props.memorySize || config.memorySize || 1024,
|
49
|
-
functionName: config.functionName,
|
50
|
-
code: config.code,
|
51
|
-
role: config.role,
|
52
|
-
handler: config.handler,
|
53
|
-
timeout: aws_cdk_lib_1.Duration.seconds(config.timeout || props.defaultLambdaDurationSeconds || 60),
|
54
|
-
environment: config.environment || {
|
55
|
-
DB_USER: props.dbProps?.username,
|
56
|
-
DB_PASS: props.dbProps?.password,
|
57
|
-
DB_URI: (config.readOnly ? props.dbProps?.ro_uri : props.dbProps?.uri),
|
58
|
-
},
|
59
|
-
logRetention: aws_logs_1.RetentionDays.ONE_YEAR,
|
60
|
-
vpc: vpc,
|
61
|
-
vpcSubnets: {
|
62
|
-
subnets: vpc.privateSubnets,
|
63
|
-
},
|
64
|
-
securityGroups: [lambdaDbSg],
|
65
|
-
reservedConcurrentExecutions: config.reservedConcurrentExecutions || 3,
|
66
|
-
};
|
67
|
-
}
|
68
|
-
exports.dbLambdaConfiguration = dbLambdaConfiguration;
|
69
|
-
function defaultLambdaConfiguration(config) {
|
70
|
-
const props = {
|
71
|
-
runtime: aws_lambda_1.Runtime.NODEJS_14_X,
|
72
|
-
memorySize: config.memorySize ?? 128,
|
73
|
-
functionName: config.functionName,
|
74
|
-
handler: config.handler,
|
75
|
-
environment: config.environment ?? {},
|
76
|
-
logRetention: aws_logs_1.RetentionDays.ONE_YEAR,
|
77
|
-
reservedConcurrentExecutions: config.reservedConcurrentExecutions,
|
78
|
-
code: config.code,
|
79
|
-
role: config.role,
|
80
|
-
timeout: aws_cdk_lib_1.Duration.seconds(config.timeout || 10),
|
81
|
-
};
|
82
|
-
if (config.vpc) {
|
83
|
-
return { ...props, ...{
|
84
|
-
vpc: config.vpc,
|
85
|
-
vpcSubnets: {
|
86
|
-
subnets: config.vpc?.privateSubnets,
|
87
|
-
},
|
88
|
-
} };
|
89
|
-
}
|
90
|
-
return props;
|
91
|
-
}
|
92
|
-
exports.defaultLambdaConfiguration = defaultLambdaConfiguration;
|
93
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWNvbmZpZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXdzL2luZnJhL3N0YWNrL2xhbWJkYS1jb25maWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUE2RjtBQUM3Riw2Q0FBcUM7QUFFckMsbURBQW1EO0FBZ0NuRCxTQUFnQixxQkFBcUIsQ0FDakMsS0FBdUIsRUFBRSxXQUE4QixFQUFFLFVBQWtCLEVBQUUsZ0JBQXdCLEVBQUUsTUFBMkI7SUFFbEksTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0IsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBYztLQUNwQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFZCxPQUFPLEVBQUMsR0FBRyxtQkFBbUIsQ0FDMUIsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxDQUMzRCxFQUFFLEdBQUc7WUFDRixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxTQUFTO1lBQzNCLFVBQVU7WUFDVixhQUFhLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxTQUFTO1NBQy9DLEVBQUMsQ0FBQztBQUNQLENBQUM7QUFkRCxzREFjQztBQUVELFNBQWdCLG1CQUFtQixDQUMvQixLQUF1QixFQUFFLFdBQThCLEVBQUUsVUFBa0IsRUFBRSxnQkFBd0IsRUFBRSxNQUEyQjtJQUVsSSxPQUFPO1FBQ0gsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLElBQUksb0JBQU8sQ0FBQyxXQUFXO1FBQy9DLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxJQUFJLHlCQUFZLENBQUMsTUFBTTtRQUN6RCxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsSUFBSSxHQUFHO1FBQ3JDLFlBQVksRUFBRSxVQUFVO1FBQ3hCLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSTtRQUNsQixP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LEdBQUcsS0FBSyxFQUFFLEdBQUc7Z0JBQ2pCLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsY0FBYztpQkFDdEM7YUFDSixFQUFDLENBQUM7S0FDTjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUF0QkQsZ0VBc0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcmNoaXRlY3R1cmUsIEFzc2V0Q29kZSwgQ29kZSwgRnVuY3Rpb25Qcm9wcywgUnVudGltZX0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XHJcbmltcG9ydCB7RHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xyXG5pbXBvcnQge0lTZWN1cml0eUdyb3VwLCBJVnBjLCBTdWJuZXRTZWxlY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XHJcbmltcG9ydCB7UmV0ZW50aW9uRGF5c30gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xyXG5pbXBvcnQge1JvbGV9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xyXG5pbXBvcnQge0RpZ2l0cmFmZmljU3RhY2t9IGZyb20gXCIuL3N0YWNrXCI7XHJcbmltcG9ydCB7TW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzfSBmcm9tIFwiLi9tb25pdG9yZWRmdW5jdGlvblwiO1xyXG5cclxuZXhwb3J0IHR5cGUgTGFtYmRhRW52aXJvbm1lbnQgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG5cclxuZXhwb3J0IHR5cGUgREJMYW1iZGFFbnZpcm9ubWVudCA9IExhbWJkYUVudmlyb25tZW50ICYge1xyXG4gICAgU0VDUkVUX0lEPzogc3RyaW5nXHJcbiAgICBEQl9BUFBMSUNBVElPTjogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhQ29uZmlndXJhdGlvbiB7XHJcbiAgICB2cGNJZDogc3RyaW5nO1xyXG4gICAgYWxsb3dGcm9tSXBBZGRyZXNzZXM/OiBzdHJpbmdbXTtcclxuICAgIHByaXZhdGVTdWJuZXRJZHM6IHN0cmluZ1tdO1xyXG4gICAgYXZhaWxhYmlsaXR5Wm9uZXM6IHN0cmluZ1tdO1xyXG4gICAgbGFtYmRhRGJTZ0lkOiBzdHJpbmc7XHJcbiAgICBkYlByb3BzPzogRGJQcm9wcztcclxuICAgIGRlZmF1bHRMYW1iZGFEdXJhdGlvblNlY29uZHM/OiBudW1iZXI7XHJcbiAgICBsb2dzRGVzdGluYXRpb25Bcm46IHN0cmluZztcclxuICAgIG1lbW9yeVNpemU/OiBudW1iZXIsXHJcbiAgICBydW50aW1lPzogUnVudGltZTtcclxufVxyXG5cclxuZGVjbGFyZSBpbnRlcmZhY2UgRGJQcm9wcyB7XHJcbiAgICB1c2VybmFtZTogc3RyaW5nO1xyXG4gICAgcGFzc3dvcmQ6IHN0cmluZztcclxuICAgIHVyaT86IHN0cmluZztcclxuICAgIHJvX3VyaT86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFiYXNlRnVuY3Rpb25Qcm9wcyhcclxuICAgIHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLCBlbnZpcm9ubWVudDogTGFtYmRhRW52aXJvbm1lbnQsIGxhbWJkYU5hbWU6IHN0cmluZywgc2ltcGxlTGFtYmRhTmFtZTogc3RyaW5nLCBjb25maWc/OiBGdW5jdGlvblBhcmFtZXRlcnMsXHJcbik6IEZ1bmN0aW9uUHJvcHMge1xyXG4gICAgY29uc3QgdnBjU3VibmV0cyA9IHN0YWNrLnZwYyA/IHtcclxuICAgICAgICBzdWJuZXRzOiBzdGFjay52cGMucHJpdmF0ZVN1Ym5ldHMsXHJcbiAgICB9IDogdW5kZWZpbmVkO1xyXG5cclxuICAgIHJldHVybiB7Li4ubGFtYmRhRnVuY3Rpb25Qcm9wcyhcclxuICAgICAgICBzdGFjaywgZW52aXJvbm1lbnQsIGxhbWJkYU5hbWUsIHNpbXBsZUxhbWJkYU5hbWUsIGNvbmZpZyxcclxuICAgICksIC4uLntcclxuICAgICAgICB2cGM6IHN0YWNrLnZwYyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgdnBjU3VibmV0cyxcclxuICAgICAgICBzZWN1cml0eUdyb3VwOiBzdGFjay5sYW1iZGFEYlNnIHx8IHVuZGVmaW5lZCxcclxuICAgIH19O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbGFtYmRhRnVuY3Rpb25Qcm9wcyhcclxuICAgIHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLCBlbnZpcm9ubWVudDogTGFtYmRhRW52aXJvbm1lbnQsIGxhbWJkYU5hbWU6IHN0cmluZywgc2ltcGxlTGFtYmRhTmFtZTogc3RyaW5nLCBjb25maWc/OiBGdW5jdGlvblBhcmFtZXRlcnMsXHJcbik6IEZ1bmN0aW9uUHJvcHMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBydW50aW1lOiBjb25maWc/LnJ1bnRpbWUgfHwgUnVudGltZS5OT0RFSlNfMTRfWCxcclxuICAgICAgICBhcmNoaXRlY3R1cmU6IGNvbmZpZz8uYXJjaGl0ZWN0dXJlIHx8IEFyY2hpdGVjdHVyZS5BUk1fNjQsXHJcbiAgICAgICAgbWVtb3J5U2l6ZTogY29uZmlnPy5tZW1vcnlTaXplIHx8IDEyOCxcclxuICAgICAgICBmdW5jdGlvbk5hbWU6IGxhbWJkYU5hbWUsXHJcbiAgICAgICAgcm9sZTogY29uZmlnPy5yb2xlLFxyXG4gICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoY29uZmlnPy50aW1lb3V0IHx8IDYwKSxcclxuICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX1lFQVIsXHJcbiAgICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogY29uZmlnPy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zIHx8IDIsXHJcbiAgICAgICAgY29kZTogZ2V0QXNzZXRDb2RlKHNpbXBsZUxhbWJkYU5hbWUsIGNvbmZpZyksXHJcbiAgICAgICAgaGFuZGxlcjogYCR7c2ltcGxlTGFtYmRhTmFtZX0uaGFuZGxlcmAsXHJcbiAgICAgICAgZW52aXJvbm1lbnQsXHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRBc3NldENvZGUoc2ltcGxlTGFtYmRhTmFtZTogc3RyaW5nLCBjb25maWc/OiBGdW5jdGlvblBhcmFtZXRlcnMpOiBBc3NldENvZGUge1xyXG4gICAgY29uc3QgbGFtYmRhUGF0aCA9IGNvbmZpZz8uc2luZ2xlTGFtYmRhID8gYGRpc3QvbGFtYmRhL2AgOiBgZGlzdC9sYW1iZGEvJHtzaW1wbGVMYW1iZGFOYW1lfWA7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBBc3NldENvZGUobGFtYmRhUGF0aCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgYmFzZSBjb25maWd1cmF0aW9uIGZvciBhIExhbWJkYSB0aGF0IHVzZXMgYW4gUkRTIGRhdGFiYXNlXHJcbiAqIEBwYXJhbSB2cGMgXCJQcml2YXRlXCIgTGFtYmRhcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgVlBDXHJcbiAqIEBwYXJhbSBsYW1iZGFEYlNnIFNlY3VyaXR5IEdyb3VwIHNoYXJlZCBieSBMYW1iZGEgYW5kIFJEU1xyXG4gKiBAcGFyYW0gcHJvcHMgRGF0YWJhc2UgY29ubmVjdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgTGFtYmRhXHJcbiAqIEBwYXJhbSBjb25maWcgTGFtYmRhIGNvbmZpZ3VyYXRpb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkYkxhbWJkYUNvbmZpZ3VyYXRpb24odnBjOiBJVnBjLFxyXG4gICAgbGFtYmRhRGJTZzogSVNlY3VyaXR5R3JvdXAsXHJcbiAgICBwcm9wczogTGFtYmRhQ29uZmlndXJhdGlvbixcclxuICAgIGNvbmZpZzogRnVuY3Rpb25QYXJhbWV0ZXJzKTogRnVuY3Rpb25Qcm9wcyB7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBydW50aW1lOiBwcm9wcy5ydW50aW1lIHx8IFJ1bnRpbWUuTk9ERUpTXzE0X1gsXHJcbiAgICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSB8fCBjb25maWcubWVtb3J5U2l6ZSB8fCAxMDI0LFxyXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogY29uZmlnLmZ1bmN0aW9uTmFtZSxcclxuICAgICAgICBjb2RlOiBjb25maWcuY29kZSBhcyBDb2RlLFxyXG4gICAgICAgIHJvbGU6IGNvbmZpZy5yb2xlLFxyXG4gICAgICAgIGhhbmRsZXI6IGNvbmZpZy5oYW5kbGVyIGFzIHN0cmluZyxcclxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKGNvbmZpZy50aW1lb3V0IHx8IHByb3BzLmRlZmF1bHRMYW1iZGFEdXJhdGlvblNlY29uZHMgfHwgNjApLFxyXG4gICAgICAgIGVudmlyb25tZW50OiBjb25maWcuZW52aXJvbm1lbnQgfHwge1xyXG4gICAgICAgICAgICBEQl9VU0VSOiBwcm9wcy5kYlByb3BzPy51c2VybmFtZSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgIERCX1BBU1M6IHByb3BzLmRiUHJvcHM/LnBhc3N3b3JkIGFzIHN0cmluZyxcclxuICAgICAgICAgICAgREJfVVJJOiAoY29uZmlnLnJlYWRPbmx5ID8gcHJvcHMuZGJQcm9wcz8ucm9fdXJpIDogcHJvcHMuZGJQcm9wcz8udXJpKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX1lFQVIsXHJcbiAgICAgICAgdnBjOiB2cGMsXHJcbiAgICAgICAgdnBjU3VibmV0czoge1xyXG4gICAgICAgICAgICBzdWJuZXRzOiB2cGMucHJpdmF0ZVN1Ym5ldHMsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZWN1cml0eUdyb3VwczogW2xhbWJkYURiU2ddLFxyXG4gICAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM6IGNvbmZpZy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zIHx8IDMsXHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdExhbWJkYUNvbmZpZ3VyYXRpb24oY29uZmlnOiBGdW5jdGlvblBhcmFtZXRlcnMpOiBGdW5jdGlvblByb3BzIHtcclxuICAgIGNvbnN0IHByb3BzOiBGdW5jdGlvblByb3BzID0ge1xyXG4gICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzE0X1gsXHJcbiAgICAgICAgbWVtb3J5U2l6ZTogY29uZmlnLm1lbW9yeVNpemUgPz8gMTI4LFxyXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogY29uZmlnLmZ1bmN0aW9uTmFtZSxcclxuICAgICAgICBoYW5kbGVyOiBjb25maWcuaGFuZGxlciBhcyBzdHJpbmcsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6IGNvbmZpZy5lbnZpcm9ubWVudCA/PyB7fSxcclxuICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX1lFQVIsXHJcbiAgICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogY29uZmlnLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXHJcbiAgICAgICAgY29kZTogY29uZmlnLmNvZGUgYXMgQ29kZSxcclxuICAgICAgICByb2xlOiBjb25maWcucm9sZSxcclxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKGNvbmZpZy50aW1lb3V0IHx8IDEwKSxcclxuICAgIH07XHJcbiAgICBpZiAoY29uZmlnLnZwYykge1xyXG4gICAgICAgIHJldHVybiB7Li4ucHJvcHMsIC4uLntcclxuICAgICAgICAgICAgdnBjOiBjb25maWcudnBjLFxyXG4gICAgICAgICAgICB2cGNTdWJuZXRzOiB7XHJcbiAgICAgICAgICAgICAgICBzdWJuZXRzOiBjb25maWcudnBjPy5wcml2YXRlU3VibmV0cyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9fTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcm9wcztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblBhcmFtZXRlcnMge1xyXG4gICAgbWVtb3J5U2l6ZT86IG51bWJlcjtcclxuICAgIHRpbWVvdXQ/OiBudW1iZXI7XHJcbiAgICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XHJcbiAgICBjb2RlPzogQ29kZTtcclxuICAgIGhhbmRsZXI/OiBzdHJpbmc7XHJcbiAgICByZWFkT25seT86IGJvb2xlYW47XHJcbiAgICBlbnZpcm9ubWVudD86IHtcclxuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XHJcbiAgICB9O1xyXG4gICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcclxuICAgIHJvbGU/OiBSb2xlO1xyXG4gICAgdnBjPzogSVZwYztcclxuICAgIHZwY1N1Ym5ldHM/OiBTdWJuZXRTZWxlY3Rpb247XHJcbiAgICBydW50aW1lPzogUnVudGltZTtcclxuICAgIGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZTtcclxuICAgIHNpbmdsZUxhbWJkYT86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE1vbml0b3JlZEZ1bmN0aW9uUGFyYW1ldGVycyA9IHtcclxuICAgIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XHJcbiAgICByZWFkb25seSB0aW1lb3V0PzogbnVtYmVyO1xyXG4gICAgcmVhZG9ubHkgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcclxuICAgIHJlYWRvbmx5IHJvbGU/OiBSb2xlO1xyXG4gICAgcmVhZG9ubHkgcnVudGltZT86IFJ1bnRpbWU7XHJcbiAgICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XHJcbiAgICByZWFkb25seSBzaW5nbGVMYW1iZGE/OiBib29sZWFuO1xyXG5cclxuICAgIHJlYWRvbmx5IGR1cmF0aW9uQWxhcm1Qcm9wcz86IE1vbml0b3JlZEZ1bmN0aW9uQWxhcm1Qcm9wc1xyXG4gICAgcmVhZG9ubHkgZHVyYXRpb25XYXJuaW5nUHJvcHM/OiBNb25pdG9yZWRGdW5jdGlvbkFsYXJtUHJvcHNcclxuICAgIHJlYWRvbmx5IGVycm9yQWxhcm1Qcm9wcz86IE1vbml0b3JlZEZ1bmN0aW9uQWxhcm1Qcm9wc1xyXG4gICAgcmVhZG9ubHkgdGhyb3R0bGVBbGFybVByb3BzPzogTW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzXHJcbn1cclxuIl19
|
@@ -1,135 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.MonitoredDBFunction = exports.MonitoredFunction = void 0;
|
4
|
-
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
5
|
-
const aws_cloudwatch_actions_1 = require("aws-cdk-lib/aws-cloudwatch-actions");
|
6
|
-
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
7
|
-
const lambda_configs_1 = require("../stack/lambda-configs");
|
8
|
-
const change_case_1 = require("change-case");
|
9
|
-
const subscription_1 = require("../stack/subscription");
|
10
|
-
/**
|
11
|
-
* Creates a Lambda function that monitors default CloudWatch Lambda metrics with CloudWatch Alarms.
|
12
|
-
*/
|
13
|
-
class MonitoredFunction extends aws_lambda_1.Function {
|
14
|
-
/**
|
15
|
-
* @param scope Stack
|
16
|
-
* @param id Lambda construct Id
|
17
|
-
* @param functionProps Lambda function properties
|
18
|
-
* @param alarmSnsTopic SNS topic for alarms
|
19
|
-
* @param warningSnsTopic SNS topic for warnings
|
20
|
-
* @param production Is the stack a production stack, used for determining the alarm topic
|
21
|
-
* @param trafficType Traffic type, used for alarm names. Set to null if Lambda is not related to any traffic type.
|
22
|
-
* @param props Monitored function properties
|
23
|
-
*/
|
24
|
-
constructor(scope, id, functionProps, alarmSnsTopic, warningSnsTopic, production, trafficType, props) {
|
25
|
-
super(scope, id, functionProps);
|
26
|
-
this.givenName = functionProps.functionName;
|
27
|
-
const alarmSnsAction = new aws_cloudwatch_actions_1.SnsAction(alarmSnsTopic);
|
28
|
-
const warningSnsAction = new aws_cloudwatch_actions_1.SnsAction(warningSnsTopic);
|
29
|
-
if (props?.durationAlarmProps?.create !== false) {
|
30
|
-
if (!functionProps.timeout) {
|
31
|
-
throw new Error('Timeout needs to be explicitly set');
|
32
|
-
}
|
33
|
-
this.createAlarm(scope, this.metricDuration().with({ statistic: 'max' }), 'Duration', 'Duration alarm', `Duration has exceeded ${functionProps.timeout.toSeconds()} seconds`, trafficType, this.getAlarmActionForEnv(alarmSnsAction, warningSnsAction, production), functionProps.timeout.toMilliseconds(), 1, 1, aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, props?.durationAlarmProps);
|
34
|
-
}
|
35
|
-
if (props?.durationWarningProps?.create !== false) {
|
36
|
-
if (!functionProps.timeout) {
|
37
|
-
throw new Error('Timeout needs to be explicitly set');
|
38
|
-
}
|
39
|
-
this.createAlarm(scope, this.metricDuration().with({ statistic: 'max' }), 'Duration-Warning', 'Duration warning', `Duration is 85 % of max ${functionProps.timeout.toSeconds()} seconds`, trafficType, warningSnsAction, functionProps.timeout.toMilliseconds() * 0.85, 1, 1, aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, props?.durationWarningProps);
|
40
|
-
}
|
41
|
-
if (props?.errorAlarmProps?.create !== false) {
|
42
|
-
this.createAlarm(scope, this.metricErrors(), 'Errors', 'Errors alarm', 'Invocations did not succeed', trafficType, this.getAlarmActionForEnv(alarmSnsAction, warningSnsAction, production), 1, 1, 1, aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, props?.errorAlarmProps);
|
43
|
-
}
|
44
|
-
if (props?.throttleAlarmProps?.create !== false) {
|
45
|
-
this.createAlarm(scope, this.metricThrottles(), 'Throttles', 'Throttles alarm', 'Has throttled', trafficType, this.getAlarmActionForEnv(alarmSnsAction, warningSnsAction, production), 0, 1, 1, aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD, props?.throttleAlarmProps);
|
46
|
-
}
|
47
|
-
}
|
48
|
-
/**
|
49
|
-
* Create new MonitoredFunction. Use topics from given DigitrafficStack.
|
50
|
-
*
|
51
|
-
* @param stack DigitrafficStack
|
52
|
-
* @param id Lambda construct Id
|
53
|
-
* @param functionProps Lambda function properties
|
54
|
-
* @param props Monitored function properties
|
55
|
-
*/
|
56
|
-
static create(stack, id, functionProps, props) {
|
57
|
-
if (props === MonitoredFunction.DISABLE_ALARMS && stack.configuration.production) {
|
58
|
-
throw new Error(`Function ${functionProps.functionName} has DISABLE_ALARMS. Remove before installing to production or define your own properties!`);
|
59
|
-
}
|
60
|
-
return new MonitoredFunction(stack, id, functionProps, stack.alarmTopic, stack.warningTopic, stack.configuration.production, stack.configuration.trafficType, props);
|
61
|
-
}
|
62
|
-
/**
|
63
|
-
* Create new MonitoredFunction. Use topics from given DigitrafficStack. Generate names from given name and configuration shortName.
|
64
|
-
*
|
65
|
-
* For example, shortName FOO and given name update-things will create function FOO-UpdateThings and use code from lambda/update-things/update-things.ts method handler.
|
66
|
-
*
|
67
|
-
* @param stack DigitrafficStack
|
68
|
-
* @param name param-case name
|
69
|
-
* @param environment Lambda environment
|
70
|
-
* @param functionParameters Lambda function parameters
|
71
|
-
*/
|
72
|
-
static createV2(stack, name, environment, functionParameters) {
|
73
|
-
const functionName = functionParameters?.functionName || `${stack.configuration.shortName}-${(0, change_case_1.pascalCase)(name)}`;
|
74
|
-
const functionProps = (0, lambda_configs_1.databaseFunctionProps)(stack, environment, functionName, name, functionParameters);
|
75
|
-
return MonitoredFunction.create(stack, functionName, functionProps, functionParameters);
|
76
|
-
}
|
77
|
-
createAlarm(stack, metric, alarmId, alarmName, alarmDescription, trafficType, alarmSnsAction, threshold, evaluationPeriods, datapointsToAlarm, comparisonOperator, alarmProps) {
|
78
|
-
metric.createAlarm(stack, `${this.node.id}-${alarmId}`, {
|
79
|
-
alarmName: `${trafficType ?? ''} ${stack.stackName} ${this.functionName} ${alarmName}`.trim(),
|
80
|
-
alarmDescription,
|
81
|
-
threshold: alarmProps?.threshold ?? threshold,
|
82
|
-
evaluationPeriods: alarmProps?.evaluationPeriods ?? evaluationPeriods,
|
83
|
-
datapointsToAlarm: alarmProps?.datapointsToAlarm ?? datapointsToAlarm,
|
84
|
-
comparisonOperator: alarmProps?.comparisonOperator ?? comparisonOperator,
|
85
|
-
}).addAlarmAction(alarmSnsAction);
|
86
|
-
}
|
87
|
-
getAlarmActionForEnv(alarmAction, warningAction, production) {
|
88
|
-
return production ? alarmAction : warningAction;
|
89
|
-
}
|
90
|
-
}
|
91
|
-
exports.MonitoredFunction = MonitoredFunction;
|
92
|
-
/** disable all alarms */
|
93
|
-
MonitoredFunction.DISABLE_ALARMS = {
|
94
|
-
durationAlarmProps: {
|
95
|
-
create: false,
|
96
|
-
},
|
97
|
-
durationWarningProps: {
|
98
|
-
create: false,
|
99
|
-
},
|
100
|
-
errorAlarmProps: {
|
101
|
-
create: false,
|
102
|
-
},
|
103
|
-
throttleAlarmProps: {
|
104
|
-
create: false,
|
105
|
-
},
|
106
|
-
};
|
107
|
-
class MonitoredDBFunction {
|
108
|
-
/**
|
109
|
-
* Create new MonitoredDBFunction. Use topics from given DigitrafficStack. Generate names from given name and configuration shortName.
|
110
|
-
* Grant secret and create log subscription.
|
111
|
-
*
|
112
|
-
* For example, shortName FOO and given name update-things will create function FOO-UpdateThings and use code from lambda/update-things/update-things.ts method handler.
|
113
|
-
*
|
114
|
-
* If you don't need to pass any extra arguments to lambda-environment, you can leave environment out and this function will create the
|
115
|
-
* default Lambda Environment with SECRET_ID and DB_APPLICATION.
|
116
|
-
*
|
117
|
-
* @param stack DigitrafficStack
|
118
|
-
* @param name param-case name
|
119
|
-
* @param environment Lambda environment
|
120
|
-
* @param functionParameters Lambda function parameters
|
121
|
-
*/
|
122
|
-
static create(stack, name, environment, functionParameters) {
|
123
|
-
const functionName = functionParameters?.functionName || `${stack.configuration.shortName}-${(0, change_case_1.pascalCase)(name)}`;
|
124
|
-
const env = environment ? environment : stack.createLambdaEnvironment();
|
125
|
-
const functionProps = (0, lambda_configs_1.databaseFunctionProps)(stack, env, functionName, name, functionParameters);
|
126
|
-
const mf = MonitoredFunction.create(stack, functionName, functionProps, functionParameters);
|
127
|
-
stack.grantSecret(mf);
|
128
|
-
if (stack.configuration.logsDestinationArn) {
|
129
|
-
new subscription_1.DigitrafficLogSubscriptions(stack, mf);
|
130
|
-
}
|
131
|
-
return mf;
|
132
|
-
}
|
133
|
-
}
|
134
|
-
exports.MonitoredDBFunction = MonitoredDBFunction;
|
135
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmVkZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXdzL2luZnJhL3N0YWNrL21vbml0b3JlZGZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUErRDtBQUUvRCwrRUFBNkQ7QUFDN0QsK0RBQXNFO0FBR3RFLDREQUE4RztBQUM5Ryw2Q0FBdUM7QUFDdkMsd0RBQWtFO0FBK0JsRTs7R0FFRztBQUNILE1BQWEsaUJBQWtCLFNBQVEscUJBQVE7SUFzRTNDOzs7Ozs7Ozs7T0FTRztJQUNILFlBQ0ksS0FBWSxFQUNaLEVBQVUsRUFDVixhQUE0QixFQUM1QixhQUFxQixFQUNyQixlQUF1QixFQUN2QixVQUFtQixFQUNuQixXQUErQixFQUMvQixLQUE4QjtRQUU5QixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxZQUFzQixDQUFDO1FBRXRELE1BQU0sY0FBYyxHQUFHLElBQUksa0NBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwRCxNQUFNLGdCQUFnQixHQUFHLElBQUksa0NBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV4RCxJQUFJLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEtBQUssS0FBSyxFQUFFO1lBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFO2dCQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7YUFDekQ7WUFFRCxJQUFJLENBQUMsV0FBVyxDQUNaLEtBQUssRUFDTCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLEVBQzlDLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIseUJBQXlCLGFBQWEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVB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QUEyQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM5QztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztDQUNKO0FBbkNELGtEQW1DQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RnVuY3Rpb24sIEZ1bmN0aW9uUHJvcHN9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHtTdGFja30gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1Nuc0FjdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoLWFjdGlvbnNcIjtcbmltcG9ydCB7Q29tcGFyaXNvbk9wZXJhdG9yLCBNZXRyaWN9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0IHtEaWdpdHJhZmZpY1N0YWNrfSBmcm9tIFwiLi4vc3RhY2svc3RhY2tcIjtcbmltcG9ydCB7SVRvcGljfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNuc1wiO1xuaW1wb3J0IHtkYXRhYmFzZUZ1bmN0aW9uUHJvcHMsIExhbWJkYUVudmlyb25tZW50LCBNb25pdG9yZWRGdW5jdGlvblBhcmFtZXRlcnN9IGZyb20gXCIuLi9zdGFjay9sYW1iZGEtY29uZmlnc1wiO1xuaW1wb3J0IHtwYXNjYWxDYXNlfSBmcm9tIFwiY2hhbmdlLWNhc2VcIjtcbmltcG9ydCB7RGlnaXRyYWZmaWNMb2dTdWJzY3JpcHRpb25zfSBmcm9tIFwiLi4vc3RhY2svc3Vic2NyaXB0aW9uXCI7XG5pbXBvcnQge1RyYWZmaWNUeXBlfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXMvdHJhZmZpY3R5cGVcIjtcblxuLyoqXG4gKiBBbGxvd3MgY3VzdG9taXphdGlvbiBvZiBDbG91ZFdhdGNoIEFsYXJtIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgTW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzID0ge1xuICAgIC8qKlxuICAgICAqIFNldHRpbmcgdGhpcyB0byBmYWxzZSB3aWxsIG5vdCBjcmVhdGUgYSBDbG91ZFdhdGNoIGFsYXJtXG4gICAgICovXG4gICAgcmVhZG9ubHkgY3JlYXRlOiBib29sZWFuXG5cbiAgICByZWFkb25seSB0aHJlc2hvbGQ/OiBudW1iZXJcblxuICAgIHJlYWRvbmx5IGV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyXG5cbiAgICByZWFkb25seSBkYXRhcG9pbnRzVG9BbGFybT86IG51bWJlclxuXG4gICAgcmVhZG9ubHkgY29tcGFyaXNvbk9wZXJhdG9yPzogQ29tcGFyaXNvbk9wZXJhdG9yXG59XG5cbmV4cG9ydCB0eXBlIE1vbml0b3JlZEZ1bmN0aW9uUHJvcHMgPSB7XG4gICAgcmVhZG9ubHkgZHVyYXRpb25BbGFybVByb3BzPzogTW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzXG5cbiAgICByZWFkb25seSBkdXJhdGlvbldhcm5pbmdQcm9wcz86IE1vbml0b3JlZEZ1bmN0aW9uQWxhcm1Qcm9wc1xuXG4gICAgcmVhZG9ubHkgZXJyb3JBbGFybVByb3BzPzogTW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzXG5cbiAgICByZWFkb25seSB0aHJvdHRsZUFsYXJtUHJvcHM/OiBNb25pdG9yZWRGdW5jdGlvbkFsYXJtUHJvcHNcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgbW9uaXRvcnMgZGVmYXVsdCBDbG91ZFdhdGNoIExhbWJkYSBtZXRyaWNzIHdpdGggQ2xvdWRXYXRjaCBBbGFybXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb25pdG9yZWRGdW5jdGlvbiBleHRlbmRzIEZ1bmN0aW9uIHtcbiAgICByZWFkb25seSBnaXZlbk5hbWU6IHN0cmluZztcblxuICAgIC8qKiBkaXNhYmxlIGFsbCBhbGFybXMgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERJU0FCTEVfQUxBUk1TOiBNb25pdG9yZWRGdW5jdGlvblByb3BzID0ge1xuICAgICAgICBkdXJhdGlvbkFsYXJtUHJvcHM6IHtcbiAgICAgICAgICAgIGNyZWF0ZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGR1cmF0aW9uV2FybmluZ1Byb3BzOiB7XG4gICAgICAgICAgICBjcmVhdGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvckFsYXJtUHJvcHM6IHtcbiAgICAgICAgICAgIGNyZWF0ZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHRocm90dGxlQWxhcm1Qcm9wczoge1xuICAgICAgICAgICAgY3JlYXRlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIG5ldyBNb25pdG9yZWRGdW5jdGlvbi4gIFVzZSB0b3BpY3MgZnJvbSBnaXZlbiBEaWdpdHJhZmZpY1N0YWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YWNrIERpZ2l0cmFmZmljU3RhY2tcbiAgICAgKiBAcGFyYW0gaWQgTGFtYmRhIGNvbnN0cnVjdCBJZFxuICAgICAqIEBwYXJhbSBmdW5jdGlvblByb3BzIExhbWJkYSBmdW5jdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIHByb3BzIE1vbml0b3JlZCBmdW5jdGlvbiBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShzdGFjazogRGlnaXRyYWZmaWNTdGFjayxcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgZnVuY3Rpb25Qcm9wczogRnVuY3Rpb25Qcm9wcyxcbiAgICAgICAgcHJvcHM/OiBNb25pdG9yZWRGdW5jdGlvblByb3BzKTogTW9uaXRvcmVkRnVuY3Rpb24ge1xuXG4gICAgICAgIGlmIChwcm9wcyA9PT0gTW9uaXRvcmVkRnVuY3Rpb24uRElTQUJMRV9BTEFSTVMgJiYgc3RhY2suY29uZmlndXJhdGlvbi5wcm9kdWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uICR7ZnVuY3Rpb25Qcm9wcy5mdW5jdGlvbk5hbWV9IGhhcyBESVNBQkxFX0FMQVJNUy4gIFJlbW92ZSBiZWZvcmUgaW5zdGFsbGluZyB0byBwcm9kdWN0aW9uIG9yIGRlZmluZSB5b3VyIG93biBwcm9wZXJ0aWVzIWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNb25pdG9yZWRGdW5jdGlvbihcbiAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBmdW5jdGlvblByb3BzLFxuICAgICAgICAgICAgc3RhY2suYWxhcm1Ub3BpYyxcbiAgICAgICAgICAgIHN0YWNrLndhcm5pbmdUb3BpYyxcbiAgICAgICAgICAgIHN0YWNrLmNvbmZpZ3VyYXRpb24ucHJvZHVjdGlvbixcbiAgICAgICAgICAgIHN0YWNrLmNvbmZpZ3VyYXRpb24udHJhZmZpY1R5cGUsXG4gICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgbmV3IE1vbml0b3JlZEZ1bmN0aW9uLiAgVXNlIHRvcGljcyBmcm9tIGdpdmVuIERpZ2l0cmFmZmljU3RhY2suICBHZW5lcmF0ZSBuYW1lcyBmcm9tIGdpdmVuIG5hbWUgYW5kIGNvbmZpZ3VyYXRpb24gc2hvcnROYW1lLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIHNob3J0TmFtZSBGT08gYW5kIGdpdmVuIG5hbWUgdXBkYXRlLXRoaW5ncyB3aWxsIGNyZWF0ZSBmdW5jdGlvbiBGT08tVXBkYXRlVGhpbmdzIGFuZCB1c2UgY29kZSBmcm9tIGxhbWJkYS91cGRhdGUtdGhpbmdzL3VwZGF0ZS10aGluZ3MudHMgbWV0aG9kIGhhbmRsZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhY2sgRGlnaXRyYWZmaWNTdGFja1xuICAgICAqIEBwYXJhbSBuYW1lIHBhcmFtLWNhc2UgbmFtZVxuICAgICAqIEBwYXJhbSBlbnZpcm9ubWVudCBMYW1iZGEgZW52aXJvbm1lbnRcbiAgICAgKiBAcGFyYW0gZnVuY3Rpb25QYXJhbWV0ZXJzIExhbWJkYSBmdW5jdGlvbiBwYXJhbWV0ZXJzXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVYyKHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIGVudmlyb25tZW50OiBMYW1iZGFFbnZpcm9ubWVudCxcbiAgICAgICAgZnVuY3Rpb25QYXJhbWV0ZXJzPzogTW9uaXRvcmVkRnVuY3Rpb25QYXJhbWV0ZXJzKTogTW9uaXRvcmVkRnVuY3Rpb24ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvblBhcmFtZXRlcnM/LmZ1bmN0aW9uTmFtZSB8fCBgJHtzdGFjay5jb25maWd1cmF0aW9uLnNob3J0TmFtZX0tJHtwYXNjYWxDYXNlKG5hbWUpfWA7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uUHJvcHMgPSBkYXRhYmFzZUZ1bmN0aW9uUHJvcHMoXG4gICAgICAgICAgICBzdGFjaywgZW52aXJvbm1lbnQsIGZ1bmN0aW9uTmFtZSwgbmFtZSwgZnVuY3Rpb25QYXJhbWV0ZXJzLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBNb25pdG9yZWRGdW5jdGlvbi5jcmVhdGUoc3RhY2ssIGZ1bmN0aW9uTmFtZSwgZnVuY3Rpb25Qcm9wcywgZnVuY3Rpb25QYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gc2NvcGUgU3RhY2tcbiAgICAgKiBAcGFyYW0gaWQgTGFtYmRhIGNvbnN0cnVjdCBJZFxuICAgICAqIEBwYXJhbSBmdW5jdGlvblByb3BzIExhbWJkYSBmdW5jdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIGFsYXJtU25zVG9waWMgU05TIHRvcGljIGZvciBhbGFybXNcbiAgICAgKiBAcGFyYW0gd2FybmluZ1Nuc1RvcGljIFNOUyB0b3BpYyBmb3Igd2FybmluZ3NcbiAgICAgKiBAcGFyYW0gcHJvZHVjdGlvbiBJcyB0aGUgc3RhY2sgYSBwcm9kdWN0aW9uIHN0YWNrLCB1c2VkIGZvciBkZXRlcm1pbmluZyB0aGUgYWxhcm0gdG9waWNcbiAgICAgKiBAcGFyYW0gdHJhZmZpY1R5cGUgVHJhZmZpYyB0eXBlLCB1c2VkIGZvciBhbGFybSBuYW1lcy4gU2V0IHRvIG51bGwgaWYgTGFtYmRhIGlzIG5vdCByZWxhdGVkIHRvIGFueSB0cmFmZmljIHR5cGUuXG4gICAgICogQHBhcmFtIHByb3BzIE1vbml0b3JlZCBmdW5jdGlvbiBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHNjb3BlOiBTdGFjayxcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgZnVuY3Rpb25Qcm9wczogRnVuY3Rpb25Qcm9wcyxcbiAgICAgICAgYWxhcm1TbnNUb3BpYzogSVRvcGljLFxuICAgICAgICB3YXJuaW5nU25zVG9waWM6IElUb3BpYyxcbiAgICAgICAgcHJvZHVjdGlvbjogYm9vbGVhbixcbiAgICAgICAgdHJhZmZpY1R5cGU6IFRyYWZmaWNUeXBlIHwgbnVsbCxcbiAgICAgICAgcHJvcHM/OiBNb25pdG9yZWRGdW5jdGlvblByb3BzLFxuICAgICkge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIGZ1bmN0aW9uUHJvcHMpO1xuXG4gICAgICAgIHRoaXMuZ2l2ZW5OYW1lID0gZnVuY3Rpb25Qcm9wcy5mdW5jdGlvbk5hbWUgYXMgc3RyaW5nO1xuXG4gICAgICAgIGNvbnN0IGFsYXJtU25zQWN0aW9uID0gbmV3IFNuc0FjdGlvbihhbGFybVNuc1RvcGljKTtcbiAgICAgICAgY29uc3Qgd2FybmluZ1Nuc0FjdGlvbiA9IG5ldyBTbnNBY3Rpb24od2FybmluZ1Nuc1RvcGljKTtcblxuICAgICAgICBpZiAocHJvcHM/LmR1cmF0aW9uQWxhcm1Qcm9wcz8uY3JlYXRlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKCFmdW5jdGlvblByb3BzLnRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RpbWVvdXQgbmVlZHMgdG8gYmUgZXhwbGljaXRseSBzZXQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVBbGFybShcbiAgICAgICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ldHJpY0R1cmF0aW9uKCkud2l0aCh7c3RhdGlzdGljOiAnbWF4J30pLFxuICAgICAgICAgICAgICAgICdEdXJhdGlvbicsXG4gICAgICAgICAgICAgICAgJ0R1cmF0aW9uIGFsYXJtJyxcbiAgICAgICAgICAgICAgICBgRHVyYXRpb24gaGFzIGV4Y2VlZGVkICR7ZnVuY3Rpb25Qcm9wcy50aW1lb3V0LnRvU2Vjb25kcygpfSBzZWNvbmRzYCxcbiAgICAgICAgICAgICAgICB0cmFmZmljVHlwZSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFsYXJtQWN0aW9uRm9yRW52KGFsYXJtU25zQWN0aW9uLCB3YXJuaW5nU25zQWN0aW9uLCBwcm9kdWN0aW9uKSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvblByb3BzLnRpbWVvdXQudG9NaWxsaXNlY29uZHMoKSxcbiAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgICAgICAgICAgcHJvcHM/LmR1cmF0aW9uQWxhcm1Qcm9wcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BzPy5kdXJhdGlvbldhcm5pbmdQcm9wcz8uY3JlYXRlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKCFmdW5jdGlvblByb3BzLnRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RpbWVvdXQgbmVlZHMgdG8gYmUgZXhwbGljaXRseSBzZXQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVBbGFybShcbiAgICAgICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ldHJpY0R1cmF0aW9uKCkud2l0aCh7c3RhdGlzdGljOiAnbWF4J30pLFxuICAgICAgICAgICAgICAgICdEdXJhdGlvbi1XYXJuaW5nJyxcbiAgICAgICAgICAgICAgICAnRHVyYXRpb24gd2FybmluZycsXG4gICAgICAgICAgICAgICAgYER1cmF0aW9uIGlzIDg1ICUgb2YgbWF4ICR7ZnVuY3Rpb25Qcm9wcy50aW1lb3V0LnRvU2Vjb25kcygpfSBzZWNvbmRzYCxcbiAgICAgICAgICAgICAgICB0cmFmZmljVHlwZSxcbiAgICAgICAgICAgICAgICB3YXJuaW5nU25zQWN0aW9uLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uUHJvcHMudGltZW91dC50b01pbGxpc2Vjb25kcygpICogMC44NSxcbiAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgICAgICAgICAgcHJvcHM/LmR1cmF0aW9uV2FybmluZ1Byb3BzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wcz8uZXJyb3JBbGFybVByb3BzPy5jcmVhdGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFsYXJtKFxuICAgICAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgICAgIHRoaXMubWV0cmljRXJyb3JzKCksXG4gICAgICAgICAgICAgICAgJ0Vycm9ycycsXG4gICAgICAgICAgICAgICAgJ0Vycm9ycyBhbGFybScsXG4gICAgICAgICAgICAgICAgJ0ludm9jYXRpb25zIGRpZCBub3Qgc3VjY2VlZCcsXG4gICAgICAgICAgICAgICAgdHJhZmZpY1R5cGUsXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRBbGFybUFjdGlvbkZvckVudihhbGFybVNuc0FjdGlvbiwgd2FybmluZ1Nuc0FjdGlvbiwgcHJvZHVjdGlvbiksXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgICAgICAgICAgcHJvcHM/LmVycm9yQWxhcm1Qcm9wcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcHM/LnRocm90dGxlQWxhcm1Qcm9wcz8uY3JlYXRlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVBbGFybShcbiAgICAgICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ldHJpY1Rocm90dGxlcygpLFxuICAgICAgICAgICAgICAgICdUaHJvdHRsZXMnLFxuICAgICAgICAgICAgICAgICdUaHJvdHRsZXMgYWxhcm0nLFxuICAgICAgICAgICAgICAgICdIYXMgdGhyb3R0bGVkJyxcbiAgICAgICAgICAgICAgICB0cmFmZmljVHlwZSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFsYXJtQWN0aW9uRm9yRW52KGFsYXJtU25zQWN0aW9uLCB3YXJuaW5nU25zQWN0aW9uLCBwcm9kdWN0aW9uKSxcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICBDb21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgICAgICAgICAgICBwcm9wcz8udGhyb3R0bGVBbGFybVByb3BzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQWxhcm0oXG4gICAgICAgIHN0YWNrOiBTdGFjayxcbiAgICAgICAgbWV0cmljOiBNZXRyaWMsXG4gICAgICAgIGFsYXJtSWQ6IHN0cmluZyxcbiAgICAgICAgYWxhcm1OYW1lOiBzdHJpbmcsXG4gICAgICAgIGFsYXJtRGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAgICAgdHJhZmZpY1R5cGU6IFRyYWZmaWNUeXBlIHwgbnVsbCxcbiAgICAgICAgYWxhcm1TbnNBY3Rpb246IFNuc0FjdGlvbixcbiAgICAgICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBudW1iZXIsXG4gICAgICAgIGRhdGFwb2ludHNUb0FsYXJtOiBudW1iZXIsXG4gICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgICAgICBhbGFybVByb3BzPzogTW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzLFxuICAgICkge1xuICAgICAgICBtZXRyaWMuY3JlYXRlQWxhcm0oc3RhY2ssIGAke3RoaXMubm9kZS5pZH0tJHthbGFybUlkfWAsIHtcbiAgICAgICAgICAgIGFsYXJtTmFtZTogYCR7dHJhZmZpY1R5cGUgPz8gJyd9ICR7c3RhY2suc3RhY2tOYW1lfSAke3RoaXMuZnVuY3Rpb25OYW1lfSAke2FsYXJtTmFtZX1gLnRyaW0oKSxcbiAgICAgICAgICAgIGFsYXJtRGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IGFsYXJtUHJvcHM/LnRocmVzaG9sZCA/PyB0aHJlc2hvbGQsXG4gICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogYWxhcm1Qcm9wcz8uZXZhbHVhdGlvblBlcmlvZHMgPz8gZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTogYWxhcm1Qcm9wcz8uZGF0YXBvaW50c1RvQWxhcm0gPz8gZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGFsYXJtUHJvcHM/LmNvbXBhcmlzb25PcGVyYXRvciA/PyBjb21wYXJpc29uT3BlcmF0b3IsXG4gICAgICAgIH0pLmFkZEFsYXJtQWN0aW9uKGFsYXJtU25zQWN0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFsYXJtQWN0aW9uRm9yRW52KGFsYXJtQWN0aW9uOiBTbnNBY3Rpb24sXG4gICAgICAgIHdhcm5pbmdBY3Rpb246IFNuc0FjdGlvbixcbiAgICAgICAgcHJvZHVjdGlvbjogYm9vbGVhbik6IFNuc0FjdGlvbiB7XG5cbiAgICAgICAgcmV0dXJuIHByb2R1Y3Rpb24gPyBhbGFybUFjdGlvbiA6IHdhcm5pbmdBY3Rpb247XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTW9uaXRvcmVkREJGdW5jdGlvbiB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIG5ldyBNb25pdG9yZWREQkZ1bmN0aW9uLiAgVXNlIHRvcGljcyBmcm9tIGdpdmVuIERpZ2l0cmFmZmljU3RhY2suICBHZW5lcmF0ZSBuYW1lcyBmcm9tIGdpdmVuIG5hbWUgYW5kIGNvbmZpZ3VyYXRpb24gc2hvcnROYW1lLlxuICAgICAqIEdyYW50IHNlY3JldCBhbmQgY3JlYXRlIGxvZyBzdWJzY3JpcHRpb24uXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgc2hvcnROYW1lIEZPTyBhbmQgZ2l2ZW4gbmFtZSB1cGRhdGUtdGhpbmdzIHdpbGwgY3JlYXRlIGZ1bmN0aW9uIEZPTy1VcGRhdGVUaGluZ3MgYW5kIHVzZSBjb2RlIGZyb20gbGFtYmRhL3VwZGF0ZS10aGluZ3MvdXBkYXRlLXRoaW5ncy50cyBtZXRob2QgaGFuZGxlci5cbiAgICAgKlxuICAgICAqIElmIHlvdSBkb24ndCBuZWVkIHRvIHBhc3MgYW55IGV4dHJhIGFyZ3VtZW50cyB0byBsYW1iZGEtZW52aXJvbm1lbnQsIHlvdSBjYW4gbGVhdmUgZW52aXJvbm1lbnQgb3V0IGFuZCB0aGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIHRoZVxuICAgICAqIGRlZmF1bHQgTGFtYmRhIEVudmlyb25tZW50IHdpdGggU0VDUkVUX0lEIGFuZCBEQl9BUFBMSUNBVElPTi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGFjayBEaWdpdHJhZmZpY1N0YWNrXG4gICAgICogQHBhcmFtIG5hbWUgcGFyYW0tY2FzZSBuYW1lXG4gICAgICogQHBhcmFtIGVudmlyb25tZW50IExhbWJkYSBlbnZpcm9ubWVudFxuICAgICAqIEBwYXJhbSBmdW5jdGlvblBhcmFtZXRlcnMgTGFtYmRhIGZ1bmN0aW9uIHBhcmFtZXRlcnNcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIGVudmlyb25tZW50PzogTGFtYmRhRW52aXJvbm1lbnQsXG4gICAgICAgIGZ1bmN0aW9uUGFyYW1ldGVycz86IE1vbml0b3JlZEZ1bmN0aW9uUGFyYW1ldGVycyk6IE1vbml0b3JlZEZ1bmN0aW9uIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25QYXJhbWV0ZXJzPy5mdW5jdGlvbk5hbWUgfHwgYCR7c3RhY2suY29uZmlndXJhdGlvbi5zaG9ydE5hbWV9LSR7cGFzY2FsQ2FzZShuYW1lKX1gO1xuICAgICAgICBjb25zdCBlbnYgPSBlbnZpcm9ubWVudCA/IGVudmlyb25tZW50IDogc3RhY2suY3JlYXRlTGFtYmRhRW52aXJvbm1lbnQoKTtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25Qcm9wcyA9IGRhdGFiYXNlRnVuY3Rpb25Qcm9wcyhcbiAgICAgICAgICAgIHN0YWNrLCBlbnYsIGZ1bmN0aW9uTmFtZSwgbmFtZSwgZnVuY3Rpb25QYXJhbWV0ZXJzLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG1mID0gTW9uaXRvcmVkRnVuY3Rpb24uY3JlYXRlKHN0YWNrLCBmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uUHJvcHMsIGZ1bmN0aW9uUGFyYW1ldGVycyk7XG5cbiAgICAgICAgc3RhY2suZ3JhbnRTZWNyZXQobWYpO1xuXG4gICAgICAgIGlmIChzdGFjay5jb25maWd1cmF0aW9uLmxvZ3NEZXN0aW5hdGlvbkFybikge1xuICAgICAgICAgICAgbmV3IERpZ2l0cmFmZmljTG9nU3Vic2NyaXB0aW9ucyhzdGFjaywgbWYpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1mO1xuICAgIH1cbn1cbiJdfQ==
|