@digitraffic/common 2022.10.25-1 → 2022.10.28-2

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 (332) hide show
  1. package/{aws → dist/aws}/infra/api/integration.d.ts +0 -0
  2. package/dist/aws/infra/api/integration.js +52 -0
  3. package/dist/aws/infra/api/integration.js.map +1 -0
  4. package/{aws → dist/aws}/infra/api/response.d.ts +0 -0
  5. package/dist/aws/infra/api/response.js +61 -0
  6. package/dist/aws/infra/api/response.js.map +1 -0
  7. package/{aws → dist/aws}/infra/api/responses.d.ts +3 -3
  8. package/dist/aws/infra/api/responses.js +82 -0
  9. package/dist/aws/infra/api/responses.js.map +1 -0
  10. package/{aws → dist/aws}/infra/api/static-integration.d.ts +0 -0
  11. package/dist/aws/infra/api/static-integration.js +54 -0
  12. package/dist/aws/infra/api/static-integration.js.map +1 -0
  13. package/{aws → dist/aws}/infra/canaries/canary-alarm.d.ts +0 -0
  14. package/dist/aws/infra/canaries/canary-alarm.js +26 -0
  15. package/dist/aws/infra/canaries/canary-alarm.js.map +1 -0
  16. package/dist/aws/infra/canaries/canary-keys.d.ts +3 -0
  17. package/dist/aws/infra/canaries/canary-keys.js +7 -0
  18. package/dist/aws/infra/canaries/canary-keys.js.map +1 -0
  19. package/{aws → dist/aws}/infra/canaries/canary-parameters.d.ts +0 -0
  20. package/dist/aws/infra/canaries/canary-parameters.js +3 -0
  21. package/dist/aws/infra/canaries/canary-parameters.js.map +1 -0
  22. package/{aws → dist/aws}/infra/canaries/canary-role.d.ts +0 -0
  23. package/dist/aws/infra/canaries/canary-role.js +46 -0
  24. package/dist/aws/infra/canaries/canary-role.js.map +1 -0
  25. package/{aws → dist/aws}/infra/canaries/canary.d.ts +0 -0
  26. package/dist/aws/infra/canaries/canary.js +32 -0
  27. package/dist/aws/infra/canaries/canary.js.map +1 -0
  28. package/{aws → dist/aws}/infra/canaries/database-canary.d.ts +0 -0
  29. package/dist/aws/infra/canaries/database-canary.js +70 -0
  30. package/dist/aws/infra/canaries/database-canary.js.map +1 -0
  31. package/{aws → dist/aws}/infra/canaries/database-checker.d.ts +2 -2
  32. package/dist/aws/infra/canaries/database-checker.js +103 -0
  33. package/dist/aws/infra/canaries/database-checker.js.map +1 -0
  34. package/{aws → dist/aws}/infra/canaries/url-canary.d.ts +0 -3
  35. package/dist/aws/infra/canaries/url-canary.js +47 -0
  36. package/dist/aws/infra/canaries/url-canary.js.map +1 -0
  37. package/{aws → dist/aws}/infra/canaries/url-checker.d.ts +0 -0
  38. package/dist/aws/infra/canaries/url-checker.js +252 -0
  39. package/dist/aws/infra/canaries/url-checker.js.map +1 -0
  40. package/{aws → dist/aws}/infra/documentation.d.ts +0 -0
  41. package/dist/aws/infra/documentation.js +95 -0
  42. package/dist/aws/infra/documentation.js.map +1 -0
  43. package/{aws → dist/aws}/infra/scheduler.d.ts +7 -7
  44. package/dist/aws/infra/scheduler.js +31 -0
  45. package/dist/aws/infra/scheduler.js.map +1 -0
  46. package/{aws → dist/aws}/infra/security-rule.d.ts +0 -0
  47. package/dist/aws/infra/security-rule.js +39 -0
  48. package/dist/aws/infra/security-rule.js.map +1 -0
  49. package/{aws → dist/aws}/infra/sqs-integration.d.ts +0 -0
  50. package/dist/aws/infra/sqs-integration.js +93 -0
  51. package/dist/aws/infra/sqs-integration.js.map +1 -0
  52. package/{aws → dist/aws}/infra/sqs-queue.d.ts +0 -0
  53. package/dist/aws/infra/sqs-queue.js +130 -0
  54. package/dist/aws/infra/sqs-queue.js.map +1 -0
  55. package/{aws → dist/aws}/infra/stack/lambda-configs.d.ts +5 -5
  56. package/dist/aws/infra/stack/lambda-configs.js +105 -0
  57. package/dist/aws/infra/stack/lambda-configs.js.map +1 -0
  58. package/{aws → dist/aws}/infra/stack/monitoredfunction.d.ts +1 -1
  59. package/dist/aws/infra/stack/monitoredfunction.js +143 -0
  60. package/dist/aws/infra/stack/monitoredfunction.js.map +1 -0
  61. package/{aws → dist/aws}/infra/stack/rest_apis.d.ts +0 -0
  62. package/dist/aws/infra/stack/rest_apis.js +185 -0
  63. package/dist/aws/infra/stack/rest_apis.js.map +1 -0
  64. package/{aws → dist/aws}/infra/stack/stack-checking-aspect.d.ts +0 -0
  65. package/dist/aws/infra/stack/stack-checking-aspect.js +174 -0
  66. package/dist/aws/infra/stack/stack-checking-aspect.js.map +1 -0
  67. package/{aws → dist/aws}/infra/stack/stack.d.ts +5 -4
  68. package/dist/aws/infra/stack/stack.js +67 -0
  69. package/dist/aws/infra/stack/stack.js.map +1 -0
  70. package/{aws → dist/aws}/infra/stack/subscription.d.ts +3 -3
  71. package/dist/aws/infra/stack/subscription.js +42 -0
  72. package/dist/aws/infra/stack/subscription.js.map +1 -0
  73. package/{aws → dist/aws}/infra/usage-plans.d.ts +0 -0
  74. package/dist/aws/infra/usage-plans.js +42 -0
  75. package/dist/aws/infra/usage-plans.js.map +1 -0
  76. package/{aws → dist/aws}/runtime/apikey.d.ts +0 -0
  77. package/dist/aws/runtime/apikey.js +13 -0
  78. package/dist/aws/runtime/apikey.js.map +1 -0
  79. package/{aws → dist/aws}/runtime/digitraffic-integration-response.d.ts +0 -0
  80. package/dist/aws/runtime/digitraffic-integration-response.js +26 -0
  81. package/dist/aws/runtime/digitraffic-integration-response.js.map +1 -0
  82. package/{aws → dist/aws}/runtime/environment.d.ts +0 -0
  83. package/dist/aws/runtime/environment.js +12 -0
  84. package/dist/aws/runtime/environment.js.map +1 -0
  85. package/{aws → dist/aws}/runtime/messaging.d.ts +0 -0
  86. package/dist/aws/runtime/messaging.js +31 -0
  87. package/dist/aws/runtime/messaging.js.map +1 -0
  88. package/{aws → dist/aws}/runtime/s3.d.ts +0 -0
  89. package/dist/aws/runtime/s3.js +30 -0
  90. package/dist/aws/runtime/s3.js.map +1 -0
  91. package/{aws → dist/aws}/runtime/secrets/dbsecret.d.ts +0 -0
  92. package/dist/aws/runtime/secrets/dbsecret.js +96 -0
  93. package/dist/aws/runtime/secrets/dbsecret.js.map +1 -0
  94. package/{aws → dist/aws}/runtime/secrets/proxy-holder.d.ts +0 -0
  95. package/dist/aws/runtime/secrets/proxy-holder.js +27 -0
  96. package/dist/aws/runtime/secrets/proxy-holder.js.map +1 -0
  97. package/{aws → dist/aws}/runtime/secrets/rds-holder.d.ts +0 -0
  98. package/dist/aws/runtime/secrets/rds-holder.js +27 -0
  99. package/dist/aws/runtime/secrets/rds-holder.js.map +1 -0
  100. package/{aws → dist/aws}/runtime/secrets/secret-holder.d.ts +0 -0
  101. package/dist/aws/runtime/secrets/secret-holder.js +76 -0
  102. package/dist/aws/runtime/secrets/secret-holder.js.map +1 -0
  103. package/{aws → dist/aws}/runtime/secrets/secret.d.ts +0 -0
  104. package/dist/aws/runtime/secrets/secret.js +43 -0
  105. package/dist/aws/runtime/secrets/secret.js.map +1 -0
  106. package/{aws → dist/aws}/types/errors.d.ts +4 -0
  107. package/dist/aws/types/errors.js +16 -0
  108. package/dist/aws/types/errors.js.map +1 -0
  109. package/{aws → dist/aws}/types/lambda-response.d.ts +4 -3
  110. package/dist/aws/types/lambda-response.js +33 -0
  111. package/dist/aws/types/lambda-response.js.map +1 -0
  112. package/{aws → dist/aws}/types/mediatypes.d.ts +1 -1
  113. package/dist/aws/types/mediatypes.js +16 -0
  114. package/dist/aws/types/mediatypes.js.map +1 -0
  115. package/{aws → dist/aws}/types/model-with-reference.d.ts +0 -0
  116. package/dist/aws/types/model-with-reference.js +3 -0
  117. package/dist/aws/types/model-with-reference.js.map +1 -0
  118. package/{aws → dist/aws}/types/proxytypes.d.ts +0 -0
  119. package/dist/aws/types/proxytypes.js +3 -0
  120. package/dist/aws/types/proxytypes.js.map +1 -0
  121. package/{aws → dist/aws}/types/tags.d.ts +0 -0
  122. package/dist/aws/types/tags.js +7 -0
  123. package/dist/aws/types/tags.js.map +1 -0
  124. package/{database → dist/database}/cached.d.ts +0 -0
  125. package/dist/database/cached.js +32 -0
  126. package/dist/database/cached.js.map +1 -0
  127. package/{database → dist/database}/database.d.ts +0 -0
  128. package/dist/database/database.js +70 -0
  129. package/dist/database/database.js.map +1 -0
  130. package/{database → dist/database}/last-updated.d.ts +0 -0
  131. package/dist/database/last-updated.js +54 -0
  132. package/dist/database/last-updated.js.map +1 -0
  133. package/{database → dist/database}/models.d.ts +0 -0
  134. package/dist/database/models.js +3 -0
  135. package/dist/database/models.js.map +1 -0
  136. package/{marine → dist/marine}/id_utils.d.ts +0 -0
  137. package/dist/marine/id_utils.js +33 -0
  138. package/dist/marine/id_utils.js.map +1 -0
  139. package/{marine → dist/marine}/rtz.d.ts +0 -0
  140. package/dist/marine/rtz.js +3 -0
  141. package/dist/marine/rtz.js.map +1 -0
  142. package/{test → dist/test}/asserter.d.ts +0 -0
  143. package/dist/test/asserter.js +45 -0
  144. package/dist/test/asserter.js.map +1 -0
  145. package/{test → dist/test}/db-testutils.d.ts +0 -0
  146. package/dist/test/db-testutils.js +31 -0
  147. package/dist/test/db-testutils.js.map +1 -0
  148. package/{test → dist/test}/httpserver.d.ts +2 -1
  149. package/dist/test/httpserver.js +74 -0
  150. package/dist/test/httpserver.js.map +1 -0
  151. package/{test → dist/test}/secret.d.ts +0 -0
  152. package/dist/test/secret.js +25 -0
  153. package/dist/test/secret.js.map +1 -0
  154. package/{test → dist/test}/secrets-manager.d.ts +0 -0
  155. package/dist/test/secrets-manager.js +59 -0
  156. package/dist/test/secrets-manager.js.map +1 -0
  157. package/{test → dist/test}/testutils.d.ts +0 -0
  158. package/dist/test/testutils.js +44 -0
  159. package/dist/test/testutils.js.map +1 -0
  160. package/dist/types/either.d.ts +9 -0
  161. package/dist/types/either.js +3 -0
  162. package/dist/types/either.js.map +1 -0
  163. package/{types → dist/types}/input-error.d.ts +0 -0
  164. package/dist/types/input-error.js +7 -0
  165. package/dist/types/input-error.js.map +1 -0
  166. package/{types → dist/types}/language.d.ts +0 -0
  167. package/dist/types/language.js +10 -0
  168. package/dist/types/language.js.map +1 -0
  169. package/{types → dist/types}/traffictype.d.ts +0 -0
  170. package/dist/types/traffictype.js +13 -0
  171. package/dist/types/traffictype.js.map +1 -0
  172. package/{types → dist/types}/validator.d.ts +0 -0
  173. package/dist/types/validator.js +14 -0
  174. package/dist/types/validator.js.map +1 -0
  175. package/{utils → dist/utils}/api-model.d.ts +0 -0
  176. package/dist/utils/api-model.js +129 -0
  177. package/dist/utils/api-model.js.map +1 -0
  178. package/{utils → dist/utils}/base64.d.ts +0 -0
  179. package/dist/utils/base64.js +21 -0
  180. package/dist/utils/base64.js.map +1 -0
  181. package/{utils → dist/utils}/date-utils.d.ts +0 -0
  182. package/dist/utils/date-utils.js +34 -0
  183. package/dist/utils/date-utils.js.map +1 -0
  184. package/{utils → dist/utils}/geojson-types.d.ts +0 -0
  185. package/dist/utils/geojson-types.js +18 -0
  186. package/dist/utils/geojson-types.js.map +1 -0
  187. package/{utils → dist/utils}/geometry.d.ts +0 -0
  188. package/dist/utils/geometry.js +164 -0
  189. package/dist/utils/geometry.js.map +1 -0
  190. package/{utils → dist/utils}/retry.d.ts +0 -0
  191. package/dist/utils/retry.js +50 -0
  192. package/dist/utils/retry.js.map +1 -0
  193. package/{utils → dist/utils}/slack.d.ts +0 -0
  194. package/dist/utils/slack.js +25 -0
  195. package/dist/utils/slack.js.map +1 -0
  196. package/{utils → dist/utils}/utils.d.ts +16 -0
  197. package/dist/utils/utils.js +75 -0
  198. package/dist/utils/utils.js.map +1 -0
  199. package/package.json +12 -10
  200. package/src/@types/geojson-validation/index.d.ts +4 -0
  201. package/src/aws/infra/api/integration.ts +73 -0
  202. package/src/aws/infra/api/response.ts +67 -0
  203. package/src/aws/infra/api/responses.ts +124 -0
  204. package/src/aws/infra/api/static-integration.ts +62 -0
  205. package/src/aws/infra/canaries/canary-alarm.ts +31 -0
  206. package/src/aws/infra/canaries/canary-keys.ts +3 -0
  207. package/src/aws/infra/canaries/canary-parameters.ts +19 -0
  208. package/src/aws/infra/canaries/canary-role.ts +47 -0
  209. package/src/aws/infra/canaries/canary.ts +46 -0
  210. package/src/aws/infra/canaries/database-canary.ts +98 -0
  211. package/src/aws/infra/canaries/database-checker.ts +155 -0
  212. package/src/aws/infra/canaries/url-canary.ts +74 -0
  213. package/src/aws/infra/canaries/url-checker.ts +366 -0
  214. package/src/aws/infra/documentation.ts +124 -0
  215. package/src/aws/infra/scheduler.ts +59 -0
  216. package/src/aws/infra/security-rule.ts +38 -0
  217. package/src/aws/infra/sqs-integration.ts +102 -0
  218. package/src/aws/infra/sqs-queue.ts +148 -0
  219. package/src/aws/infra/stack/lambda-configs.ts +207 -0
  220. package/src/aws/infra/stack/monitoredfunction.ts +342 -0
  221. package/src/aws/infra/stack/rest_apis.ts +223 -0
  222. package/src/aws/infra/stack/stack-checking-aspect.ts +279 -0
  223. package/src/aws/infra/stack/stack.ts +145 -0
  224. package/src/aws/infra/stack/subscription.ts +58 -0
  225. package/src/aws/infra/usage-plans.ts +41 -0
  226. package/src/aws/runtime/apikey.ts +9 -0
  227. package/src/aws/runtime/digitraffic-integration-response.ts +28 -0
  228. package/src/aws/runtime/environment.ts +9 -0
  229. package/src/aws/runtime/messaging.ts +26 -0
  230. package/src/aws/runtime/s3.ts +44 -0
  231. package/src/aws/runtime/secrets/dbsecret.ts +116 -0
  232. package/src/aws/runtime/secrets/proxy-holder.ts +37 -0
  233. package/src/aws/runtime/secrets/rds-holder.ts +33 -0
  234. package/src/aws/runtime/secrets/secret-holder.ts +116 -0
  235. package/src/aws/runtime/secrets/secret.ts +50 -0
  236. package/src/aws/types/errors.ts +14 -0
  237. package/src/aws/types/lambda-response.ts +43 -0
  238. package/src/aws/types/mediatypes.ts +11 -0
  239. package/src/aws/types/model-with-reference.ts +8 -0
  240. package/src/aws/types/proxytypes.ts +27 -0
  241. package/src/aws/types/tags.ts +3 -0
  242. package/src/database/cached.ts +35 -0
  243. package/src/database/database.ts +96 -0
  244. package/src/database/last-updated.ts +59 -0
  245. package/src/database/models.ts +7 -0
  246. package/src/marine/id_utils.ts +30 -0
  247. package/src/marine/rtz.ts +57 -0
  248. package/src/test/asserter.ts +48 -0
  249. package/src/test/db-testutils.ts +44 -0
  250. package/src/test/httpserver.ts +96 -0
  251. package/src/test/secret.ts +23 -0
  252. package/src/test/secrets-manager.ts +34 -0
  253. package/src/test/testutils.ts +39 -0
  254. package/src/types/either.ts +3 -0
  255. package/src/types/input-error.ts +2 -0
  256. package/src/types/language.ts +3 -0
  257. package/src/types/traffictype.ts +8 -0
  258. package/src/types/validator.ts +10 -0
  259. package/src/utils/api-model.ts +133 -0
  260. package/src/utils/base64.ts +16 -0
  261. package/src/utils/date-utils.ts +30 -0
  262. package/src/utils/geojson-types.ts +22 -0
  263. package/src/utils/geometry.ts +164 -0
  264. package/src/utils/retry.ts +49 -0
  265. package/src/utils/slack.ts +22 -0
  266. package/src/utils/utils.ts +105 -0
  267. package/aws/infra/api/integration.js +0 -52
  268. package/aws/infra/api/response.js +0 -61
  269. package/aws/infra/api/responses.js +0 -79
  270. package/aws/infra/api/static-integration.js +0 -54
  271. package/aws/infra/canaries/canary-alarm.js +0 -26
  272. package/aws/infra/canaries/canary-parameters.js +0 -3
  273. package/aws/infra/canaries/canary-role.js +0 -46
  274. package/aws/infra/canaries/canary.js +0 -32
  275. package/aws/infra/canaries/database-canary.js +0 -55
  276. package/aws/infra/canaries/database-checker.js +0 -109
  277. package/aws/infra/canaries/url-canary.js +0 -46
  278. package/aws/infra/canaries/url-checker.js +0 -238
  279. package/aws/infra/documentation.js +0 -95
  280. package/aws/infra/scheduler.js +0 -31
  281. package/aws/infra/security-rule.js +0 -39
  282. package/aws/infra/sqs-integration.js +0 -93
  283. package/aws/infra/sqs-queue.js +0 -130
  284. package/aws/infra/stack/lambda-configs.js +0 -93
  285. package/aws/infra/stack/monitoredfunction.js +0 -135
  286. package/aws/infra/stack/rest_apis.js +0 -185
  287. package/aws/infra/stack/stack-checking-aspect.js +0 -174
  288. package/aws/infra/stack/stack.js +0 -60
  289. package/aws/infra/stack/subscription.js +0 -41
  290. package/aws/infra/usage-plans.js +0 -42
  291. package/aws/runtime/apikey.js +0 -13
  292. package/aws/runtime/digitraffic-integration-response.js +0 -26
  293. package/aws/runtime/environment.js +0 -12
  294. package/aws/runtime/messaging.js +0 -31
  295. package/aws/runtime/s3.js +0 -30
  296. package/aws/runtime/secrets/dbsecret.js +0 -96
  297. package/aws/runtime/secrets/proxy-holder.js +0 -26
  298. package/aws/runtime/secrets/rds-holder.js +0 -26
  299. package/aws/runtime/secrets/secret-holder.js +0 -73
  300. package/aws/runtime/secrets/secret.js +0 -43
  301. package/aws/types/errors.js +0 -9
  302. package/aws/types/lambda-response.js +0 -28
  303. package/aws/types/mediatypes.js +0 -15
  304. package/aws/types/model-with-reference.js +0 -3
  305. package/aws/types/proxytypes.js +0 -3
  306. package/aws/types/tags.js +0 -7
  307. package/database/cached.js +0 -32
  308. package/database/database.js +0 -62
  309. package/database/last-updated.js +0 -54
  310. package/database/models.js +0 -3
  311. package/index.d.ts +0 -1
  312. package/index.js +0 -18
  313. package/marine/id_utils.js +0 -33
  314. package/marine/rtz.js +0 -3
  315. package/test/asserter.js +0 -45
  316. package/test/db-testutils.js +0 -31
  317. package/test/httpserver.js +0 -67
  318. package/test/secret.js +0 -25
  319. package/test/secrets-manager.js +0 -59
  320. package/test/testutils.js +0 -44
  321. package/types/input-error.js +0 -7
  322. package/types/language.js +0 -10
  323. package/types/traffictype.js +0 -13
  324. package/types/validator.js +0 -14
  325. package/utils/api-model.js +0 -129
  326. package/utils/base64.js +0 -21
  327. package/utils/date-utils.js +0 -34
  328. package/utils/geojson-types.js +0 -18
  329. package/utils/geometry.js +0 -140
  330. package/utils/retry.js +0 -50
  331. package/utils/slack.js +0 -25
  332. package/utils/utils.js +0 -64
@@ -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=sqs-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqs-integration.js","sourceRoot":"","sources":["../../../src/aws/infra/sqs-integration.ts"],"names":[],"mappings":";;;AAAA,6CAAgC;AAChC,+DAA2G;AAE3G,iDAA4E;AAI5E,SAAgB,+BAA+B,CAC3C,KAAgB,EAChB,KAAY,EACZ,QAAkB,EAClB,gBAAkC,EAClC,YAAoB,EACpB,cAAuB,EACvB,aAAyC;IAEzC,uBAAuB;IACvB,MAAM,SAAS,GAAG,IAAI,cAAI,CAAC,KAAK,EAAE,GAAG,YAAY,qBAAqB,EAAE;QACpE,SAAS,EAAE,IAAI,0BAAgB,CAAC,0BAA0B,CAAC;KAC9D,CAAC,CAAC;IACH,oDAAoD;IACpD,SAAS,CAAC,WAAW,CAAC,IAAI,yBAAe,CAAC;QACtC,SAAS,EAAE;YACP,KAAK,CAAC,QAAQ;SACjB;QACD,OAAO,EAAE;YACL,iBAAiB;SACpB;KACJ,CAAC,CAAC,CAAC;IACJ,qDAAqD;IACrD,SAAS,CAAC,WAAW,CAAC,IAAI,yBAAe,CAAC;QACtC,SAAS,EAAE;YACP,GAAG;SACN;QACD,OAAO,EAAE;YACL,qBAAqB;YACrB,sBAAsB;YACtB,wBAAwB;YACxB,yBAAyB;YACzB,mBAAmB;YACnB,mBAAmB;YACnB,sBAAsB;SACzB;KACJ,CAAC,CAAC,CAAC;IACJ,6DAA6D;IAC7D,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,MAAM,cAAc,GAAG,IAAI,+BAAc,CAAC;QACtC,OAAO,EAAE,KAAK;QACd,qBAAqB,EAAE,MAAM;QAC7B,OAAO,EAAE;YACL,mBAAmB,EAAE,oCAAmB,CAAC,KAAK;YAC9C,eAAe,EAAE,SAAS;YAC1B,iBAAiB,EAAE;gBACf,4FAA4F;gBAC5F,yCAAyC,EAAE,qCAAqC;aACnF;YACD,gBAAgB,EAAE;gBACd,2EAA2E;gBAC3E,6FAA6F;gBAC7F,kBAAkB,EAAE,qBAAqB,kBAAkB,2CAA2C;aACzG;YACD,4BAA4B;YAC5B,oBAAoB,EAAE;gBAClB;oBACI,UAAU,EAAE,KAAK;oBACjB,iBAAiB,EAAE;wBACf,WAAW,EAAE,SAAS;qBACzB;iBACJ;gBACD;oBACI,UAAU,EAAE,KAAK;oBACjB,iBAAiB,EAAE;wBACf,WAAW,EAAE,OAAO;qBACvB;oBACD,gBAAgB,EAAE,KAAK;iBAC1B;aAEJ;SAEJ;QACD,IAAI,EAAE,GAAG,iBAAG,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE;KAC/C,CAAC,CAAC;IACH,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE;QACvC,gBAAgB;QAChB,cAAc;QACd,aAAa,EAAE,aAAa,IAAI,EAAE;QAClC,eAAe,EAAE;YACb;gBACI,UAAU,EAAE,KAAK;gBACjB,kBAAkB,EAAE;oBAChB,qCAAqC,EAAE,IAAI;iBAC9C;aACJ;YACD;gBACI,UAAU,EAAE,KAAK;gBACjB,kBAAkB,EAAE;oBAChB,qCAAqC,EAAE,IAAI;iBAC9C;aACJ;SACJ;KACJ,CAAC,CAAC;AACP,CAAC;AA9FD,0EA8FC"}
File without changes
@@ -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=sqs-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqs-queue.js","sourceRoot":"","sources":["../../../src/aws/infra/sqs-queue.ts"],"names":[],"mappings":";;;AAAA,iDAAuE;AACvE,6CAAqC;AACrC,+CAA6D;AAC7D,iDAAoD;AACpD,uDAA2D;AAC3D,mDAAmD;AACnD,mFAAoE;AACpE,+DAAgF;AAChF,+EAA6D;AAM7D,iEAA4D;AAE5D;;;;;GAKG;AACH,MAAa,mBAAoB,SAAQ,eAAK;IAC1C,YAAY,KAAgB,EAAE,IAAY,EAAE,KAAiB;QACzD,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,KAAuB,EAAE,IAAY,EAAE,KAAiB;QAClE,MAAM,SAAS,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,IAAI,IAAI,QAAQ,CAAC;QACnE,MAAM,UAAU,GAAG,EAAC,GAAG,KAAK,EAAE,GAAG;gBAC7B,UAAU,EAAE,yBAAe,CAAC,WAAW;gBACvC,SAAS;gBACT,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI;oBACtC,eAAe,EAAE,CAAC;oBAClB,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;iBAChD;aACJ,EAAC,CAAC;QAEH,OAAO,IAAI,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACjE,CAAC;CACJ;AAlBD,kDAkBC;AAED,MAAa,kBAAkB;IAC3B,MAAM,CAAC,MAAM,CAAC,KAAuB,EAAE,IAAY;QAC/C,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,IAAI,IAAI,MAAM,CAAC;QAE/D,MAAM,GAAG,GAAG,IAAI,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE;YAChD,SAAS,EAAE,OAAO;YAClB,iBAAiB,EAAE,sBAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,UAAU,EAAE,yBAAe,CAAC,WAAW;SAC1C,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,eAAM,CAAC,KAAK,EAAE,GAAG,OAAO,SAAS,EAAE;YACrD,iBAAiB,EAAE,0BAAiB,CAAC,SAAS;SACjD,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,GAAG,OAAO,WAAW,CAAC;QAC9C,MAAM,MAAM,GAAG,qCAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE;YAC5D,OAAO,EAAE,oBAAO,CAAC,WAAW;YAC5B,YAAY,EAAE,wBAAa,CAAC,QAAQ;YACpC,YAAY,EAAE,eAAe;YAC7B,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC;YACtC,OAAO,EAAE,sBAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,eAAe;YACxB,UAAU,EAAE,GAAG;YACf,4BAA4B,EAAE,CAAC;SAClC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,yBAAe,EAAE,CAAC;QACxC,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACrC,SAAS,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACxC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QAEnD,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,cAAc,CAAC,IAAI,yCAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QAE/C,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAEjC,OAAO,GAAG,CAAC;IACf,CAAC;CACJ;AAtCD,gDAsCC;AAED,SAAS,WAAW,CAAC,KAAuB,EAAE,OAAe,EAAE,GAAU;IACrE,MAAM,SAAS,GAAG,GAAG,OAAO,QAAQ,CAAC;IACrC,GAAG,CAAC,8BAA8B,CAAC;QAC/B,MAAM,EAAE,sBAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;KAC9B,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE;QAC7B,SAAS;QACT,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,iCAAgB,CAAC,aAAa;QAChD,kBAAkB,EAAE,mCAAkB,CAAC,sBAAsB;KAChE,CAAC,CAAC,cAAc,CAAC,IAAI,kCAAS,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC7B,MAAM,YAAY,GAAG,eAAe;SAC/B,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC;SAChC,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;SAC5C,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;SAC5C,OAAO,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,2CAA2C;IAElH,OAAO,IAAI,uBAAU,CAAC,YAAY,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,EAAM,EAAE,KAAa,EAAE,IAAY,EAAE,UAAkB;IAC7E,IAAI;QACA,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;KAC/C;IAAC,OAAO,KAAK,EAAE;QACZ,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;QACtE,IAAI;YACA,MAAM,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;SAC/C;QAAC,OAAO,EAAE,EAAE;YACT,OAAO,CAAC,KAAK,CAAC,uDAAuD,EAAE,KAAK,CAAC,CAAC;SACjF;KACJ;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,EAAM,EAAE,KAAa,EAAE,IAAY,EAAE,GAAW;IAC9D,OAAO,EAAE,CAAC,MAAM,CAAC;QACb,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG;KAC3B,CAAC,CAAC,OAAO,EAAE,CAAC;AACjB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,SAAS,aAAa;IAClB,OAAO,KAAK,UAAU,OAAO,CAAC,KAAe;QACzC,8DAA8D;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAE/B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAY,EAAE,GAAW,EAAE,EAAE,CAC9D,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC;AACN,CAAC;AAED,MAAM,eAAe,GAAG;;;;;;;CAOvB,CAAC"}
@@ -1,6 +1,6 @@
1
- import { Architecture, Code, FunctionProps, Runtime } from 'aws-cdk-lib/aws-lambda';
1
+ import { Architecture, Code, FunctionProps, Runtime } from "aws-cdk-lib/aws-lambda";
2
2
  import { ISecurityGroup, IVpc, SubnetSelection } from "aws-cdk-lib/aws-ec2";
3
- import { Role } from 'aws-cdk-lib/aws-iam';
3
+ import { Role } from "aws-cdk-lib/aws-iam";
4
4
  import { DigitrafficStack } from "./stack";
5
5
  import { MonitoredFunctionAlarmProps } from "./monitoredfunction";
6
6
  export declare type LambdaEnvironment = Record<string, string>;
@@ -41,8 +41,8 @@ export interface FunctionParameters {
41
41
  memorySize?: number;
42
42
  timeout?: number;
43
43
  functionName?: string;
44
- code?: Code;
45
- handler?: string;
44
+ code: Code;
45
+ handler: string;
46
46
  readOnly?: boolean;
47
47
  environment?: {
48
48
  [key: string]: string;
@@ -68,5 +68,5 @@ export declare type MonitoredFunctionParameters = {
68
68
  readonly durationWarningProps?: MonitoredFunctionAlarmProps;
69
69
  readonly errorAlarmProps?: MonitoredFunctionAlarmProps;
70
70
  readonly throttleAlarmProps?: MonitoredFunctionAlarmProps;
71
- };
71
+ } & FunctionParameters;
72
72
  export {};
@@ -0,0 +1,105 @@
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
+ ? {
10
+ subnets: stack.vpc.privateSubnets,
11
+ }
12
+ : undefined;
13
+ return {
14
+ ...lambdaFunctionProps(stack, environment, lambdaName, simpleLambdaName, config),
15
+ ...{
16
+ vpc: stack.vpc || undefined,
17
+ vpcSubnets,
18
+ securityGroup: stack.lambdaDbSg || undefined,
19
+ },
20
+ };
21
+ }
22
+ exports.databaseFunctionProps = databaseFunctionProps;
23
+ function lambdaFunctionProps(stack, environment, lambdaName, simpleLambdaName, config) {
24
+ return {
25
+ runtime: config?.runtime || aws_lambda_1.Runtime.NODEJS_14_X,
26
+ architecture: config?.architecture || aws_lambda_1.Architecture.ARM_64,
27
+ memorySize: config?.memorySize || 128,
28
+ functionName: lambdaName,
29
+ role: config?.role,
30
+ timeout: aws_cdk_lib_1.Duration.seconds(config?.timeout || 60),
31
+ logRetention: aws_logs_1.RetentionDays.ONE_YEAR,
32
+ reservedConcurrentExecutions: config?.reservedConcurrentExecutions || 2,
33
+ code: getAssetCode(simpleLambdaName, config),
34
+ handler: `${simpleLambdaName}.handler`,
35
+ environment,
36
+ };
37
+ }
38
+ exports.lambdaFunctionProps = lambdaFunctionProps;
39
+ function getAssetCode(simpleLambdaName, config) {
40
+ const lambdaPath = config?.singleLambda
41
+ ? `dist/lambda/`
42
+ : `dist/lambda/${simpleLambdaName}`;
43
+ return new aws_lambda_1.AssetCode(lambdaPath);
44
+ }
45
+ /**
46
+ * Creates a base configuration for a Lambda that uses an RDS database
47
+ * @param vpc "Private" Lambdas are associated with a VPC
48
+ * @param lambdaDbSg Security Group shared by Lambda and RDS
49
+ * @param props Database connection properties for the Lambda
50
+ * @param config Lambda configuration
51
+ */
52
+ function dbLambdaConfiguration(vpc, lambdaDbSg, props, config) {
53
+ return {
54
+ runtime: props.runtime || aws_lambda_1.Runtime.NODEJS_14_X,
55
+ memorySize: props.memorySize || config.memorySize || 1024,
56
+ functionName: config.functionName,
57
+ code: config.code,
58
+ role: config.role,
59
+ handler: config.handler,
60
+ timeout: aws_cdk_lib_1.Duration.seconds(config.timeout || props.defaultLambdaDurationSeconds || 60),
61
+ environment: config.environment || {
62
+ DB_USER: props.dbProps?.username ?? "",
63
+ DB_PASS: props.dbProps?.password ?? "",
64
+ DB_URI: (config.readOnly
65
+ ? props.dbProps?.ro_uri
66
+ : props.dbProps?.uri) ?? "",
67
+ },
68
+ logRetention: aws_logs_1.RetentionDays.ONE_YEAR,
69
+ vpc: vpc,
70
+ vpcSubnets: {
71
+ subnets: vpc.privateSubnets,
72
+ },
73
+ securityGroups: [lambdaDbSg],
74
+ reservedConcurrentExecutions: config.reservedConcurrentExecutions || 3,
75
+ };
76
+ }
77
+ exports.dbLambdaConfiguration = dbLambdaConfiguration;
78
+ function defaultLambdaConfiguration(config) {
79
+ const props = {
80
+ runtime: aws_lambda_1.Runtime.NODEJS_14_X,
81
+ memorySize: config.memorySize ?? 128,
82
+ functionName: config.functionName,
83
+ handler: config.handler,
84
+ environment: config.environment ?? {},
85
+ logRetention: aws_logs_1.RetentionDays.ONE_YEAR,
86
+ reservedConcurrentExecutions: config.reservedConcurrentExecutions,
87
+ code: config.code,
88
+ role: config.role,
89
+ timeout: aws_cdk_lib_1.Duration.seconds(config.timeout || 10),
90
+ };
91
+ if (config.vpc) {
92
+ return {
93
+ ...props,
94
+ ...{
95
+ vpc: config.vpc,
96
+ vpcSubnets: {
97
+ subnets: config.vpc?.privateSubnets,
98
+ },
99
+ },
100
+ };
101
+ }
102
+ return props;
103
+ }
104
+ exports.defaultLambdaConfiguration = defaultLambdaConfiguration;
105
+ //# sourceMappingURL=lambda-configs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lambda-configs.js","sourceRoot":"","sources":["../../../../src/aws/infra/stack/lambda-configs.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Function, FunctionProps } from 'aws-cdk-lib/aws-lambda';
1
+ import { Function, FunctionProps } from "aws-cdk-lib/aws-lambda";
2
2
  import { Stack } from "aws-cdk-lib";
3
3
  import { ComparisonOperator } from "aws-cdk-lib/aws-cloudwatch";
4
4
  import { DigitrafficStack } from "../stack/stack";
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MonitoredDBFunction = exports.MonitoredFunction = void 0;
4
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
5
+ const aws_cloudwatch_actions_1 = require("aws-cdk-lib/aws-cloudwatch-actions");
6
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
7
+ const lambda_configs_1 = require("../stack/lambda-configs");
8
+ const change_case_1 = require("change-case");
9
+ const subscription_1 = require("../stack/subscription");
10
+ /**
11
+ * Creates a Lambda function that monitors default CloudWatch Lambda metrics with CloudWatch Alarms.
12
+ */
13
+ class MonitoredFunction extends aws_lambda_1.Function {
14
+ /**
15
+ * @param scope Stack
16
+ * @param id Lambda construct Id
17
+ * @param functionProps Lambda function properties
18
+ * @param alarmSnsTopic SNS topic for alarms
19
+ * @param warningSnsTopic SNS topic for warnings
20
+ * @param production Is the stack a production stack, used for determining the alarm topic
21
+ * @param trafficType Traffic type, used for alarm names. Set to null if Lambda is not related to any traffic type.
22
+ * @param props Monitored function properties
23
+ */
24
+ constructor(scope, id, functionProps, alarmSnsTopic, warningSnsTopic, production, trafficType, props) {
25
+ super(scope, id, functionProps);
26
+ if (functionProps.functionName === undefined) {
27
+ throw new Error("Function name not provided");
28
+ }
29
+ this.givenName = functionProps.functionName;
30
+ const alarmSnsAction = new aws_cloudwatch_actions_1.SnsAction(alarmSnsTopic);
31
+ const warningSnsAction = new aws_cloudwatch_actions_1.SnsAction(warningSnsTopic);
32
+ if (props?.durationAlarmProps?.create !== false) {
33
+ if (!functionProps.timeout) {
34
+ throw new Error("Timeout needs to be explicitly set");
35
+ }
36
+ this.createAlarm(scope, this.metricDuration().with({ statistic: "max" }), "Duration", "Duration alarm", `Duration has exceeded ${functionProps.timeout.toSeconds()} seconds`, trafficType, this.getAlarmActionForEnv(alarmSnsAction, warningSnsAction, production), functionProps.timeout.toMilliseconds(), 1, 1, aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, props?.durationAlarmProps);
37
+ }
38
+ if (props?.durationWarningProps?.create !== false) {
39
+ if (!functionProps.timeout) {
40
+ throw new Error("Timeout needs to be explicitly set");
41
+ }
42
+ this.createAlarm(scope, this.metricDuration().with({ statistic: "max" }), "Duration-Warning", "Duration warning", `Duration is 85 % of max ${functionProps.timeout.toSeconds()} seconds`, trafficType, warningSnsAction, functionProps.timeout.toMilliseconds() * 0.85, 1, 1, aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, props?.durationWarningProps);
43
+ }
44
+ if (props?.errorAlarmProps?.create !== false) {
45
+ this.createAlarm(scope, this.metricErrors(), "Errors", "Errors alarm", "Invocations did not succeed", trafficType, this.getAlarmActionForEnv(alarmSnsAction, warningSnsAction, production), 1, 1, 1, aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, props?.errorAlarmProps);
46
+ }
47
+ if (props?.throttleAlarmProps?.create !== false) {
48
+ this.createAlarm(scope, this.metricThrottles(), "Throttles", "Throttles alarm", "Has throttled", trafficType, this.getAlarmActionForEnv(alarmSnsAction, warningSnsAction, production), 0, 1, 1, aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD, props?.throttleAlarmProps);
49
+ }
50
+ }
51
+ /**
52
+ * Create new MonitoredFunction. Use topics from given DigitrafficStack.
53
+ *
54
+ * @param stack DigitrafficStack
55
+ * @param id Lambda construct Id
56
+ * @param functionProps Lambda function properties
57
+ * @param props Monitored function properties
58
+ */
59
+ static create(stack, id, functionProps, props) {
60
+ if (props === MonitoredFunction.DISABLE_ALARMS &&
61
+ stack.configuration.production) {
62
+ throw new Error(`Function ${functionProps.functionName} has DISABLE_ALARMS. Remove before installing to production or define your own properties!`);
63
+ }
64
+ return new MonitoredFunction(stack, id, functionProps, stack.alarmTopic, stack.warningTopic, stack.configuration.production, stack.configuration.trafficType, props);
65
+ }
66
+ /**
67
+ * Create new MonitoredFunction. Use topics from given DigitrafficStack. Generate names from given name and configuration shortName.
68
+ *
69
+ * 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.
70
+ *
71
+ * @param stack DigitrafficStack
72
+ * @param name param-case name
73
+ * @param environment Lambda environment
74
+ * @param functionParameters Lambda function parameters
75
+ */
76
+ static createV2(stack, name, environment, functionParameters) {
77
+ const functionName = functionParameters?.functionName ||
78
+ `${stack.configuration.shortName}-${(0, change_case_1.pascalCase)(name)}`;
79
+ const functionProps = (0, lambda_configs_1.databaseFunctionProps)(stack, environment, functionName, name, functionParameters);
80
+ return MonitoredFunction.create(stack, functionName, functionProps, functionParameters);
81
+ }
82
+ createAlarm(stack, metric, alarmId, alarmName, alarmDescription, trafficType, alarmSnsAction, threshold, evaluationPeriods, datapointsToAlarm, comparisonOperator, alarmProps) {
83
+ metric
84
+ .createAlarm(stack, `${this.node.id}-${alarmId}`, {
85
+ alarmName: `${trafficType ?? ""} ${stack.stackName} ${this.functionName} ${alarmName}`.trim(),
86
+ alarmDescription,
87
+ threshold: alarmProps?.threshold ?? threshold,
88
+ evaluationPeriods: alarmProps?.evaluationPeriods ?? evaluationPeriods,
89
+ datapointsToAlarm: alarmProps?.datapointsToAlarm ?? datapointsToAlarm,
90
+ comparisonOperator: alarmProps?.comparisonOperator ?? comparisonOperator,
91
+ })
92
+ .addAlarmAction(alarmSnsAction);
93
+ }
94
+ getAlarmActionForEnv(alarmAction, warningAction, production) {
95
+ return production ? alarmAction : warningAction;
96
+ }
97
+ }
98
+ exports.MonitoredFunction = MonitoredFunction;
99
+ /** disable all alarms */
100
+ MonitoredFunction.DISABLE_ALARMS = {
101
+ durationAlarmProps: {
102
+ create: false,
103
+ },
104
+ durationWarningProps: {
105
+ create: false,
106
+ },
107
+ errorAlarmProps: {
108
+ create: false,
109
+ },
110
+ throttleAlarmProps: {
111
+ create: false,
112
+ },
113
+ };
114
+ class MonitoredDBFunction {
115
+ /**
116
+ * Create new MonitoredDBFunction. Use topics from given DigitrafficStack. Generate names from given name and configuration shortName.
117
+ * Grant secret and create log subscription.
118
+ *
119
+ * 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.
120
+ *
121
+ * If you don't need to pass any extra arguments to lambda-environment, you can leave environment out and this function will create the
122
+ * default Lambda Environment with SECRET_ID and DB_APPLICATION.
123
+ *
124
+ * @param stack DigitrafficStack
125
+ * @param name param-case name
126
+ * @param environment Lambda environment
127
+ * @param functionParameters Lambda function parameters
128
+ */
129
+ static create(stack, name, environment, functionParameters) {
130
+ const functionName = functionParameters?.functionName ||
131
+ `${stack.configuration.shortName}-${(0, change_case_1.pascalCase)(name)}`;
132
+ const env = environment ? environment : stack.createLambdaEnvironment();
133
+ const functionProps = (0, lambda_configs_1.databaseFunctionProps)(stack, env, functionName, name, functionParameters);
134
+ const mf = MonitoredFunction.create(stack, functionName, functionProps, functionParameters);
135
+ stack.grantSecret(mf);
136
+ if (stack.configuration.logsDestinationArn) {
137
+ new subscription_1.DigitrafficLogSubscriptions(stack, mf);
138
+ }
139
+ return mf;
140
+ }
141
+ }
142
+ exports.MonitoredDBFunction = MonitoredDBFunction;
143
+ //# sourceMappingURL=monitoredfunction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitoredfunction.js","sourceRoot":"","sources":["../../../../src/aws/infra/stack/monitoredfunction.ts"],"names":[],"mappings":"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"}
File without changes