@digitraffic/common 2022.10.5

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.
Files changed (199) hide show
  1. package/LICENSE +291 -0
  2. package/aws/infra/api/integration.d.ts +21 -0
  3. package/aws/infra/api/integration.js +52 -0
  4. package/aws/infra/api/response.d.ts +22 -0
  5. package/aws/infra/api/response.js +61 -0
  6. package/aws/infra/api/responses.d.ts +39 -0
  7. package/aws/infra/api/responses.js +79 -0
  8. package/aws/infra/api/static-integration.d.ts +15 -0
  9. package/aws/infra/api/static-integration.js +54 -0
  10. package/aws/infra/canaries/canary-alarm.d.ts +6 -0
  11. package/aws/infra/canaries/canary-alarm.js +26 -0
  12. package/aws/infra/canaries/canary-parameters.d.ts +18 -0
  13. package/aws/infra/canaries/canary-parameters.js +3 -0
  14. package/aws/infra/canaries/canary-role.d.ts +6 -0
  15. package/aws/infra/canaries/canary-role.js +46 -0
  16. package/aws/infra/canaries/canary.d.ts +8 -0
  17. package/aws/infra/canaries/canary.js +29 -0
  18. package/aws/infra/canaries/database-canary.d.ts +18 -0
  19. package/aws/infra/canaries/database-canary.js +55 -0
  20. package/aws/infra/canaries/database-checker.d.ts +21 -0
  21. package/aws/infra/canaries/database-checker.js +109 -0
  22. package/aws/infra/canaries/url-canary.d.ts +19 -0
  23. package/aws/infra/canaries/url-canary.js +46 -0
  24. package/aws/infra/canaries/url-checker.d.ts +46 -0
  25. package/aws/infra/canaries/url-checker.js +238 -0
  26. package/aws/infra/documentation.d.ts +56 -0
  27. package/aws/infra/documentation.js +95 -0
  28. package/aws/infra/scheduler.d.ts +12 -0
  29. package/aws/infra/scheduler.js +31 -0
  30. package/aws/infra/security-rule.d.ts +12 -0
  31. package/aws/infra/security-rule.js +39 -0
  32. package/aws/infra/sqs-integration.d.ts +7 -0
  33. package/aws/infra/sqs-integration.js +93 -0
  34. package/aws/infra/sqs-queue.d.ts +16 -0
  35. package/aws/infra/sqs-queue.js +130 -0
  36. package/aws/infra/stack/lambda-configs.d.ts +72 -0
  37. package/aws/infra/stack/lambda-configs.js +93 -0
  38. package/aws/infra/stack/monitoredfunction.d.ts +84 -0
  39. package/aws/infra/stack/monitoredfunction.js +135 -0
  40. package/aws/infra/stack/rest_apis.d.ts +40 -0
  41. package/aws/infra/stack/rest_apis.js +179 -0
  42. package/aws/infra/stack/stack-checking-aspect.d.ts +20 -0
  43. package/aws/infra/stack/stack-checking-aspect.js +163 -0
  44. package/aws/infra/stack/stack.d.ts +41 -0
  45. package/aws/infra/stack/stack.js +58 -0
  46. package/aws/infra/stack/subscription.d.ts +17 -0
  47. package/aws/infra/stack/subscription.js +41 -0
  48. package/aws/infra/usage-plans.d.ts +15 -0
  49. package/aws/infra/usage-plans.js +42 -0
  50. package/aws/runtime/apikey.d.ts +2 -0
  51. package/aws/runtime/apikey.js +13 -0
  52. package/aws/runtime/digitraffic-integration-response.d.ts +8 -0
  53. package/aws/runtime/digitraffic-integration-response.js +26 -0
  54. package/aws/runtime/messaging.d.ts +10 -0
  55. package/aws/runtime/messaging.js +31 -0
  56. package/aws/runtime/s3.d.ts +2 -0
  57. package/aws/runtime/s3.js +30 -0
  58. package/aws/runtime/secrets/dbsecret.d.ts +54 -0
  59. package/aws/runtime/secrets/dbsecret.js +96 -0
  60. package/aws/runtime/secrets/proxy-holder.d.ts +9 -0
  61. package/aws/runtime/secrets/proxy-holder.js +26 -0
  62. package/aws/runtime/secrets/rds-holder.d.ts +9 -0
  63. package/aws/runtime/secrets/rds-holder.js +26 -0
  64. package/aws/runtime/secrets/secret-holder.d.ts +26 -0
  65. package/aws/runtime/secrets/secret-holder.js +73 -0
  66. package/aws/runtime/secrets/secret.d.ts +8 -0
  67. package/aws/runtime/secrets/secret.js +43 -0
  68. package/aws/types/errors.d.ts +4 -0
  69. package/aws/types/errors.js +9 -0
  70. package/aws/types/lambda-response.d.ts +12 -0
  71. package/aws/types/lambda-response.js +28 -0
  72. package/aws/types/mediatypes.d.ts +10 -0
  73. package/aws/types/mediatypes.js +15 -0
  74. package/aws/types/model-with-reference.d.ts +7 -0
  75. package/aws/types/model-with-reference.js +3 -0
  76. package/aws/types/proxytypes.d.ts +26 -0
  77. package/aws/types/proxytypes.js +3 -0
  78. package/aws/types/tags.d.ts +2 -0
  79. package/aws/types/tags.js +7 -0
  80. package/database/cached.d.ts +7 -0
  81. package/database/cached.js +32 -0
  82. package/database/database.d.ts +19 -0
  83. package/database/database.js +62 -0
  84. package/database/last-updated.d.ts +16 -0
  85. package/database/last-updated.js +54 -0
  86. package/index.d.ts +1 -0
  87. package/index.js +18 -0
  88. package/marine/id_utils.d.ts +3 -0
  89. package/marine/id_utils.js +33 -0
  90. package/marine/rtz.d.ts +48 -0
  91. package/marine/rtz.js +3 -0
  92. package/package.json +55 -0
  93. package/src/aws/infra/api/integration.js +52 -0
  94. package/src/aws/infra/api/response.js +61 -0
  95. package/src/aws/infra/api/responses.js +79 -0
  96. package/src/aws/infra/api/static-integration.js +54 -0
  97. package/src/aws/infra/canaries/canary-alarm.js +26 -0
  98. package/src/aws/infra/canaries/canary-parameters.js +3 -0
  99. package/src/aws/infra/canaries/canary-role.js +46 -0
  100. package/src/aws/infra/canaries/canary.js +29 -0
  101. package/src/aws/infra/canaries/database-canary.js +55 -0
  102. package/src/aws/infra/canaries/database-checker.js +109 -0
  103. package/src/aws/infra/canaries/url-canary.js +46 -0
  104. package/src/aws/infra/canaries/url-checker.js +238 -0
  105. package/src/aws/infra/documentation.js +95 -0
  106. package/src/aws/infra/scheduler.js +31 -0
  107. package/src/aws/infra/security-rule.js +39 -0
  108. package/src/aws/infra/sqs-integration.js +93 -0
  109. package/src/aws/infra/sqs-queue.js +130 -0
  110. package/src/aws/infra/stack/lambda-configs.js +93 -0
  111. package/src/aws/infra/stack/monitoredfunction.js +135 -0
  112. package/src/aws/infra/stack/rest_apis.js +179 -0
  113. package/src/aws/infra/stack/stack-checking-aspect.js +163 -0
  114. package/src/aws/infra/stack/stack.js +58 -0
  115. package/src/aws/infra/stack/subscription.js +41 -0
  116. package/src/aws/infra/usage-plans.js +42 -0
  117. package/src/aws/runtime/apikey.js +13 -0
  118. package/src/aws/runtime/digitraffic-integration-response.js +26 -0
  119. package/src/aws/runtime/messaging.js +31 -0
  120. package/src/aws/runtime/s3.js +30 -0
  121. package/src/aws/runtime/secrets/dbsecret.js +96 -0
  122. package/src/aws/runtime/secrets/proxy-holder.js +26 -0
  123. package/src/aws/runtime/secrets/rds-holder.js +26 -0
  124. package/src/aws/runtime/secrets/secret-holder.js +73 -0
  125. package/src/aws/runtime/secrets/secret.js +43 -0
  126. package/src/aws/types/errors.js +9 -0
  127. package/src/aws/types/lambda-response.js +28 -0
  128. package/src/aws/types/mediatypes.js +15 -0
  129. package/src/aws/types/model-with-reference.js +3 -0
  130. package/src/aws/types/proxytypes.js +3 -0
  131. package/src/aws/types/tags.js +7 -0
  132. package/src/database/cached.js +32 -0
  133. package/src/database/database.js +62 -0
  134. package/src/database/last-updated.js +54 -0
  135. package/src/marine/id_utils.js +33 -0
  136. package/src/marine/rtz.js +3 -0
  137. package/src/test/asserter.js +45 -0
  138. package/src/test/db-testutils.js +31 -0
  139. package/src/test/httpserver.js +67 -0
  140. package/src/test/secret.js +25 -0
  141. package/src/test/secrets-manager.js +59 -0
  142. package/src/test/testutils.js +44 -0
  143. package/src/types/input-error.js +7 -0
  144. package/src/types/language.js +10 -0
  145. package/src/types/traffictype.js +13 -0
  146. package/src/types/validator.js +14 -0
  147. package/src/utils/api-model.js +129 -0
  148. package/src/utils/base64.js +21 -0
  149. package/src/utils/date-utils.js +34 -0
  150. package/src/utils/geojson-types.js +18 -0
  151. package/src/utils/geometry.js +140 -0
  152. package/src/utils/retry.js +50 -0
  153. package/src/utils/slack.js +25 -0
  154. package/src/utils/utils.js +40 -0
  155. package/test/asserter.d.ts +11 -0
  156. package/test/asserter.js +45 -0
  157. package/test/db-testutils.d.ts +2 -0
  158. package/test/db-testutils.js +31 -0
  159. package/test/httpserver.d.ts +18 -0
  160. package/test/httpserver.js +67 -0
  161. package/test/marine/id_utils.test.js +69 -0
  162. package/test/promise/promise.test.js +125 -0
  163. package/test/secret.d.ts +3 -0
  164. package/test/secret.js +25 -0
  165. package/test/secrets/dbsecret.test.js +71 -0
  166. package/test/secrets/secret-holder.test.js +124 -0
  167. package/test/secrets/secret.test.js +66 -0
  168. package/test/secrets-manager.d.ts +9 -0
  169. package/test/secrets-manager.js +59 -0
  170. package/test/test/httpserver.test.js +87 -0
  171. package/test/testutils.d.ts +12 -0
  172. package/test/testutils.js +44 -0
  173. package/test/utils/date-utils.test.js +51 -0
  174. package/test/utils/geometry.test.js +49 -0
  175. package/test/utils/utils.test.js +49 -0
  176. package/types/input-error.d.ts +2 -0
  177. package/types/input-error.js +7 -0
  178. package/types/language.d.ts +5 -0
  179. package/types/language.js +10 -0
  180. package/types/traffictype.d.ts +8 -0
  181. package/types/traffictype.js +13 -0
  182. package/types/validator.d.ts +4 -0
  183. package/types/validator.js +14 -0
  184. package/utils/api-model.d.ts +87 -0
  185. package/utils/api-model.js +129 -0
  186. package/utils/base64.d.ts +12 -0
  187. package/utils/base64.js +21 -0
  188. package/utils/date-utils.d.ts +17 -0
  189. package/utils/date-utils.js +34 -0
  190. package/utils/geojson-types.d.ts +14 -0
  191. package/utils/geojson-types.js +18 -0
  192. package/utils/geometry.d.ts +36 -0
  193. package/utils/geometry.js +140 -0
  194. package/utils/retry.d.ts +13 -0
  195. package/utils/retry.js +50 -0
  196. package/utils/slack.d.ts +5 -0
  197. package/utils/slack.js +25 -0
  198. package/utils/utils.d.ts +22 -0
  199. package/utils/utils.js +40 -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
+ }