@digitraffic/common 2022.10.5-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/LICENSE +291 -0
- package/aws/infra/api/integration.d.ts +21 -0
- package/aws/infra/api/integration.js +52 -0
- package/aws/infra/api/response.d.ts +22 -0
- package/aws/infra/api/response.js +61 -0
- package/aws/infra/api/responses.d.ts +39 -0
- package/aws/infra/api/responses.js +79 -0
- package/aws/infra/api/static-integration.d.ts +15 -0
- package/aws/infra/api/static-integration.js +54 -0
- package/aws/infra/canaries/canary-alarm.d.ts +6 -0
- package/aws/infra/canaries/canary-alarm.js +26 -0
- package/aws/infra/canaries/canary-parameters.d.ts +18 -0
- package/aws/infra/canaries/canary-parameters.js +3 -0
- package/aws/infra/canaries/canary-role.d.ts +6 -0
- package/aws/infra/canaries/canary-role.js +46 -0
- package/aws/infra/canaries/canary.d.ts +8 -0
- package/aws/infra/canaries/canary.js +29 -0
- package/aws/infra/canaries/database-canary.d.ts +18 -0
- package/aws/infra/canaries/database-canary.js +55 -0
- package/aws/infra/canaries/database-checker.d.ts +21 -0
- package/aws/infra/canaries/database-checker.js +109 -0
- package/aws/infra/canaries/url-canary.d.ts +19 -0
- package/aws/infra/canaries/url-canary.js +46 -0
- package/aws/infra/canaries/url-checker.d.ts +46 -0
- package/aws/infra/canaries/url-checker.js +238 -0
- package/aws/infra/documentation.d.ts +56 -0
- package/aws/infra/documentation.js +95 -0
- package/aws/infra/scheduler.d.ts +12 -0
- package/aws/infra/scheduler.js +31 -0
- package/aws/infra/security-rule.d.ts +12 -0
- package/aws/infra/security-rule.js +39 -0
- package/aws/infra/sqs-integration.d.ts +7 -0
- package/aws/infra/sqs-integration.js +93 -0
- package/aws/infra/sqs-queue.d.ts +16 -0
- package/aws/infra/sqs-queue.js +130 -0
- package/aws/infra/stack/lambda-configs.d.ts +72 -0
- package/aws/infra/stack/lambda-configs.js +93 -0
- package/aws/infra/stack/monitoredfunction.d.ts +84 -0
- package/aws/infra/stack/monitoredfunction.js +135 -0
- package/aws/infra/stack/rest_apis.d.ts +40 -0
- package/aws/infra/stack/rest_apis.js +179 -0
- package/aws/infra/stack/stack-checking-aspect.d.ts +20 -0
- package/aws/infra/stack/stack-checking-aspect.js +163 -0
- package/aws/infra/stack/stack.d.ts +41 -0
- package/aws/infra/stack/stack.js +58 -0
- package/aws/infra/stack/subscription.d.ts +17 -0
- package/aws/infra/stack/subscription.js +41 -0
- package/aws/infra/usage-plans.d.ts +15 -0
- package/aws/infra/usage-plans.js +42 -0
- package/aws/runtime/apikey.d.ts +2 -0
- package/aws/runtime/apikey.js +13 -0
- package/aws/runtime/digitraffic-integration-response.d.ts +8 -0
- package/aws/runtime/digitraffic-integration-response.js +26 -0
- package/aws/runtime/messaging.d.ts +10 -0
- package/aws/runtime/messaging.js +31 -0
- package/aws/runtime/s3.d.ts +2 -0
- package/aws/runtime/s3.js +30 -0
- package/aws/runtime/secrets/dbsecret.d.ts +54 -0
- package/aws/runtime/secrets/dbsecret.js +96 -0
- package/aws/runtime/secrets/proxy-holder.d.ts +9 -0
- package/aws/runtime/secrets/proxy-holder.js +26 -0
- package/aws/runtime/secrets/rds-holder.d.ts +9 -0
- package/aws/runtime/secrets/rds-holder.js +26 -0
- package/aws/runtime/secrets/secret-holder.d.ts +26 -0
- package/aws/runtime/secrets/secret-holder.js +73 -0
- package/aws/runtime/secrets/secret.d.ts +8 -0
- package/aws/runtime/secrets/secret.js +43 -0
- package/aws/types/errors.d.ts +4 -0
- package/aws/types/errors.js +9 -0
- package/aws/types/lambda-response.d.ts +12 -0
- package/aws/types/lambda-response.js +28 -0
- package/aws/types/mediatypes.d.ts +10 -0
- package/aws/types/mediatypes.js +15 -0
- package/aws/types/model-with-reference.d.ts +7 -0
- package/aws/types/model-with-reference.js +3 -0
- package/aws/types/proxytypes.d.ts +26 -0
- package/aws/types/proxytypes.js +3 -0
- package/aws/types/tags.d.ts +2 -0
- package/aws/types/tags.js +7 -0
- package/database/cached.d.ts +7 -0
- package/database/cached.js +32 -0
- package/database/database.d.ts +19 -0
- package/database/database.js +62 -0
- package/database/last-updated.d.ts +16 -0
- package/database/last-updated.js +54 -0
- package/index.d.ts +1 -0
- package/index.js +18 -0
- package/marine/id_utils.d.ts +3 -0
- package/marine/id_utils.js +33 -0
- package/marine/rtz.d.ts +48 -0
- package/marine/rtz.js +3 -0
- package/package.json +55 -0
- package/src/aws/infra/api/integration.js +52 -0
- package/src/aws/infra/api/response.js +61 -0
- package/src/aws/infra/api/responses.js +79 -0
- package/src/aws/infra/api/static-integration.js +54 -0
- package/src/aws/infra/canaries/canary-alarm.js +26 -0
- package/src/aws/infra/canaries/canary-parameters.js +3 -0
- package/src/aws/infra/canaries/canary-role.js +46 -0
- package/src/aws/infra/canaries/canary.js +29 -0
- package/src/aws/infra/canaries/database-canary.js +55 -0
- package/src/aws/infra/canaries/database-checker.js +109 -0
- package/src/aws/infra/canaries/url-canary.js +46 -0
- package/src/aws/infra/canaries/url-checker.js +238 -0
- package/src/aws/infra/documentation.js +95 -0
- package/src/aws/infra/scheduler.js +31 -0
- package/src/aws/infra/security-rule.js +39 -0
- package/src/aws/infra/sqs-integration.js +93 -0
- package/src/aws/infra/sqs-queue.js +130 -0
- package/src/aws/infra/stack/lambda-configs.js +93 -0
- package/src/aws/infra/stack/monitoredfunction.js +135 -0
- package/src/aws/infra/stack/rest_apis.js +179 -0
- package/src/aws/infra/stack/stack-checking-aspect.js +163 -0
- package/src/aws/infra/stack/stack.js +58 -0
- package/src/aws/infra/stack/subscription.js +41 -0
- package/src/aws/infra/usage-plans.js +42 -0
- package/src/aws/runtime/apikey.js +13 -0
- package/src/aws/runtime/digitraffic-integration-response.js +26 -0
- package/src/aws/runtime/messaging.js +31 -0
- package/src/aws/runtime/s3.js +30 -0
- package/src/aws/runtime/secrets/dbsecret.js +96 -0
- package/src/aws/runtime/secrets/proxy-holder.js +26 -0
- package/src/aws/runtime/secrets/rds-holder.js +26 -0
- package/src/aws/runtime/secrets/secret-holder.js +73 -0
- package/src/aws/runtime/secrets/secret.js +43 -0
- package/src/aws/types/errors.js +9 -0
- package/src/aws/types/lambda-response.js +28 -0
- package/src/aws/types/mediatypes.js +15 -0
- package/src/aws/types/model-with-reference.js +3 -0
- package/src/aws/types/proxytypes.js +3 -0
- package/src/aws/types/tags.js +7 -0
- package/src/database/cached.js +32 -0
- package/src/database/database.js +62 -0
- package/src/database/last-updated.js +54 -0
- package/src/marine/id_utils.js +33 -0
- package/src/marine/rtz.js +3 -0
- package/src/test/asserter.js +45 -0
- package/src/test/db-testutils.js +31 -0
- package/src/test/httpserver.js +67 -0
- package/src/test/secret.js +25 -0
- package/src/test/secrets-manager.js +59 -0
- package/src/test/testutils.js +44 -0
- package/src/types/input-error.js +7 -0
- package/src/types/language.js +10 -0
- package/src/types/traffictype.js +13 -0
- package/src/types/validator.js +14 -0
- package/src/utils/api-model.js +129 -0
- package/src/utils/base64.js +21 -0
- package/src/utils/date-utils.js +34 -0
- package/src/utils/geojson-types.js +18 -0
- package/src/utils/geometry.js +140 -0
- package/src/utils/retry.js +50 -0
- package/src/utils/slack.js +25 -0
- package/src/utils/utils.js +40 -0
- package/test/asserter.d.ts +11 -0
- package/test/asserter.js +45 -0
- package/test/db-testutils.d.ts +2 -0
- package/test/db-testutils.js +31 -0
- package/test/httpserver.d.ts +18 -0
- package/test/httpserver.js +67 -0
- package/test/marine/id_utils.test.js +69 -0
- package/test/promise/promise.test.js +125 -0
- package/test/secret.d.ts +3 -0
- package/test/secret.js +25 -0
- package/test/secrets/dbsecret.test.js +71 -0
- package/test/secrets/secret-holder.test.js +124 -0
- package/test/secrets/secret.test.js +66 -0
- package/test/secrets-manager.d.ts +9 -0
- package/test/secrets-manager.js +59 -0
- package/test/test/httpserver.test.js +87 -0
- package/test/testutils.d.ts +12 -0
- package/test/testutils.js +44 -0
- package/test/utils/date-utils.test.js +51 -0
- package/test/utils/geometry.test.js +49 -0
- package/test/utils/utils.test.js +49 -0
- package/types/input-error.d.ts +2 -0
- package/types/input-error.js +7 -0
- package/types/language.d.ts +5 -0
- package/types/language.js +10 -0
- package/types/traffictype.d.ts +8 -0
- package/types/traffictype.js +13 -0
- package/types/validator.d.ts +4 -0
- package/types/validator.js +14 -0
- package/utils/api-model.d.ts +87 -0
- package/utils/api-model.js +129 -0
- package/utils/base64.d.ts +12 -0
- package/utils/base64.js +21 -0
- package/utils/date-utils.d.ts +17 -0
- package/utils/date-utils.js +34 -0
- package/utils/geojson-types.d.ts +14 -0
- package/utils/geojson-types.js +18 -0
- package/utils/geometry.d.ts +36 -0
- package/utils/geometry.js +140 -0
- package/utils/retry.d.ts +13 -0
- package/utils/retry.js +50 -0
- package/utils/slack.d.ts +5 -0
- package/utils/slack.js +25 -0
- package/utils/utils.d.ts +22 -0
- package/utils/utils.js +40 -0
- package/yarn.lock +3200 -0
|
@@ -0,0 +1,93 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FzLWludGVncmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9pbmZyYS9zcXMtaW50ZWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQWdDO0FBQ2hDLCtEQUEyRztBQUUzRyxpREFBNEU7QUFJNUUsU0FBZ0IsK0JBQStCLENBQzNDLEtBQWdCLEVBQ2hCLEtBQVksRUFDWixRQUFrQixFQUNsQixnQkFBa0MsRUFDbEMsWUFBb0IsRUFDcEIsY0FBdUIsRUFDdkIsYUFBeUM7SUFFekMsdUJBQXVCO0lBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksY0FBSSxDQUFDLEtBQUssRUFBRSxHQUFHLFlBQVkscUJBQXFCLEVBQUU7UUFDcEUsU0FBUyxFQUFFLElBQUksMEJBQWdCLENBQUMsMEJBQTBCLENBQUM7S0FDOUQsQ0FBQyxDQUFDO0lBQ0gsb0RBQW9EO0lBQ3BELFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSx5QkFBZSxDQUFDO1FBQ3RDLFNBQVMsRUFBRTtZQUNQLEtBQUssQ0FBQyxRQUFRO1NBQ2pCO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsaUJBQWlCO1NBQ3BCO0tBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSixxREFBcUQ7SUFDckQsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLHlCQUFlLENBQUM7UUFDdEMsU0FBUyxFQUFFO1lBQ1AsR0FBRztTQUNOO1FBQ0QsT0FBTyxFQUFFO1lBQ0wscUJBQXFCO1lBQ3JCLHNCQUFzQjtZQUN0Qix3QkFBd0I7WUFDeEIseUJBQXlCO1lBQ3pCLG1CQUFtQjtZQUNuQixtQkFBbUI7WUFDbkIsc0JBQXNCO1NBQ3pCO0tBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSiw2REFBNkQ7SUFDN0QsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ25GLE1BQU0sY0FBYyxHQUFHLElBQUksK0JBQWMsQ0FBQztRQUN0QyxPQUFPLEVBQUUsS0FBSztRQUNkLHFCQUFxQixFQUFFLE1BQU07UUFDN0IsT0FBTyxFQUFFO1lBQ0wsbUJBQW1CLEVBQUUsb0NBQW1CLENBQUMsS0FBSztZQUM5QyxlQUFlLEVBQUUsU0FBUztZQUMxQixpQkFBaUIsRUFBRTtnQkFDZiw0RkFBNEY7Z0JBQzVGLHlDQUF5QyxFQUFFLHFDQUFxQzthQUNuRjtZQUNELGdCQUFnQixFQUFFO2dCQUNkLDJFQUEyRTtnQkFDM0UsNkZBQTZGO2dCQUM3RixrQkFBa0IsRUFBRSxxQkFBcUIsa0JBQWtCLDJDQUEyQzthQUN6RztZQUNELDRCQUE0QjtZQUM1QixvQkFBb0IsRUFBRTtnQkFDbEI7b0JBQ0ksVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLGlCQUFpQixFQUFFO3dCQUNmLFdBQVcsRUFBRSxTQUFTO3FCQUN6QjtpQkFDSjtnQkFDRDtvQkFDSSxVQUFVLEVBQUUsS0FBSztvQkFDakIsaUJBQWlCLEVBQUU7d0JBQ2YsV0FBVyxFQUFFLE9BQU87cUJBQ3ZCO29CQUNELGdCQUFnQixFQUFFLEtBQUs7aUJBQzFCO2FBRUo7U0FFSjtRQUNELElBQUksRUFBRSxHQUFHLGlCQUFHLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUU7S0FDL0MsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFO1FBQ3ZDLGdCQUFnQjtRQUNoQixjQUFjO1FBQ2QsYUFBYSxFQUFFLGFBQWEsSUFBSSxFQUFFO1FBQ2xDLGVBQWUsRUFBRTtZQUNiO2dCQUNJLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixrQkFBa0IsRUFBRTtvQkFDaEIscUNBQXFDLEVBQUUsSUFBSTtpQkFDOUM7YUFDSjtZQUNEO2dCQUNJLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixrQkFBa0IsRUFBRTtvQkFDaEIscUNBQXFDLEVBQUUsSUFBSTtpQkFDOUM7YUFDSjtTQUNKO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQTlGRCwwRUE4RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0F3c30gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge0F3c0ludGVncmF0aW9uLCBQYXNzdGhyb3VnaEJlaGF2aW9yLCBSZXF1ZXN0VmFsaWRhdG9yLCBSZXNvdXJjZX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5XCI7XG5pbXBvcnQge1F1ZXVlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiO1xuaW1wb3J0IHtQb2xpY3lTdGF0ZW1lbnQsIFJvbGUsIFNlcnZpY2VQcmluY2lwYWx9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQge0lNb2RlbH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5L2xpYi9tb2RlbFwiO1xuaW1wb3J0IHtDb25zdHJ1Y3R9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hRdWV1ZVRvQXBpR2F0ZXdheVJlc291cmNlKFxuICAgIHN0YWNrOiBDb25zdHJ1Y3QsXG4gICAgcXVldWU6IFF1ZXVlLFxuICAgIHJlc291cmNlOiBSZXNvdXJjZSxcbiAgICByZXF1ZXN0VmFsaWRhdG9yOiBSZXF1ZXN0VmFsaWRhdG9yLFxuICAgIHJlc291cmNlTmFtZTogc3RyaW5nLFxuICAgIGFwaUtleVJlcXVpcmVkOiBib29sZWFuLFxuICAgIHJlcXVlc3RNb2RlbHM/OiB7W3BhcmFtOiBzdHJpbmddOiBJTW9kZWx9LFxuKSB7XG4gICAgLy8gcm9sZSBmb3IgQVBJIEdhdGV3YXlcbiAgICBjb25zdCBhcGlHd1JvbGUgPSBuZXcgUm9sZShzdGFjaywgYCR7cmVzb3VyY2VOYW1lfUFQSUdhdGV3YXlUb1NRU1JvbGVgLCB7XG4gICAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2FwaWdhdGV3YXkuYW1hem9uYXdzLmNvbScpLFxuICAgIH0pO1xuICAgIC8vIGdyYW50cyBBUEkgR2F0ZXdheSB0aGUgcmlnaHQgdG8gc2VuZCBTUVMgbWVzc2FnZXNcbiAgICBhcGlHd1JvbGUuYWRkVG9Qb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgcXVldWUucXVldWVBcm4sXG4gICAgICAgIF0sXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdzcXM6U2VuZE1lc3NhZ2UnLFxuICAgICAgICBdLFxuICAgIH0pKTtcbiAgICAvLyBncmFudHMgQVBJIEdhdGV3YXkgdGhlIHJpZ2h0IHdyaXRlIENsb3VkV2F0Y2ggTG9nc1xuICAgIGFwaUd3Um9sZS5hZGRUb1BvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAnKicsXG4gICAgICAgIF0sXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdsb2dzOkNyZWF0ZUxvZ0dyb3VwJyxcbiAgICAgICAgICAgICdsb2dzOkNyZWF0ZUxvZ1N0cmVhbScsXG4gICAgICAgICAgICAnbG9nczpEZXNjcmliZUxvZ0dyb3VwcycsXG4gICAgICAgICAgICAnbG9nczpEZXNjcmliZUxvZ1N0cmVhbXMnLFxuICAgICAgICAgICAgJ2xvZ3M6UHV0TG9nRXZlbnRzJyxcbiAgICAgICAgICAgICdsb2dzOkdldExvZ0V2ZW50cycsXG4gICAgICAgICAgICAnbG9nczpGaWx0ZXJMb2dFdmVudHMnLFxuICAgICAgICBdLFxuICAgIH0pKTtcbiAgICAvLyBjcmVhdGUgYW4gaW50ZWdyYXRpb24gYmV0d2VlbiBBUEkgR2F0ZXdheSBhbmQgYW4gU1FTIHF1ZXVlXG4gICAgY29uc3QgZmlmb01lc3NhZ2VHcm91cElkID0gcXVldWUuZmlmbyA/ICcmTWVzc2FnZUdyb3VwSWQ9QWx3YXlzU2FtZUZpZm9Hcm91cCcgOiAnJztcbiAgICBjb25zdCBzcXNJbnRlZ3JhdGlvbiA9IG5ldyBBd3NJbnRlZ3JhdGlvbih7XG4gICAgICAgIHNlcnZpY2U6ICdzcXMnLFxuICAgICAgICBpbnRlZ3JhdGlvbkh0dHBNZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgcGFzc3Rocm91Z2hCZWhhdmlvcjogUGFzc3Rocm91Z2hCZWhhdmlvci5ORVZFUixcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzUm9sZTogYXBpR3dSb2xlLFxuICAgICAgICAgICAgcmVxdWVzdFBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAvLyBTUVMgcmVxdWlyZXMgdGhlIENvbnRlbnQtVHlwZSBvZiB0aGUgSFRUUCByZXF1ZXN0IHRvIGJlIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICAgICAgICAgICAgICAgICdpbnRlZ3JhdGlvbi5yZXF1ZXN0LmhlYWRlci5Db250ZW50LVR5cGUnOiBcIidhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdFRlbXBsYXRlczoge1xuICAgICAgICAgICAgICAgIC8vIG1hcCB0aGUgSlNPTiByZXF1ZXN0IHRvIGEgZm9ybSBwYXJhbWV0ZXIsIEZJRk8gbmVlZHMgYWxzbyBNZXNzYWdlR3JvdXBJZFxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NTaW1wbGVRdWV1ZVNlcnZpY2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU2VuZE1lc3NhZ2UuaHRtbFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJzogYEFjdGlvbj1TZW5kTWVzc2FnZSR7Zmlmb01lc3NhZ2VHcm91cElkfSZNZXNzYWdlQm9keT0kdXRpbC51cmxFbmNvZGUoJGlucHV0LmJvZHkpYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyB0aGVzZSBhcmUgcmVxdWlyZWQgYnkgU1FTXG4gICAgICAgICAgICBpbnRlZ3JhdGlvblJlc3BvbnNlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogJzIwMCcsXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAndGV4dC9odG1sJzogJ1N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAnNTAwJyxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUZW1wbGF0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0L2h0bWwnOiAnRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25QYXR0ZXJuOiAnNTAwJyxcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBdLFxuXG4gICAgICAgIH0sXG4gICAgICAgIHBhdGg6IGAke0F3cy5BQ0NPVU5UX0lEfS8ke3F1ZXVlLnF1ZXVlTmFtZX1gLFxuICAgIH0pO1xuICAgIHJlc291cmNlLmFkZE1ldGhvZCgnUE9TVCcsIHNxc0ludGVncmF0aW9uLCB7XG4gICAgICAgIHJlcXVlc3RWYWxpZGF0b3IsXG4gICAgICAgIGFwaUtleVJlcXVpcmVkLFxuICAgICAgICByZXF1ZXN0TW9kZWxzOiByZXF1ZXN0TW9kZWxzID8/IHt9LFxuICAgICAgICBtZXRob2RSZXNwb25zZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAnMjAwJyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ21ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAnNTAwJyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ21ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Queue, QueueProps } from "aws-cdk-lib/aws-sqs";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
import { DigitrafficStack } from "./stack/stack";
|
|
4
|
+
/**
|
|
5
|
+
* Construct for creating SQS-queues.
|
|
6
|
+
*
|
|
7
|
+
* If you don't config your own deadLetterQueue, this will create a dlq for you, also a lambda function, a s3 bucket
|
|
8
|
+
* and an alarm for the queue. Anything that goes to the dlq will be written into the bucket and the alarm is activated.
|
|
9
|
+
*/
|
|
10
|
+
export declare class DigitrafficSqsQueue extends Queue {
|
|
11
|
+
constructor(scope: Construct, name: string, props: QueueProps);
|
|
12
|
+
static create(stack: DigitrafficStack, name: string, props: QueueProps): DigitrafficSqsQueue;
|
|
13
|
+
}
|
|
14
|
+
export declare class DigitrafficDLQueue {
|
|
15
|
+
static create(stack: DigitrafficStack, name: string): DigitrafficSqsQueue;
|
|
16
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FzLXF1ZXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9pbmZyYS9zcXMtcXVldWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQXVFO0FBQ3ZFLDZDQUFxQztBQUNyQywrQ0FBNkQ7QUFDN0QsaURBQW9EO0FBQ3BELHVEQUEyRDtBQUMzRCxtREFBbUQ7QUFDbkQsbUZBQW9FO0FBQ3BFLCtEQUFnRjtBQUNoRiwrRUFBNkQ7QUFNN0QsaUVBQTREO0FBRTVEOzs7OztHQUtHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxlQUFLO0lBQzFDLFlBQVksS0FBZ0IsRUFBRSxJQUFZLEVBQUUsS0FBaUI7UUFDekQsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBdUIsRUFBRSxJQUFZLEVBQUUsS0FBaUI7UUFDbEUsTUFBTSxTQUFTLEdBQUcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxJQUFJLFFBQVEsQ0FBQztRQUNuRSxNQUFNLFVBQVUsR0FBRyxFQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUc7Z0JBQzdCLFVBQVUsRUFBRSx5QkFBZSxDQUFDLFdBQVc7Z0JBQ3ZDLFNBQVM7Z0JBQ1QsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLElBQUk7b0JBQ3RDLGVBQWUsRUFBRSxDQUFDO29CQUNsQixLQUFLLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7aUJBQ2hEO2FBQ0osRUFBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNKO0FBbEJELGtEQWtCQztBQUVELE1BQWEsa0JBQWtCO0lBQzNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBdUIsRUFBRSxJQUFZ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QUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFZLEVBQUUsR0FBVyxFQUFFLEVBQUUsQ0FDOUQsVUFBVSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFNLGVBQWUsR0FBRzs7Ozs7OztDQU92QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtRdWV1ZSwgUXVldWVFbmNyeXB0aW9uLCBRdWV1ZVByb3BzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiO1xuaW1wb3J0IHtEdXJhdGlvbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge0Jsb2NrUHVibGljQWNjZXNzLCBCdWNrZXR9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7UG9saWN5U3RhdGVtZW50fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtJbmxpbmVDb2RlLCBSdW50aW1lfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtSZXRlbnRpb25EYXlzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCB7U3FzRXZlbnRTb3VyY2V9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXNcIjtcbmltcG9ydCB7Q29tcGFyaXNvbk9wZXJhdG9yLCBUcmVhdE1pc3NpbmdEYXRhfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7U25zQWN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gtYWN0aW9uc1wiO1xuaW1wb3J0IHtNYW5hZ2VkVXBsb2FkfSBmcm9tIFwiYXdzLXNkay9jbGllbnRzL3MzXCI7XG5pbXBvcnQge1MzfSBmcm9tIFwiYXdzLXNka1wiO1xuaW1wb3J0IHtTUVNFdmVudCwgU1FTSGFuZGxlciwgU1FTUmVjb3JkfSBmcm9tIFwiYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtDb25zdHJ1Y3R9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge0RpZ2l0cmFmZmljU3RhY2t9IGZyb20gXCIuL3N0YWNrL3N0YWNrXCI7XG5pbXBvcnQge01vbml0b3JlZEZ1bmN0aW9ufSBmcm9tIFwiLi9zdGFjay9tb25pdG9yZWRmdW5jdGlvblwiO1xuXG4vKipcbiAqIENvbnN0cnVjdCBmb3IgY3JlYXRpbmcgU1FTLXF1ZXVlcy5cbiAqXG4gKiBJZiB5b3UgZG9uJ3QgY29uZmlnIHlvdXIgb3duIGRlYWRMZXR0ZXJRdWV1ZSwgdGhpcyB3aWxsIGNyZWF0ZSBhIGRscSBmb3IgeW91LCBhbHNvIGEgbGFtYmRhIGZ1bmN0aW9uLCBhIHMzIGJ1Y2tldFxuICogYW5kIGFuIGFsYXJtIGZvciB0aGUgcXVldWUuICBBbnl0aGluZyB0aGF0IGdvZXMgdG8gdGhlIGRscSB3aWxsIGJlIHdyaXR0ZW4gaW50byB0aGUgYnVja2V0IGFuZCB0aGUgYWxhcm0gaXMgYWN0aXZhdGVkLlxuICovXG5leHBvcnQgY2xhc3MgRGlnaXRyYWZmaWNTcXNRdWV1ZSBleHRlbmRzIFF1ZXVlIHtcbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBuYW1lOiBzdHJpbmcsIHByb3BzOiBRdWV1ZVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBuYW1lLCBwcm9wcyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShzdGFjazogRGlnaXRyYWZmaWNTdGFjaywgbmFtZTogc3RyaW5nLCBwcm9wczogUXVldWVQcm9wcyk6IERpZ2l0cmFmZmljU3FzUXVldWUge1xuICAgICAgICBjb25zdCBxdWV1ZU5hbWUgPSBgJHtzdGFjay5jb25maWd1cmF0aW9uLnNob3J0TmFtZX0tJHtuYW1lfS1RdWV1ZWA7XG4gICAgICAgIGNvbnN0IHF1ZXVlUHJvcHMgPSB7Li4ucHJvcHMsIC4uLntcbiAgICAgICAgICAgIGVuY3J5cHRpb246IFF1ZXVlRW5jcnlwdGlvbi5LTVNfTUFOQUdFRCxcbiAgICAgICAgICAgIHF1ZXVlTmFtZSxcbiAgICAgICAgICAgIGRlYWRMZXR0ZXJRdWV1ZTogcHJvcHMuZGVhZExldHRlclF1ZXVlIHx8IHtcbiAgICAgICAgICAgICAgICBtYXhSZWNlaXZlQ291bnQ6IDIsXG4gICAgICAgICAgICAgICAgcXVldWU6IERpZ2l0cmFmZmljRExRdWV1ZS5jcmVhdGUoc3RhY2ssIG5hbWUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfX07XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEaWdpdHJhZmZpY1Nxc1F1ZXVlKHN0YWNrLCBxdWV1ZU5hbWUsIHF1ZXVlUHJvcHMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpZ2l0cmFmZmljRExRdWV1ZSB7XG4gICAgc3RhdGljIGNyZWF0ZShzdGFjazogRGlnaXRyYWZmaWNTdGFjaywgbmFtZTogc3RyaW5nKTogRGlnaXRyYWZmaWNTcXNRdWV1ZSB7XG4gICAgICAgIGNvbnN0IGRscU5hbWUgPSBgJHtzdGFjay5jb25maWd1cmF0aW9uLnNob3J0TmFtZX0tJHtuYW1lfS1ETFFgO1xuXG4gICAgICAgIGNvbnN0IGRscSA9IG5ldyBEaWdpdHJhZmZpY1Nxc1F1ZXVlKHN0YWNrLCBkbHFOYW1lLCB7XG4gICAgICAgICAgICBxdWV1ZU5hbWU6IGRscU5hbWUsXG4gICAgICAgICAgICB2aXNpYmlsaXR5VGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBRdWV1ZUVuY3J5cHRpb24uS01TX01BTkFHRUQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRscUJ1Y2tldCA9IG5ldyBCdWNrZXQoc3RhY2ssIGAke2RscU5hbWV9LUJ1Y2tldGAsIHtcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRscUZ1bmN0aW9uTmFtZSA9IGAke2RscU5hbWV9LUZ1bmN0aW9uYDtcbiAgICAgICAgY29uc3QgbGFtYmRhID0gTW9uaXRvcmVkRnVuY3Rpb24uY3JlYXRlKHN0YWNrLCBkbHFGdW5jdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX1lFQVIsXG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGRscUZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIGNvZGU6IGdldERscUNvZGUoZGxxQnVja2V0LmJ1Y2tldE5hbWUpLFxuICAgICAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICAgICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiAxLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzdGF0ZW1lbnQgPSBuZXcgUG9saWN5U3RhdGVtZW50KCk7XG4gICAgICAgIHN0YXRlbWVudC5hZGRBY3Rpb25zKCdzMzpQdXRPYmplY3QnKTtcbiAgICAgICAgc3RhdGVtZW50LmFkZEFjdGlvbnMoJ3MzOlB1dE9iamVjdEFjbCcpO1xuICAgICAgICBzdGF0ZW1lbnQuYWRkUmVzb3VyY2VzKGRscUJ1Y2tldC5idWNrZXRBcm4gKyAnLyonKTtcblxuICAgICAgICBsYW1iZGEuYWRkVG9Sb2xlUG9saWN5KHN0YXRlbWVudCk7XG4gICAgICAgIGxhbWJkYS5hZGRFdmVudFNvdXJjZShuZXcgU3FzRXZlbnRTb3VyY2UoZGxxKSk7XG5cbiAgICAgICAgYWRkRExRQWxhcm0oc3RhY2ssIGRscU5hbWUsIGRscSk7XG5cbiAgICAgICAgcmV0dXJuIGRscTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZERMUUFsYXJtKHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLCBkbHFOYW1lOiBzdHJpbmcsIGRscTogUXVldWUpIHtcbiAgICBjb25zdCBhbGFybU5hbWUgPSBgJHtkbHFOYW1lfS1BbGFybWA7XG4gICAgZGxxLm1ldHJpY051bWJlck9mTWVzc2FnZXNSZWNlaXZlZCh7XG4gICAgICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICB9KS5jcmVhdGVBbGFybShzdGFjaywgYWxhcm1OYW1lLCB7XG4gICAgICAgIGFsYXJtTmFtZSxcbiAgICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HLFxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgIH0pLmFkZEFsYXJtQWN0aW9uKG5ldyBTbnNBY3Rpb24oc3RhY2sud2FybmluZ1RvcGljKSk7XG59XG5cbmZ1bmN0aW9uIGdldERscUNvZGUoYk5hbWU6IHN0cmluZyk6IElubGluZUNvZGUge1xuICAgIGNvbnN0IGZ1bmN0aW9uQm9keSA9IERMUV9MQU1CREFfQ09ERVxuICAgICAgICAucmVwbGFjZShcIl9fYnVja2V0TmFtZV9fXCIsIGJOYW1lKVxuICAgICAgICAucmVwbGFjZShcIl9fdXBsb2FkX19cIiwgdXBsb2FkVG9TMy50b1N0cmluZygpKVxuICAgICAgICAucmVwbGFjZShcIl9fZG9VcGxvYWRfX1wiLCBkb1VwbG9hZC50b1N0cmluZygpKVxuICAgICAgICAucmVwbGFjZShcIl9faGFuZGxlcl9fXCIsIGNyZWF0ZUhhbmRsZXIoKS50b1N0cmluZygpLnN1YnN0cmluZygyMykpOyAvLyByZW1vdmUgZnVuY3Rpb24gaGFuZGxlcigpIGZyb20gc2lnbmF0dXJlXG5cbiAgICByZXR1cm4gbmV3IElubGluZUNvZGUoZnVuY3Rpb25Cb2R5KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkVG9TMyhzMzogUzMsIGJOYW1lOiBzdHJpbmcsIGJvZHk6IHN0cmluZywgb2JqZWN0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5pbmZvKCd3cml0aW5nICVzIHRvICVzJywgb2JqZWN0TmFtZSwgYk5hbWUpO1xuICAgICAgICBhd2FpdCBkb1VwbG9hZChzMywgYk5hbWUsIGJvZHksIG9iamVjdE5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgIGNvbnNvbGUud2FybignbWV0aG9kPXVwbG9hZFRvUzMgcmV0cnlpbmcgdXBsb2FkIHRvIGJ1Y2tldCAlcycsIGJOYW1lKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGRvVXBsb2FkKHMzLCBiTmFtZSwgYm9keSwgb2JqZWN0TmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdtZXRob2Q9dXBsb2FkVG9TMyBmYWlsZWQgcmV0cnlpbmcgdXBsb2FkIHRvIGJ1Y2tldCAlcycsIGJOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZG9VcGxvYWQoczM6IFMzLCBiTmFtZTogc3RyaW5nLCBCb2R5OiBzdHJpbmcsIEtleTogc3RyaW5nKTogUHJvbWlzZTxNYW5hZ2VkVXBsb2FkLlNlbmREYXRhPiB7XG4gICAgcmV0dXJuIHMzLnVwbG9hZCh7XG4gICAgICAgIEJ1Y2tldDogYk5hbWUsIEJvZHksIEtleSxcbiAgICB9KS5wcm9taXNlKCk7XG59XG5cbi8vIGJ1Y2tldE5hbWUgaXMgdW51c2VkLCB3aWxsIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGFjdHVhbCBsYW1iZGEgY29kZSBiZWxvd1xuY29uc3QgYnVja2V0TmFtZSA9ICcnO1xuXG5mdW5jdGlvbiBjcmVhdGVIYW5kbGVyKCk6IFNRU0hhbmRsZXIge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBTUVNFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgICAgICBjb25zdCBBV1MgPSByZXF1aXJlKCdhd3Mtc2RrJyk7XG5cbiAgICAgICAgY29uc3QgbWlsbGlzID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGV2ZW50LlJlY29yZHMubWFwKChlOiBTUVNSZWNvcmQsIGlkeDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgdXBsb2FkVG9TMyhuZXcgQVdTLlMzKCksIGJ1Y2tldE5hbWUsIGUuYm9keSwgYGRscS0ke21pbGxpc30tJHtpZHh9Lmpzb25gKSkpO1xuICAgIH07XG59XG5cbmNvbnN0IERMUV9MQU1CREFfQ09ERSA9IGBjb25zdCBBV1MgPSByZXF1aXJlKCdhd3Mtc2RrJyk7XG5jb25zdCBidWNrZXROYW1lID0gXCJfX2J1Y2tldE5hbWVfX1wiO1xuXG5fX3VwbG9hZF9fXG5fX2RvVXBsb2FkX19cblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiBfX2hhbmRsZXJfX1xuYDtcbiJdfQ==
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Architecture, Code, FunctionProps, Runtime } from 'aws-cdk-lib/aws-lambda';
|
|
2
|
+
import { ISecurityGroup, IVpc, SubnetSelection } from "aws-cdk-lib/aws-ec2";
|
|
3
|
+
import { Role } from 'aws-cdk-lib/aws-iam';
|
|
4
|
+
import { DigitrafficStack } from "./stack";
|
|
5
|
+
import { MonitoredFunctionAlarmProps } from "./monitoredfunction";
|
|
6
|
+
export declare type LambdaEnvironment = Record<string, string>;
|
|
7
|
+
export declare type DBLambdaEnvironment = LambdaEnvironment & {
|
|
8
|
+
SECRET_ID?: string;
|
|
9
|
+
DB_APPLICATION: string;
|
|
10
|
+
};
|
|
11
|
+
export interface LambdaConfiguration {
|
|
12
|
+
vpcId: string;
|
|
13
|
+
allowFromIpAddresses?: string[];
|
|
14
|
+
privateSubnetIds: string[];
|
|
15
|
+
availabilityZones: string[];
|
|
16
|
+
lambdaDbSgId: string;
|
|
17
|
+
dbProps?: DbProps;
|
|
18
|
+
defaultLambdaDurationSeconds?: number;
|
|
19
|
+
logsDestinationArn: string;
|
|
20
|
+
memorySize?: number;
|
|
21
|
+
runtime?: Runtime;
|
|
22
|
+
}
|
|
23
|
+
declare interface DbProps {
|
|
24
|
+
username: string;
|
|
25
|
+
password: string;
|
|
26
|
+
uri?: string;
|
|
27
|
+
ro_uri?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function databaseFunctionProps(stack: DigitrafficStack, environment: LambdaEnvironment, lambdaName: string, simpleLambdaName: string, config?: FunctionParameters): FunctionProps;
|
|
30
|
+
export declare function lambdaFunctionProps(stack: DigitrafficStack, environment: LambdaEnvironment, lambdaName: string, simpleLambdaName: string, config?: FunctionParameters): FunctionProps;
|
|
31
|
+
/**
|
|
32
|
+
* Creates a base configuration for a Lambda that uses an RDS database
|
|
33
|
+
* @param vpc "Private" Lambdas are associated with a VPC
|
|
34
|
+
* @param lambdaDbSg Security Group shared by Lambda and RDS
|
|
35
|
+
* @param props Database connection properties for the Lambda
|
|
36
|
+
* @param config Lambda configuration
|
|
37
|
+
*/
|
|
38
|
+
export declare function dbLambdaConfiguration(vpc: IVpc, lambdaDbSg: ISecurityGroup, props: LambdaConfiguration, config: FunctionParameters): FunctionProps;
|
|
39
|
+
export declare function defaultLambdaConfiguration(config: FunctionParameters): FunctionProps;
|
|
40
|
+
export interface FunctionParameters {
|
|
41
|
+
memorySize?: number;
|
|
42
|
+
timeout?: number;
|
|
43
|
+
functionName?: string;
|
|
44
|
+
code?: Code;
|
|
45
|
+
handler?: string;
|
|
46
|
+
readOnly?: boolean;
|
|
47
|
+
environment?: {
|
|
48
|
+
[key: string]: string;
|
|
49
|
+
};
|
|
50
|
+
reservedConcurrentExecutions?: number;
|
|
51
|
+
role?: Role;
|
|
52
|
+
vpc?: IVpc;
|
|
53
|
+
vpcSubnets?: SubnetSelection;
|
|
54
|
+
runtime?: Runtime;
|
|
55
|
+
architecture?: Architecture;
|
|
56
|
+
singleLambda?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare type MonitoredFunctionParameters = {
|
|
59
|
+
readonly memorySize?: number;
|
|
60
|
+
readonly timeout?: number;
|
|
61
|
+
readonly functionName?: string;
|
|
62
|
+
readonly reservedConcurrentExecutions?: number;
|
|
63
|
+
readonly role?: Role;
|
|
64
|
+
readonly runtime?: Runtime;
|
|
65
|
+
readonly architecture?: Architecture;
|
|
66
|
+
readonly singleLambda?: boolean;
|
|
67
|
+
readonly durationAlarmProps?: MonitoredFunctionAlarmProps;
|
|
68
|
+
readonly durationWarningProps?: MonitoredFunctionAlarmProps;
|
|
69
|
+
readonly errorAlarmProps?: MonitoredFunctionAlarmProps;
|
|
70
|
+
readonly throttleAlarmProps?: MonitoredFunctionAlarmProps;
|
|
71
|
+
};
|
|
72
|
+
export {};
|
|
@@ -0,0 +1,93 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWNvbmZpZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXdzL2luZnJhL3N0YWNrL2xhbWJkYS1jb25maWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUE2RjtBQUM3Riw2Q0FBcUM7QUFFckMsbURBQW1EO0FBZ0NuRCxTQUFnQixxQkFBcUIsQ0FDakMsS0FBdUIsRUFBRSxXQUE4QixFQUFFLFVBQWtCLEVBQUUsZ0JBQXdCLEVBQUUsTUFBMkI7SUFFbEksTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0IsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBYztLQUNwQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFZCxPQUFPLEVBQUMsR0FBRyxtQkFBbUIsQ0FDMUIsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxDQUMzRCxFQUFFLEdBQUc7WUFDRixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxTQUFTO1lBQzNCLFVBQVU7WUFDVixhQUFhLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxTQUFTO1NBQy9DLEVBQUMsQ0FBQztBQUNQLENBQUM7QUFkRCxzREFjQztBQUVELFNBQWdCLG1CQUFtQixDQUMvQixLQUF1QixFQUFFLFdBQThCLEVBQUUsVUFBa0IsRUFBRSxnQkFBd0IsRUFBRSxNQUEyQjtJQUVsSSxPQUFPO1FBQ0gsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLElBQUksb0JBQU8sQ0FBQyxXQUFXO1FBQy9DLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxJQUFJLHlCQUFZLENBQUMsTUFBTTtRQUN6RCxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsSUFBSSxHQUFHO1FBQ3JDLFlBQVksRUFBRSxVQUFVO1FBQ3hCLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSTtRQUNsQixPQUFP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QUcsS0FBSyxFQUFFLEdBQUc7Z0JBQ2pCLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsY0FBYztpQkFDdEM7YUFDSixFQUFDLENBQUM7S0FDTjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUF0QkQsZ0VBc0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcmNoaXRlY3R1cmUsIEFzc2V0Q29kZSwgQ29kZSwgRnVuY3Rpb25Qcm9wcywgUnVudGltZX0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XHJcbmltcG9ydCB7RHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xyXG5pbXBvcnQge0lTZWN1cml0eUdyb3VwLCBJVnBjLCBTdWJuZXRTZWxlY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XHJcbmltcG9ydCB7UmV0ZW50aW9uRGF5c30gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xyXG5pbXBvcnQge1JvbGV9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xyXG5pbXBvcnQge0RpZ2l0cmFmZmljU3RhY2t9IGZyb20gXCIuL3N0YWNrXCI7XHJcbmltcG9ydCB7TW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzfSBmcm9tIFwiLi9tb25pdG9yZWRmdW5jdGlvblwiO1xyXG5cclxuZXhwb3J0IHR5cGUgTGFtYmRhRW52aXJvbm1lbnQgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG5cclxuZXhwb3J0IHR5cGUgREJMYW1iZGFFbnZpcm9ubWVudCA9IExhbWJkYUVudmlyb25tZW50ICYge1xyXG4gICAgU0VDUkVUX0lEPzogc3RyaW5nXHJcbiAgICBEQl9BUFBMSUNBVElPTjogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhQ29uZmlndXJhdGlvbiB7XHJcbiAgICB2cGNJZDogc3RyaW5nO1xyXG4gICAgYWxsb3dGcm9tSXBBZGRyZXNzZXM/OiBzdHJpbmdbXTtcclxuICAgIHByaXZhdGVTdWJuZXRJZHM6IHN0cmluZ1tdO1xyXG4gICAgYXZhaWxhYmlsaXR5Wm9uZXM6IHN0cmluZ1tdO1xyXG4gICAgbGFtYmRhRGJTZ0lkOiBzdHJpbmc7XHJcbiAgICBkYlByb3BzPzogRGJQcm9wcztcclxuICAgIGRlZmF1bHRMYW1iZGFEdXJhdGlvblNlY29uZHM/OiBudW1iZXI7XHJcbiAgICBsb2dzRGVzdGluYXRpb25Bcm46IHN0cmluZztcclxuICAgIG1lbW9yeVNpemU/OiBudW1iZXIsXHJcbiAgICBydW50aW1lPzogUnVudGltZTtcclxufVxyXG5cclxuZGVjbGFyZSBpbnRlcmZhY2UgRGJQcm9wcyB7XHJcbiAgICB1c2VybmFtZTogc3RyaW5nO1xyXG4gICAgcGFzc3dvcmQ6IHN0cmluZztcclxuICAgIHVyaT86IHN0cmluZztcclxuICAgIHJvX3VyaT86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFiYXNlRnVuY3Rpb25Qcm9wcyhcclxuICAgIHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLCBlbnZpcm9ubWVudDogTGFtYmRhRW52aXJvbm1lbnQsIGxhbWJkYU5hbWU6IHN0cmluZywgc2ltcGxlTGFtYmRhTmFtZTogc3RyaW5nLCBjb25maWc/OiBGdW5jdGlvblBhcmFtZXRlcnMsXHJcbik6IEZ1bmN0aW9uUHJvcHMge1xyXG4gICAgY29uc3QgdnBjU3VibmV0cyA9IHN0YWNrLnZwYyA/IHtcclxuICAgICAgICBzdWJuZXRzOiBzdGFjay52cGMucHJpdmF0ZVN1Ym5ldHMsXHJcbiAgICB9IDogdW5kZWZpbmVkO1xyXG5cclxuICAgIHJldHVybiB7Li4ubGFtYmRhRnVuY3Rpb25Qcm9wcyhcclxuICAgICAgICBzdGFjaywgZW52aXJvbm1lbnQsIGxhbWJkYU5hbWUsIHNpbXBsZUxhbWJkYU5hbWUsIGNvbmZpZyxcclxuICAgICksIC4uLntcclxuICAgICAgICB2cGM6IHN0YWNrLnZwYyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgdnBjU3VibmV0cyxcclxuICAgICAgICBzZWN1cml0eUdyb3VwOiBzdGFjay5sYW1iZGFEYlNnIHx8IHVuZGVmaW5lZCxcclxuICAgIH19O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbGFtYmRhRnVuY3Rpb25Qcm9wcyhcclxuICAgIHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLCBlbnZpcm9ubWVudDogTGFtYmRhRW52aXJvbm1lbnQsIGxhbWJkYU5hbWU6IHN0cmluZywgc2ltcGxlTGFtYmRhTmFtZTogc3RyaW5nLCBjb25maWc/OiBGdW5jdGlvblBhcmFtZXRlcnMsXHJcbik6IEZ1bmN0aW9uUHJvcHMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBydW50aW1lOiBjb25maWc/LnJ1bnRpbWUgfHwgUnVudGltZS5OT0RFSlNfMTRfWCxcclxuICAgICAgICBhcmNoaXRlY3R1cmU6IGNvbmZpZz8uYXJjaGl0ZWN0dXJlIHx8IEFyY2hpdGVjdHVyZS5BUk1fNjQsXHJcbiAgICAgICAgbWVtb3J5U2l6ZTogY29uZmlnPy5tZW1vcnlTaXplIHx8IDEyOCxcclxuICAgICAgICBmdW5jdGlvbk5hbWU6IGxhbWJkYU5hbWUsXHJcbiAgICAgICAgcm9sZTogY29uZmlnPy5yb2xlLFxyXG4gICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoY29uZmlnPy50aW1lb3V0IHx8IDYwKSxcclxuICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX1lFQVIsXHJcbiAgICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogY29uZmlnPy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zIHx8IDIsXHJcbiAgICAgICAgY29kZTogZ2V0QXNzZXRDb2RlKHNpbXBsZUxhbWJkYU5hbWUsIGNvbmZpZyksXHJcbiAgICAgICAgaGFuZGxlcjogYCR7c2ltcGxlTGFtYmRhTmFtZX0uaGFuZGxlcmAsXHJcbiAgICAgICAgZW52aXJvbm1lbnQsXHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRBc3NldENvZGUoc2ltcGxlTGFtYmRhTmFtZTogc3RyaW5nLCBjb25maWc/OiBGdW5jdGlvblBhcmFtZXRlcnMpOiBBc3NldENvZGUge1xyXG4gICAgY29uc3QgbGFtYmRhUGF0aCA9IGNvbmZpZz8uc2luZ2xlTGFtYmRhID8gYGRpc3QvbGFtYmRhL2AgOiBgZGlzdC9sYW1iZGEvJHtzaW1wbGVMYW1iZGFOYW1lfWA7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBBc3NldENvZGUobGFtYmRhUGF0aCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgYmFzZSBjb25maWd1cmF0aW9uIGZvciBhIExhbWJkYSB0aGF0IHVzZXMgYW4gUkRTIGRhdGFiYXNlXHJcbiAqIEBwYXJhbSB2cGMgXCJQcml2YXRlXCIgTGFtYmRhcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgVlBDXHJcbiAqIEBwYXJhbSBsYW1iZGFEYlNnIFNlY3VyaXR5IEdyb3VwIHNoYXJlZCBieSBMYW1iZGEgYW5kIFJEU1xyXG4gKiBAcGFyYW0gcHJvcHMgRGF0YWJhc2UgY29ubmVjdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgTGFtYmRhXHJcbiAqIEBwYXJhbSBjb25maWcgTGFtYmRhIGNvbmZpZ3VyYXRpb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkYkxhbWJkYUNvbmZpZ3VyYXRpb24odnBjOiBJVnBjLFxyXG4gICAgbGFtYmRhRGJTZzogSVNlY3VyaXR5R3JvdXAsXHJcbiAgICBwcm9wczogTGFtYmRhQ29uZmlndXJhdGlvbixcclxuICAgIGNvbmZpZzogRnVuY3Rpb25QYXJhbWV0ZXJzKTogRnVuY3Rpb25Qcm9wcyB7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBydW50aW1lOiBwcm9wcy5ydW50aW1lIHx8IFJ1bnRpbWUuTk9ERUpTXzE0X1gsXHJcbiAgICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSB8fCBjb25maWcubWVtb3J5U2l6ZSB8fCAxMDI0LFxyXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogY29uZmlnLmZ1bmN0aW9uTmFtZSxcclxuICAgICAgICBjb2RlOiBjb25maWcuY29kZSBhcyBDb2RlLFxyXG4gICAgICAgIHJvbGU6IGNvbmZpZy5yb2xlLFxyXG4gICAgICAgIGhhbmRsZXI6IGNvbmZpZy5oYW5kbGVyIGFzIHN0cmluZyxcclxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKGNvbmZpZy50aW1lb3V0IHx8IHByb3BzLmRlZmF1bHRMYW1iZGFEdXJhdGlvblNlY29uZHMgfHwgNjApLFxyXG4gICAgICAgIGVudmlyb25tZW50OiBjb25maWcuZW52aXJvbm1lbnQgfHwge1xyXG4gICAgICAgICAgICBEQl9VU0VSOiBwcm9wcy5kYlByb3BzPy51c2VybmFtZSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgIERCX1BBU1M6IHByb3BzLmRiUHJvcHM/LnBhc3N3b3JkIGFzIHN0cmluZyxcclxuICAgICAgICAgICAgREJfVVJJOiAoY29uZmlnLnJlYWRPbmx5ID8gcHJvcHMuZGJQcm9wcz8ucm9fdXJpIDogcHJvcHMuZGJQcm9wcz8udXJpKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX1lFQVIsXHJcbiAgICAgICAgdnBjOiB2cGMsXHJcbiAgICAgICAgdnBjU3VibmV0czoge1xyXG4gICAgICAgICAgICBzdWJuZXRzOiB2cGMucHJpdmF0ZVN1Ym5ldHMsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZWN1cml0eUdyb3VwczogW2xhbWJkYURiU2ddLFxyXG4gICAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM6IGNvbmZpZy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zIHx8IDMsXHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdExhbWJkYUNvbmZpZ3VyYXRpb24oY29uZmlnOiBGdW5jdGlvblBhcmFtZXRlcnMpOiBGdW5jdGlvblByb3BzIHtcclxuICAgIGNvbnN0IHByb3BzOiBGdW5jdGlvblByb3BzID0ge1xyXG4gICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzE0X1gsXHJcbiAgICAgICAgbWVtb3J5U2l6ZTogY29uZmlnLm1lbW9yeVNpemUgPz8gMTI4LFxyXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogY29uZmlnLmZ1bmN0aW9uTmFtZSxcclxuICAgICAgICBoYW5kbGVyOiBjb25maWcuaGFuZGxlciBhcyBzdHJpbmcsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6IGNvbmZpZy5lbnZpcm9ubWVudCA/PyB7fSxcclxuICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX1lFQVIsXHJcbiAgICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogY29uZmlnLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXHJcbiAgICAgICAgY29kZTogY29uZmlnLmNvZGUgYXMgQ29kZSxcclxuICAgICAgICByb2xlOiBjb25maWcucm9sZSxcclxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKGNvbmZpZy50aW1lb3V0IHx8IDEwKSxcclxuICAgIH07XHJcbiAgICBpZiAoY29uZmlnLnZwYykge1xyXG4gICAgICAgIHJldHVybiB7Li4ucHJvcHMsIC4uLntcclxuICAgICAgICAgICAgdnBjOiBjb25maWcudnBjLFxyXG4gICAgICAgICAgICB2cGNTdWJuZXRzOiB7XHJcbiAgICAgICAgICAgICAgICBzdWJuZXRzOiBjb25maWcudnBjPy5wcml2YXRlU3VibmV0cyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9fTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcm9wcztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblBhcmFtZXRlcnMge1xyXG4gICAgbWVtb3J5U2l6ZT86IG51bWJlcjtcclxuICAgIHRpbWVvdXQ/OiBudW1iZXI7XHJcbiAgICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XHJcbiAgICBjb2RlPzogQ29kZTtcclxuICAgIGhhbmRsZXI/OiBzdHJpbmc7XHJcbiAgICByZWFkT25seT86IGJvb2xlYW47XHJcbiAgICBlbnZpcm9ubWVudD86IHtcclxuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XHJcbiAgICB9O1xyXG4gICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcclxuICAgIHJvbGU/OiBSb2xlO1xyXG4gICAgdnBjPzogSVZwYztcclxuICAgIHZwY1N1Ym5ldHM/OiBTdWJuZXRTZWxlY3Rpb247XHJcbiAgICBydW50aW1lPzogUnVudGltZTtcclxuICAgIGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZTtcclxuICAgIHNpbmdsZUxhbWJkYT86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE1vbml0b3JlZEZ1bmN0aW9uUGFyYW1ldGVycyA9IHtcclxuICAgIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XHJcbiAgICByZWFkb25seSB0aW1lb3V0PzogbnVtYmVyO1xyXG4gICAgcmVhZG9ubHkgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcclxuICAgIHJlYWRvbmx5IHJvbGU/OiBSb2xlO1xyXG4gICAgcmVhZG9ubHkgcnVudGltZT86IFJ1bnRpbWU7XHJcbiAgICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XHJcbiAgICByZWFkb25seSBzaW5nbGVMYW1iZGE/OiBib29sZWFuO1xyXG5cclxuICAgIHJlYWRvbmx5IGR1cmF0aW9uQWxhcm1Qcm9wcz86IE1vbml0b3JlZEZ1bmN0aW9uQWxhcm1Qcm9wc1xyXG4gICAgcmVhZG9ubHkgZHVyYXRpb25XYXJuaW5nUHJvcHM/OiBNb25pdG9yZWRGdW5jdGlvbkFsYXJtUHJvcHNcclxuICAgIHJlYWRvbmx5IGVycm9yQWxhcm1Qcm9wcz86IE1vbml0b3JlZEZ1bmN0aW9uQWxhcm1Qcm9wc1xyXG4gICAgcmVhZG9ubHkgdGhyb3R0bGVBbGFybVByb3BzPzogTW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzXHJcbn1cclxuIl19
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Function, FunctionProps } from 'aws-cdk-lib/aws-lambda';
|
|
2
|
+
import { Stack } from "aws-cdk-lib";
|
|
3
|
+
import { ComparisonOperator } from "aws-cdk-lib/aws-cloudwatch";
|
|
4
|
+
import { DigitrafficStack } from "../stack/stack";
|
|
5
|
+
import { ITopic } from "aws-cdk-lib/aws-sns";
|
|
6
|
+
import { LambdaEnvironment, MonitoredFunctionParameters } from "../stack/lambda-configs";
|
|
7
|
+
import { TrafficType } from "../../../types/traffictype";
|
|
8
|
+
/**
|
|
9
|
+
* Allows customization of CloudWatch Alarm properties
|
|
10
|
+
*/
|
|
11
|
+
export declare type MonitoredFunctionAlarmProps = {
|
|
12
|
+
/**
|
|
13
|
+
* Setting this to false will not create a CloudWatch alarm
|
|
14
|
+
*/
|
|
15
|
+
readonly create: boolean;
|
|
16
|
+
readonly threshold?: number;
|
|
17
|
+
readonly evaluationPeriods?: number;
|
|
18
|
+
readonly datapointsToAlarm?: number;
|
|
19
|
+
readonly comparisonOperator?: ComparisonOperator;
|
|
20
|
+
};
|
|
21
|
+
export declare type MonitoredFunctionProps = {
|
|
22
|
+
readonly durationAlarmProps?: MonitoredFunctionAlarmProps;
|
|
23
|
+
readonly durationWarningProps?: MonitoredFunctionAlarmProps;
|
|
24
|
+
readonly errorAlarmProps?: MonitoredFunctionAlarmProps;
|
|
25
|
+
readonly throttleAlarmProps?: MonitoredFunctionAlarmProps;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Creates a Lambda function that monitors default CloudWatch Lambda metrics with CloudWatch Alarms.
|
|
29
|
+
*/
|
|
30
|
+
export declare class MonitoredFunction extends Function {
|
|
31
|
+
readonly givenName: string;
|
|
32
|
+
/** disable all alarms */
|
|
33
|
+
static readonly DISABLE_ALARMS: MonitoredFunctionProps;
|
|
34
|
+
/**
|
|
35
|
+
* Create new MonitoredFunction. Use topics from given DigitrafficStack.
|
|
36
|
+
*
|
|
37
|
+
* @param stack DigitrafficStack
|
|
38
|
+
* @param id Lambda construct Id
|
|
39
|
+
* @param functionProps Lambda function properties
|
|
40
|
+
* @param props Monitored function properties
|
|
41
|
+
*/
|
|
42
|
+
static create(stack: DigitrafficStack, id: string, functionProps: FunctionProps, props?: MonitoredFunctionProps): MonitoredFunction;
|
|
43
|
+
/**
|
|
44
|
+
* Create new MonitoredFunction. Use topics from given DigitrafficStack. Generate names from given name and configuration shortName.
|
|
45
|
+
*
|
|
46
|
+
* 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.
|
|
47
|
+
*
|
|
48
|
+
* @param stack DigitrafficStack
|
|
49
|
+
* @param name param-case name
|
|
50
|
+
* @param environment Lambda environment
|
|
51
|
+
* @param functionParameters Lambda function parameters
|
|
52
|
+
*/
|
|
53
|
+
static createV2(stack: DigitrafficStack, name: string, environment: LambdaEnvironment, functionParameters?: MonitoredFunctionParameters): MonitoredFunction;
|
|
54
|
+
/**
|
|
55
|
+
* @param scope Stack
|
|
56
|
+
* @param id Lambda construct Id
|
|
57
|
+
* @param functionProps Lambda function properties
|
|
58
|
+
* @param alarmSnsTopic SNS topic for alarms
|
|
59
|
+
* @param warningSnsTopic SNS topic for warnings
|
|
60
|
+
* @param production Is the stack a production stack, used for determining the alarm topic
|
|
61
|
+
* @param trafficType Traffic type, used for alarm names. Set to null if Lambda is not related to any traffic type.
|
|
62
|
+
* @param props Monitored function properties
|
|
63
|
+
*/
|
|
64
|
+
constructor(scope: Stack, id: string, functionProps: FunctionProps, alarmSnsTopic: ITopic, warningSnsTopic: ITopic, production: boolean, trafficType: TrafficType | null, props?: MonitoredFunctionProps);
|
|
65
|
+
private createAlarm;
|
|
66
|
+
private getAlarmActionForEnv;
|
|
67
|
+
}
|
|
68
|
+
export declare class MonitoredDBFunction {
|
|
69
|
+
/**
|
|
70
|
+
* Create new MonitoredDBFunction. Use topics from given DigitrafficStack. Generate names from given name and configuration shortName.
|
|
71
|
+
* Grant secret and create log subscription.
|
|
72
|
+
*
|
|
73
|
+
* 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.
|
|
74
|
+
*
|
|
75
|
+
* If you don't need to pass any extra arguments to lambda-environment, you can leave environment out and this function will create the
|
|
76
|
+
* default Lambda Environment with SECRET_ID and DB_APPLICATION.
|
|
77
|
+
*
|
|
78
|
+
* @param stack DigitrafficStack
|
|
79
|
+
* @param name param-case name
|
|
80
|
+
* @param environment Lambda environment
|
|
81
|
+
* @param functionParameters Lambda function parameters
|
|
82
|
+
*/
|
|
83
|
+
static create(stack: DigitrafficStack, name: string, environment?: LambdaEnvironment, functionParameters?: MonitoredFunctionParameters): MonitoredFunction;
|
|
84
|
+
}
|