@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.
- package/{aws → dist/aws}/infra/api/integration.d.ts +0 -0
- package/dist/aws/infra/api/integration.js +52 -0
- package/dist/aws/infra/api/integration.js.map +1 -0
- package/{aws → dist/aws}/infra/api/response.d.ts +0 -0
- package/dist/aws/infra/api/response.js +61 -0
- package/dist/aws/infra/api/response.js.map +1 -0
- package/{aws → dist/aws}/infra/api/responses.d.ts +3 -3
- package/dist/aws/infra/api/responses.js +82 -0
- package/dist/aws/infra/api/responses.js.map +1 -0
- package/{aws → dist/aws}/infra/api/static-integration.d.ts +0 -0
- package/dist/aws/infra/api/static-integration.js +54 -0
- package/dist/aws/infra/api/static-integration.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/canary-alarm.d.ts +0 -0
- package/dist/aws/infra/canaries/canary-alarm.js +26 -0
- package/dist/aws/infra/canaries/canary-alarm.js.map +1 -0
- package/dist/aws/infra/canaries/canary-keys.d.ts +3 -0
- package/dist/aws/infra/canaries/canary-keys.js +7 -0
- package/dist/aws/infra/canaries/canary-keys.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/canary-parameters.d.ts +0 -0
- package/dist/aws/infra/canaries/canary-parameters.js +3 -0
- package/dist/aws/infra/canaries/canary-parameters.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/canary-role.d.ts +0 -0
- package/dist/aws/infra/canaries/canary-role.js +46 -0
- package/dist/aws/infra/canaries/canary-role.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/canary.d.ts +0 -0
- package/dist/aws/infra/canaries/canary.js +32 -0
- package/dist/aws/infra/canaries/canary.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/database-canary.d.ts +0 -0
- package/dist/aws/infra/canaries/database-canary.js +70 -0
- package/dist/aws/infra/canaries/database-canary.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/database-checker.d.ts +2 -2
- package/dist/aws/infra/canaries/database-checker.js +103 -0
- package/dist/aws/infra/canaries/database-checker.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/url-canary.d.ts +0 -3
- package/dist/aws/infra/canaries/url-canary.js +47 -0
- package/dist/aws/infra/canaries/url-canary.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/url-checker.d.ts +0 -0
- package/dist/aws/infra/canaries/url-checker.js +252 -0
- package/dist/aws/infra/canaries/url-checker.js.map +1 -0
- package/{aws → dist/aws}/infra/documentation.d.ts +0 -0
- package/dist/aws/infra/documentation.js +95 -0
- package/dist/aws/infra/documentation.js.map +1 -0
- package/{aws → dist/aws}/infra/scheduler.d.ts +7 -7
- package/dist/aws/infra/scheduler.js +31 -0
- package/dist/aws/infra/scheduler.js.map +1 -0
- package/{aws → dist/aws}/infra/security-rule.d.ts +0 -0
- package/dist/aws/infra/security-rule.js +39 -0
- package/dist/aws/infra/security-rule.js.map +1 -0
- package/{aws → dist/aws}/infra/sqs-integration.d.ts +0 -0
- package/dist/aws/infra/sqs-integration.js +93 -0
- package/dist/aws/infra/sqs-integration.js.map +1 -0
- package/{aws → dist/aws}/infra/sqs-queue.d.ts +0 -0
- package/dist/aws/infra/sqs-queue.js +130 -0
- package/dist/aws/infra/sqs-queue.js.map +1 -0
- package/{aws → dist/aws}/infra/stack/lambda-configs.d.ts +5 -5
- package/dist/aws/infra/stack/lambda-configs.js +105 -0
- package/dist/aws/infra/stack/lambda-configs.js.map +1 -0
- package/{aws → dist/aws}/infra/stack/monitoredfunction.d.ts +1 -1
- package/dist/aws/infra/stack/monitoredfunction.js +143 -0
- package/dist/aws/infra/stack/monitoredfunction.js.map +1 -0
- package/{aws → dist/aws}/infra/stack/rest_apis.d.ts +0 -0
- package/dist/aws/infra/stack/rest_apis.js +185 -0
- package/dist/aws/infra/stack/rest_apis.js.map +1 -0
- package/{aws → dist/aws}/infra/stack/stack-checking-aspect.d.ts +0 -0
- package/dist/aws/infra/stack/stack-checking-aspect.js +174 -0
- package/dist/aws/infra/stack/stack-checking-aspect.js.map +1 -0
- package/{aws → dist/aws}/infra/stack/stack.d.ts +5 -4
- package/dist/aws/infra/stack/stack.js +67 -0
- package/dist/aws/infra/stack/stack.js.map +1 -0
- package/{aws → dist/aws}/infra/stack/subscription.d.ts +3 -3
- package/dist/aws/infra/stack/subscription.js +42 -0
- package/dist/aws/infra/stack/subscription.js.map +1 -0
- package/{aws → dist/aws}/infra/usage-plans.d.ts +0 -0
- package/dist/aws/infra/usage-plans.js +42 -0
- package/dist/aws/infra/usage-plans.js.map +1 -0
- package/{aws → dist/aws}/runtime/apikey.d.ts +0 -0
- package/dist/aws/runtime/apikey.js +13 -0
- package/dist/aws/runtime/apikey.js.map +1 -0
- package/{aws → dist/aws}/runtime/digitraffic-integration-response.d.ts +0 -0
- package/dist/aws/runtime/digitraffic-integration-response.js +26 -0
- package/dist/aws/runtime/digitraffic-integration-response.js.map +1 -0
- package/{aws → dist/aws}/runtime/environment.d.ts +0 -0
- package/dist/aws/runtime/environment.js +12 -0
- package/dist/aws/runtime/environment.js.map +1 -0
- package/{aws → dist/aws}/runtime/messaging.d.ts +0 -0
- package/dist/aws/runtime/messaging.js +31 -0
- package/dist/aws/runtime/messaging.js.map +1 -0
- package/{aws → dist/aws}/runtime/s3.d.ts +0 -0
- package/dist/aws/runtime/s3.js +30 -0
- package/dist/aws/runtime/s3.js.map +1 -0
- package/{aws → dist/aws}/runtime/secrets/dbsecret.d.ts +0 -0
- package/dist/aws/runtime/secrets/dbsecret.js +96 -0
- package/dist/aws/runtime/secrets/dbsecret.js.map +1 -0
- package/{aws → dist/aws}/runtime/secrets/proxy-holder.d.ts +0 -0
- package/dist/aws/runtime/secrets/proxy-holder.js +27 -0
- package/dist/aws/runtime/secrets/proxy-holder.js.map +1 -0
- package/{aws → dist/aws}/runtime/secrets/rds-holder.d.ts +0 -0
- package/dist/aws/runtime/secrets/rds-holder.js +27 -0
- package/dist/aws/runtime/secrets/rds-holder.js.map +1 -0
- package/{aws → dist/aws}/runtime/secrets/secret-holder.d.ts +0 -0
- package/dist/aws/runtime/secrets/secret-holder.js +76 -0
- package/dist/aws/runtime/secrets/secret-holder.js.map +1 -0
- package/{aws → dist/aws}/runtime/secrets/secret.d.ts +0 -0
- package/dist/aws/runtime/secrets/secret.js +43 -0
- package/dist/aws/runtime/secrets/secret.js.map +1 -0
- package/{aws → dist/aws}/types/errors.d.ts +4 -0
- package/dist/aws/types/errors.js +16 -0
- package/dist/aws/types/errors.js.map +1 -0
- package/{aws → dist/aws}/types/lambda-response.d.ts +4 -3
- package/dist/aws/types/lambda-response.js +33 -0
- package/dist/aws/types/lambda-response.js.map +1 -0
- package/{aws → dist/aws}/types/mediatypes.d.ts +1 -1
- package/dist/aws/types/mediatypes.js +16 -0
- package/dist/aws/types/mediatypes.js.map +1 -0
- package/{aws → dist/aws}/types/model-with-reference.d.ts +0 -0
- package/dist/aws/types/model-with-reference.js +3 -0
- package/dist/aws/types/model-with-reference.js.map +1 -0
- package/{aws → dist/aws}/types/proxytypes.d.ts +0 -0
- package/dist/aws/types/proxytypes.js +3 -0
- package/dist/aws/types/proxytypes.js.map +1 -0
- package/{aws → dist/aws}/types/tags.d.ts +0 -0
- package/dist/aws/types/tags.js +7 -0
- package/dist/aws/types/tags.js.map +1 -0
- package/{database → dist/database}/cached.d.ts +0 -0
- package/dist/database/cached.js +32 -0
- package/dist/database/cached.js.map +1 -0
- package/{database → dist/database}/database.d.ts +0 -0
- package/dist/database/database.js +70 -0
- package/dist/database/database.js.map +1 -0
- package/{database → dist/database}/last-updated.d.ts +0 -0
- package/dist/database/last-updated.js +54 -0
- package/dist/database/last-updated.js.map +1 -0
- package/{database → dist/database}/models.d.ts +0 -0
- package/dist/database/models.js +3 -0
- package/dist/database/models.js.map +1 -0
- package/{marine → dist/marine}/id_utils.d.ts +0 -0
- package/dist/marine/id_utils.js +33 -0
- package/dist/marine/id_utils.js.map +1 -0
- package/{marine → dist/marine}/rtz.d.ts +0 -0
- package/dist/marine/rtz.js +3 -0
- package/dist/marine/rtz.js.map +1 -0
- package/{test → dist/test}/asserter.d.ts +0 -0
- package/dist/test/asserter.js +45 -0
- package/dist/test/asserter.js.map +1 -0
- package/{test → dist/test}/db-testutils.d.ts +0 -0
- package/dist/test/db-testutils.js +31 -0
- package/dist/test/db-testutils.js.map +1 -0
- package/{test → dist/test}/httpserver.d.ts +2 -1
- package/dist/test/httpserver.js +74 -0
- package/dist/test/httpserver.js.map +1 -0
- package/{test → dist/test}/secret.d.ts +0 -0
- package/dist/test/secret.js +25 -0
- package/dist/test/secret.js.map +1 -0
- package/{test → dist/test}/secrets-manager.d.ts +0 -0
- package/dist/test/secrets-manager.js +59 -0
- package/dist/test/secrets-manager.js.map +1 -0
- package/{test → dist/test}/testutils.d.ts +0 -0
- package/dist/test/testutils.js +44 -0
- package/dist/test/testutils.js.map +1 -0
- package/dist/types/either.d.ts +9 -0
- package/dist/types/either.js +3 -0
- package/dist/types/either.js.map +1 -0
- package/{types → dist/types}/input-error.d.ts +0 -0
- package/dist/types/input-error.js +7 -0
- package/dist/types/input-error.js.map +1 -0
- package/{types → dist/types}/language.d.ts +0 -0
- package/dist/types/language.js +10 -0
- package/dist/types/language.js.map +1 -0
- package/{types → dist/types}/traffictype.d.ts +0 -0
- package/dist/types/traffictype.js +13 -0
- package/dist/types/traffictype.js.map +1 -0
- package/{types → dist/types}/validator.d.ts +0 -0
- package/dist/types/validator.js +14 -0
- package/dist/types/validator.js.map +1 -0
- package/{utils → dist/utils}/api-model.d.ts +0 -0
- package/dist/utils/api-model.js +129 -0
- package/dist/utils/api-model.js.map +1 -0
- package/{utils → dist/utils}/base64.d.ts +0 -0
- package/dist/utils/base64.js +21 -0
- package/dist/utils/base64.js.map +1 -0
- package/{utils → dist/utils}/date-utils.d.ts +0 -0
- package/dist/utils/date-utils.js +34 -0
- package/dist/utils/date-utils.js.map +1 -0
- package/{utils → dist/utils}/geojson-types.d.ts +0 -0
- package/dist/utils/geojson-types.js +18 -0
- package/dist/utils/geojson-types.js.map +1 -0
- package/{utils → dist/utils}/geometry.d.ts +0 -0
- package/dist/utils/geometry.js +164 -0
- package/dist/utils/geometry.js.map +1 -0
- package/{utils → dist/utils}/retry.d.ts +0 -0
- package/dist/utils/retry.js +50 -0
- package/dist/utils/retry.js.map +1 -0
- package/{utils → dist/utils}/slack.d.ts +0 -0
- package/dist/utils/slack.js +25 -0
- package/dist/utils/slack.js.map +1 -0
- package/{utils → dist/utils}/utils.d.ts +16 -0
- package/dist/utils/utils.js +75 -0
- package/dist/utils/utils.js.map +1 -0
- package/package.json +12 -10
- package/src/@types/geojson-validation/index.d.ts +4 -0
- package/src/aws/infra/api/integration.ts +73 -0
- package/src/aws/infra/api/response.ts +67 -0
- package/src/aws/infra/api/responses.ts +124 -0
- package/src/aws/infra/api/static-integration.ts +62 -0
- package/src/aws/infra/canaries/canary-alarm.ts +31 -0
- package/src/aws/infra/canaries/canary-keys.ts +3 -0
- package/src/aws/infra/canaries/canary-parameters.ts +19 -0
- package/src/aws/infra/canaries/canary-role.ts +47 -0
- package/src/aws/infra/canaries/canary.ts +46 -0
- package/src/aws/infra/canaries/database-canary.ts +98 -0
- package/src/aws/infra/canaries/database-checker.ts +155 -0
- package/src/aws/infra/canaries/url-canary.ts +74 -0
- package/src/aws/infra/canaries/url-checker.ts +366 -0
- package/src/aws/infra/documentation.ts +124 -0
- package/src/aws/infra/scheduler.ts +59 -0
- package/src/aws/infra/security-rule.ts +38 -0
- package/src/aws/infra/sqs-integration.ts +102 -0
- package/src/aws/infra/sqs-queue.ts +148 -0
- package/src/aws/infra/stack/lambda-configs.ts +207 -0
- package/src/aws/infra/stack/monitoredfunction.ts +342 -0
- package/src/aws/infra/stack/rest_apis.ts +223 -0
- package/src/aws/infra/stack/stack-checking-aspect.ts +279 -0
- package/src/aws/infra/stack/stack.ts +145 -0
- package/src/aws/infra/stack/subscription.ts +58 -0
- package/src/aws/infra/usage-plans.ts +41 -0
- package/src/aws/runtime/apikey.ts +9 -0
- package/src/aws/runtime/digitraffic-integration-response.ts +28 -0
- package/src/aws/runtime/environment.ts +9 -0
- package/src/aws/runtime/messaging.ts +26 -0
- package/src/aws/runtime/s3.ts +44 -0
- package/src/aws/runtime/secrets/dbsecret.ts +116 -0
- package/src/aws/runtime/secrets/proxy-holder.ts +37 -0
- package/src/aws/runtime/secrets/rds-holder.ts +33 -0
- package/src/aws/runtime/secrets/secret-holder.ts +116 -0
- package/src/aws/runtime/secrets/secret.ts +50 -0
- package/src/aws/types/errors.ts +14 -0
- package/src/aws/types/lambda-response.ts +43 -0
- package/src/aws/types/mediatypes.ts +11 -0
- package/src/aws/types/model-with-reference.ts +8 -0
- package/src/aws/types/proxytypes.ts +27 -0
- package/src/aws/types/tags.ts +3 -0
- package/src/database/cached.ts +35 -0
- package/src/database/database.ts +96 -0
- package/src/database/last-updated.ts +59 -0
- package/src/database/models.ts +7 -0
- package/src/marine/id_utils.ts +30 -0
- package/src/marine/rtz.ts +57 -0
- package/src/test/asserter.ts +48 -0
- package/src/test/db-testutils.ts +44 -0
- package/src/test/httpserver.ts +96 -0
- package/src/test/secret.ts +23 -0
- package/src/test/secrets-manager.ts +34 -0
- package/src/test/testutils.ts +39 -0
- package/src/types/either.ts +3 -0
- package/src/types/input-error.ts +2 -0
- package/src/types/language.ts +3 -0
- package/src/types/traffictype.ts +8 -0
- package/src/types/validator.ts +10 -0
- package/src/utils/api-model.ts +133 -0
- package/src/utils/base64.ts +16 -0
- package/src/utils/date-utils.ts +30 -0
- package/src/utils/geojson-types.ts +22 -0
- package/src/utils/geometry.ts +164 -0
- package/src/utils/retry.ts +49 -0
- package/src/utils/slack.ts +22 -0
- package/src/utils/utils.ts +105 -0
- package/aws/infra/api/integration.js +0 -52
- package/aws/infra/api/response.js +0 -61
- package/aws/infra/api/responses.js +0 -79
- package/aws/infra/api/static-integration.js +0 -54
- package/aws/infra/canaries/canary-alarm.js +0 -26
- package/aws/infra/canaries/canary-parameters.js +0 -3
- package/aws/infra/canaries/canary-role.js +0 -46
- package/aws/infra/canaries/canary.js +0 -32
- package/aws/infra/canaries/database-canary.js +0 -55
- package/aws/infra/canaries/database-checker.js +0 -109
- package/aws/infra/canaries/url-canary.js +0 -46
- package/aws/infra/canaries/url-checker.js +0 -238
- package/aws/infra/documentation.js +0 -95
- package/aws/infra/scheduler.js +0 -31
- package/aws/infra/security-rule.js +0 -39
- package/aws/infra/sqs-integration.js +0 -93
- package/aws/infra/sqs-queue.js +0 -130
- package/aws/infra/stack/lambda-configs.js +0 -93
- package/aws/infra/stack/monitoredfunction.js +0 -135
- package/aws/infra/stack/rest_apis.js +0 -185
- package/aws/infra/stack/stack-checking-aspect.js +0 -174
- package/aws/infra/stack/stack.js +0 -60
- package/aws/infra/stack/subscription.js +0 -41
- package/aws/infra/usage-plans.js +0 -42
- package/aws/runtime/apikey.js +0 -13
- package/aws/runtime/digitraffic-integration-response.js +0 -26
- package/aws/runtime/environment.js +0 -12
- package/aws/runtime/messaging.js +0 -31
- package/aws/runtime/s3.js +0 -30
- package/aws/runtime/secrets/dbsecret.js +0 -96
- package/aws/runtime/secrets/proxy-holder.js +0 -26
- package/aws/runtime/secrets/rds-holder.js +0 -26
- package/aws/runtime/secrets/secret-holder.js +0 -73
- package/aws/runtime/secrets/secret.js +0 -43
- package/aws/types/errors.js +0 -9
- package/aws/types/lambda-response.js +0 -28
- package/aws/types/mediatypes.js +0 -15
- package/aws/types/model-with-reference.js +0 -3
- package/aws/types/proxytypes.js +0 -3
- package/aws/types/tags.js +0 -7
- package/database/cached.js +0 -32
- package/database/database.js +0 -62
- package/database/last-updated.js +0 -54
- package/database/models.js +0 -3
- package/index.d.ts +0 -1
- package/index.js +0 -18
- package/marine/id_utils.js +0 -33
- package/marine/rtz.js +0 -3
- package/test/asserter.js +0 -45
- package/test/db-testutils.js +0 -31
- package/test/httpserver.js +0 -67
- package/test/secret.js +0 -25
- package/test/secrets-manager.js +0 -59
- package/test/testutils.js +0 -44
- package/types/input-error.js +0 -7
- package/types/language.js +0 -10
- package/types/traffictype.js +0 -13
- package/types/validator.js +0 -14
- package/utils/api-model.js +0 -129
- package/utils/base64.js +0 -21
- package/utils/date-utils.js +0 -34
- package/utils/geojson-types.js +0 -18
- package/utils/geometry.js +0 -140
- package/utils/retry.js +0 -50
- package/utils/slack.js +0 -25
- package/utils/utils.js +0 -64
@@ -0,0 +1,185 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.createIpRestrictionPolicyDocument = exports.createDefaultPolicyDocument = exports.createRestApi = exports.setReturnCodeForMissingAuthenticationToken = exports.add401Support = exports.add404Support = exports.DigitrafficRestApi = void 0;
|
4
|
+
const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
|
5
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
6
|
+
const usage_plans_1 = require("../usage-plans");
|
7
|
+
const api_model_1 = require("../../../utils/api-model");
|
8
|
+
const mediatypes_1 = require("../../types/mediatypes");
|
9
|
+
const R = require("ramda");
|
10
|
+
class DigitrafficRestApi extends aws_apigateway_1.RestApi {
|
11
|
+
constructor(stack, apiId, apiName, allowFromIpAddresses, config) {
|
12
|
+
const policyDocument = allowFromIpAddresses == null ? createDefaultPolicyDocument() : createIpRestrictionPolicyDocument(allowFromIpAddresses);
|
13
|
+
// override default config with given extra config
|
14
|
+
const apiConfig = { ...{
|
15
|
+
deployOptions: {
|
16
|
+
loggingLevel: aws_apigateway_1.MethodLoggingLevel.ERROR,
|
17
|
+
},
|
18
|
+
restApiName: apiName,
|
19
|
+
endpointTypes: [aws_apigateway_1.EndpointType.REGIONAL],
|
20
|
+
policy: policyDocument,
|
21
|
+
}, ...config };
|
22
|
+
super(stack, apiId, apiConfig);
|
23
|
+
this.apiKeyIds = [];
|
24
|
+
this.enableDocumentation = stack.configuration.stackFeatures?.enableDocumentation ?? true;
|
25
|
+
add404Support(this, stack);
|
26
|
+
}
|
27
|
+
hostname() {
|
28
|
+
return `${this.restApiId}.execute-api.${this.stack.region}.amazonaws.com`;
|
29
|
+
}
|
30
|
+
createUsagePlan(apiKeyId, apiKeyName) {
|
31
|
+
const newKeyId = (0, usage_plans_1.createUsagePlan)(this, apiKeyId, apiKeyName).keyId;
|
32
|
+
this.apiKeyIds.push(newKeyId);
|
33
|
+
return newKeyId;
|
34
|
+
}
|
35
|
+
createUsagePlanV2(apiName) {
|
36
|
+
const newKeyId = (0, usage_plans_1.createDefaultUsagePlan)(this, apiName).keyId;
|
37
|
+
this.apiKeyIds.push(newKeyId);
|
38
|
+
return newKeyId;
|
39
|
+
}
|
40
|
+
addJsonModel(modelName, schema) {
|
41
|
+
return this.getModelWithReference(this.addModel(modelName, {
|
42
|
+
contentType: mediatypes_1.MediaType.APPLICATION_JSON,
|
43
|
+
modelName,
|
44
|
+
schema,
|
45
|
+
}));
|
46
|
+
}
|
47
|
+
addCSVModel(modelName) {
|
48
|
+
return this.getModelWithReference(this.addModel(modelName, {
|
49
|
+
contentType: mediatypes_1.MediaType.TEXT_CSV,
|
50
|
+
modelName,
|
51
|
+
schema: {},
|
52
|
+
}));
|
53
|
+
}
|
54
|
+
getModelWithReference(model) {
|
55
|
+
return R.assoc('modelReference', (0, api_model_1.getModelReference)(model.modelId, this.restApiId), model);
|
56
|
+
}
|
57
|
+
addDocumentationPart(resource, parameterName, resourceName, type, properties) {
|
58
|
+
const location = {
|
59
|
+
type,
|
60
|
+
path: resource.path,
|
61
|
+
name: type !== 'METHOD' ? parameterName : undefined,
|
62
|
+
};
|
63
|
+
new aws_apigateway_1.CfnDocumentationPart(this.stack, resourceName, {
|
64
|
+
restApiId: resource.api.restApiId,
|
65
|
+
location,
|
66
|
+
properties: JSON.stringify(properties),
|
67
|
+
});
|
68
|
+
}
|
69
|
+
documentResource(resource, ...documentationPart) {
|
70
|
+
if (this.enableDocumentation) {
|
71
|
+
documentationPart.forEach(dp => this.addDocumentationPart(resource, dp.parameterName, `${resource.path}.${dp.parameterName}.Documentation`, dp.type, dp.documentationProperties));
|
72
|
+
}
|
73
|
+
else {
|
74
|
+
console.info("Skipping documentation for %s", resource.path);
|
75
|
+
}
|
76
|
+
}
|
77
|
+
}
|
78
|
+
exports.DigitrafficRestApi = DigitrafficRestApi;
|
79
|
+
/**
|
80
|
+
* Due to AWS API design API Gateway will always return 403 'Missing Authentication Token' for requests
|
81
|
+
* with a non-existent endpoint. This function translates this response to a 404.
|
82
|
+
* Requests with an invalid or missing API key are not affected (still return 403 'Forbidden').
|
83
|
+
* @param restApi RestApi
|
84
|
+
* @param stack Construct
|
85
|
+
*/
|
86
|
+
function add404Support(restApi, stack) {
|
87
|
+
new aws_apigateway_1.GatewayResponse(stack, `MissingAuthenticationTokenResponse-${restApi.restApiName}`, {
|
88
|
+
restApi,
|
89
|
+
type: aws_apigateway_1.ResponseType.MISSING_AUTHENTICATION_TOKEN,
|
90
|
+
statusCode: '404',
|
91
|
+
templates: {
|
92
|
+
'application/json': '{"message": "Not found"}',
|
93
|
+
},
|
94
|
+
});
|
95
|
+
}
|
96
|
+
exports.add404Support = add404Support;
|
97
|
+
function add401Support(restApi, stack) {
|
98
|
+
new aws_apigateway_1.GatewayResponse(stack, `AuthenticationFailedResponse-${restApi.restApiName}`, {
|
99
|
+
restApi,
|
100
|
+
type: aws_apigateway_1.ResponseType.UNAUTHORIZED,
|
101
|
+
statusCode: "401",
|
102
|
+
responseHeaders: {
|
103
|
+
'WWW-Authenticate': "'Basic'",
|
104
|
+
},
|
105
|
+
});
|
106
|
+
}
|
107
|
+
exports.add401Support = add401Support;
|
108
|
+
/**
|
109
|
+
* Due to AWS API design API Gateway will always return 403 'Missing Authentication Token' for requests
|
110
|
+
* with a non-existent endpoint. This function converts this response to a custom one.
|
111
|
+
* Requests with an invalid or missing API key are not affected (still return 403 'Forbidden').
|
112
|
+
* @param returnCode
|
113
|
+
* @param message
|
114
|
+
* @param restApi RestApi
|
115
|
+
* @param stack Construct
|
116
|
+
*/
|
117
|
+
function setReturnCodeForMissingAuthenticationToken(returnCode, message, restApi, stack) {
|
118
|
+
new aws_apigateway_1.GatewayResponse(stack, `MissingAuthenticationTokenResponse-${restApi.restApiName}`, {
|
119
|
+
restApi,
|
120
|
+
type: aws_apigateway_1.ResponseType.MISSING_AUTHENTICATION_TOKEN,
|
121
|
+
statusCode: `${returnCode}`,
|
122
|
+
templates: {
|
123
|
+
'application/json': `{"message": ${message}}`,
|
124
|
+
},
|
125
|
+
});
|
126
|
+
}
|
127
|
+
exports.setReturnCodeForMissingAuthenticationToken = setReturnCodeForMissingAuthenticationToken;
|
128
|
+
function createRestApi(stack, apiId, apiName, allowFromIpAddresses) {
|
129
|
+
const policyDocument = allowFromIpAddresses == null ? createDefaultPolicyDocument() : createIpRestrictionPolicyDocument(allowFromIpAddresses);
|
130
|
+
const restApi = new aws_apigateway_1.RestApi(stack, apiId, {
|
131
|
+
deployOptions: {
|
132
|
+
loggingLevel: aws_apigateway_1.MethodLoggingLevel.ERROR,
|
133
|
+
},
|
134
|
+
restApiName: apiName,
|
135
|
+
endpointTypes: [aws_apigateway_1.EndpointType.REGIONAL],
|
136
|
+
policy: policyDocument,
|
137
|
+
});
|
138
|
+
add404Support(restApi, stack);
|
139
|
+
return restApi;
|
140
|
+
}
|
141
|
+
exports.createRestApi = createRestApi;
|
142
|
+
function createDefaultPolicyDocument() {
|
143
|
+
return new aws_iam_1.PolicyDocument({
|
144
|
+
statements: [
|
145
|
+
new aws_iam_1.PolicyStatement({
|
146
|
+
effect: aws_iam_1.Effect.ALLOW,
|
147
|
+
actions: [
|
148
|
+
"execute-api:Invoke",
|
149
|
+
],
|
150
|
+
resources: [
|
151
|
+
"*",
|
152
|
+
],
|
153
|
+
principals: [
|
154
|
+
new aws_iam_1.AnyPrincipal(),
|
155
|
+
],
|
156
|
+
}),
|
157
|
+
],
|
158
|
+
});
|
159
|
+
}
|
160
|
+
exports.createDefaultPolicyDocument = createDefaultPolicyDocument;
|
161
|
+
function createIpRestrictionPolicyDocument(allowFromIpAddresses) {
|
162
|
+
return new aws_iam_1.PolicyDocument({
|
163
|
+
statements: [
|
164
|
+
new aws_iam_1.PolicyStatement({
|
165
|
+
effect: aws_iam_1.Effect.ALLOW,
|
166
|
+
conditions: {
|
167
|
+
"IpAddress": {
|
168
|
+
"aws:SourceIp": allowFromIpAddresses,
|
169
|
+
},
|
170
|
+
},
|
171
|
+
actions: [
|
172
|
+
"execute-api:Invoke",
|
173
|
+
],
|
174
|
+
resources: [
|
175
|
+
"*",
|
176
|
+
],
|
177
|
+
principals: [
|
178
|
+
new aws_iam_1.AnyPrincipal(),
|
179
|
+
],
|
180
|
+
}),
|
181
|
+
],
|
182
|
+
});
|
183
|
+
}
|
184
|
+
exports.createIpRestrictionPolicyDocument = createIpRestrictionPolicyDocument;
|
185
|
+
//# sourceMappingURL=rest_apis.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"rest_apis.js","sourceRoot":"","sources":["../../../../src/aws/infra/stack/rest_apis.ts"],"names":[],"mappings":"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"}
|
File without changes
|
@@ -0,0 +1,174 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.StackCheckingAspect = void 0;
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
5
|
+
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
6
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
7
|
+
const stack_1 = require("./stack");
|
8
|
+
const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
|
9
|
+
const change_case_1 = require("change-case");
|
10
|
+
const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
|
11
|
+
const aws_logs_1 = require("aws-cdk-lib/aws-logs");
|
12
|
+
const MAX_CONCURRENCY_LIMIT = 100;
|
13
|
+
const NODE_RUNTIME = aws_lambda_1.Runtime.NODEJS_14_X.name;
|
14
|
+
var ResourceType;
|
15
|
+
(function (ResourceType) {
|
16
|
+
ResourceType["stackName"] = "STACK_NAME";
|
17
|
+
ResourceType["reservedConcurrentConcurrency"] = "RESERVED_CONCURRENT_CONCURRENCY";
|
18
|
+
ResourceType["functionTimeout"] = "FUNCTION_TIMEOUT";
|
19
|
+
ResourceType["functionMemorySize"] = "FUNCTION_MEMORY_SIZE";
|
20
|
+
ResourceType["functionRuntime"] = "FUNCTION_RUNTIME";
|
21
|
+
ResourceType["functionName"] = "FUNCTION_NAME";
|
22
|
+
ResourceType["tagSolution"] = "TAG_SOLUTION";
|
23
|
+
ResourceType["bucketPublicity"] = "BUCKET_PUBLICITY";
|
24
|
+
ResourceType["resourcePath"] = "RESOURCE_PATH";
|
25
|
+
ResourceType["queueEncryption"] = "QUEUE_ENCRYPTION";
|
26
|
+
ResourceType["logGroupRetention"] = "LOG_GROUP_RETENTION";
|
27
|
+
})(ResourceType || (ResourceType = {}));
|
28
|
+
class StackCheckingAspect {
|
29
|
+
constructor(stackShortName, whitelistedResources) {
|
30
|
+
this.stackShortName = stackShortName;
|
31
|
+
this.whitelistedResources = whitelistedResources;
|
32
|
+
}
|
33
|
+
static create(stack) {
|
34
|
+
return new StackCheckingAspect(stack.configuration.shortName, stack.configuration.whitelistedResources);
|
35
|
+
}
|
36
|
+
visit(node) {
|
37
|
+
//console.info("visiting class " + node.constructor.name);
|
38
|
+
this.checkStack(node);
|
39
|
+
this.checkFunction(node);
|
40
|
+
this.checkTags(node);
|
41
|
+
this.checkBucket(node);
|
42
|
+
this.checkResourceCasing(node);
|
43
|
+
this.checkQueueEncryption(node);
|
44
|
+
this.checkLogGroupRetention(node);
|
45
|
+
}
|
46
|
+
isWhitelisted(key) {
|
47
|
+
return this.whitelistedResources?.some((wl) => {
|
48
|
+
return key.matchAll(new RegExp(wl, "g"));
|
49
|
+
});
|
50
|
+
}
|
51
|
+
addAnnotation(node, key, message, isError = true) {
|
52
|
+
const resourceKey = `${node.node.path}/${key}`;
|
53
|
+
const isWhiteListed = this.isWhitelisted(resourceKey);
|
54
|
+
const annotationMessage = `${resourceKey}:${message}`;
|
55
|
+
// error && whitelisted -> warning
|
56
|
+
// warning && whitelisted -> nothing
|
57
|
+
if (isError && !isWhiteListed) {
|
58
|
+
aws_cdk_lib_1.Annotations.of(node).addError(annotationMessage);
|
59
|
+
}
|
60
|
+
else if ((!isError && !isWhiteListed) || (isError && isWhiteListed)) {
|
61
|
+
aws_cdk_lib_1.Annotations.of(node).addWarning(annotationMessage);
|
62
|
+
}
|
63
|
+
}
|
64
|
+
checkStack(node) {
|
65
|
+
if (node instanceof stack_1.DigitrafficStack) {
|
66
|
+
if ((node.stackName.includes("Test") ||
|
67
|
+
node.stackName.includes("Tst")) &&
|
68
|
+
node.configuration.production) {
|
69
|
+
this.addAnnotation(node, ResourceType.stackName, "Production is set for Test-stack");
|
70
|
+
}
|
71
|
+
if ((node.stackName.includes("Prod") ||
|
72
|
+
node.stackName.includes("Prd")) &&
|
73
|
+
!node.configuration.production) {
|
74
|
+
this.addAnnotation(node, ResourceType.stackName, "Production is not set for Production-stack");
|
75
|
+
}
|
76
|
+
}
|
77
|
+
}
|
78
|
+
checkFunction(node) {
|
79
|
+
if (node instanceof aws_lambda_1.CfnFunction) {
|
80
|
+
if (!node.reservedConcurrentExecutions) {
|
81
|
+
this.addAnnotation(node, ResourceType.reservedConcurrentConcurrency, "Function must have reservedConcurrentConcurrency");
|
82
|
+
}
|
83
|
+
else if (node.reservedConcurrentExecutions > MAX_CONCURRENCY_LIMIT) {
|
84
|
+
this.addAnnotation(node, ResourceType.reservedConcurrentConcurrency, "Function reservedConcurrentConcurrency too high!");
|
85
|
+
}
|
86
|
+
if (!node.timeout) {
|
87
|
+
this.addAnnotation(node, ResourceType.functionTimeout, "Function must have timeout");
|
88
|
+
}
|
89
|
+
if (!node.memorySize) {
|
90
|
+
this.addAnnotation(node, ResourceType.functionMemorySize, "Function must have memorySize");
|
91
|
+
}
|
92
|
+
if (node.runtime !== NODE_RUNTIME) {
|
93
|
+
this.addAnnotation(node, ResourceType.functionRuntime, `Function has wrong runtime ${node.runtime}!`);
|
94
|
+
}
|
95
|
+
if (this.stackShortName &&
|
96
|
+
node.functionName &&
|
97
|
+
!node.functionName.startsWith(this.stackShortName)) {
|
98
|
+
this.addAnnotation(node, ResourceType.functionName, `Function name does not begin with ${this.stackShortName}`);
|
99
|
+
}
|
100
|
+
}
|
101
|
+
}
|
102
|
+
checkTags(node) {
|
103
|
+
if (node instanceof aws_cdk_lib_1.Stack) {
|
104
|
+
if (!node.tags.tagValues()[stack_1.SOLUTION_KEY]) {
|
105
|
+
this.addAnnotation(node, ResourceType.tagSolution, "Solution tag is missing");
|
106
|
+
}
|
107
|
+
}
|
108
|
+
}
|
109
|
+
checkBucket(node) {
|
110
|
+
if (node instanceof aws_s3_1.CfnBucket) {
|
111
|
+
const c = node.publicAccessBlockConfiguration;
|
112
|
+
if (c) {
|
113
|
+
if (!c.blockPublicAcls ||
|
114
|
+
!c.blockPublicPolicy ||
|
115
|
+
!c.ignorePublicAcls ||
|
116
|
+
!c.restrictPublicBuckets) {
|
117
|
+
this.addAnnotation(node, ResourceType.bucketPublicity, "Check bucket publicity");
|
118
|
+
}
|
119
|
+
}
|
120
|
+
}
|
121
|
+
}
|
122
|
+
static isValidPath(path) {
|
123
|
+
// if path includes . or { check only the trailing part of path
|
124
|
+
if (path.includes(".")) {
|
125
|
+
return this.isValidPath(path.split(".")[0]);
|
126
|
+
}
|
127
|
+
if (path.includes("{")) {
|
128
|
+
return this.isValidPath(path.split("{")[0]);
|
129
|
+
}
|
130
|
+
return (0, change_case_1.paramCase)(path) === path;
|
131
|
+
}
|
132
|
+
static isValidQueryString(name) {
|
133
|
+
return (0, change_case_1.snakeCase)(name) === name;
|
134
|
+
}
|
135
|
+
checkResourceCasing(node) {
|
136
|
+
if (node instanceof aws_apigateway_1.CfnResource) {
|
137
|
+
if (!StackCheckingAspect.isValidPath(node.pathPart)) {
|
138
|
+
this.addAnnotation(node, ResourceType.resourcePath, "Path part should be in kebab-case");
|
139
|
+
}
|
140
|
+
}
|
141
|
+
else if (node instanceof aws_apigateway_1.CfnMethod) {
|
142
|
+
const integration = node.integration;
|
143
|
+
if (integration && integration.requestParameters) {
|
144
|
+
Object.keys(integration.requestParameters).forEach((key) => {
|
145
|
+
const split = key.split(".");
|
146
|
+
const type = split[2];
|
147
|
+
const name = split[3];
|
148
|
+
if (type === "querystring" &&
|
149
|
+
!StackCheckingAspect.isValidQueryString(name)) {
|
150
|
+
this.addAnnotation(node, name, "Querystring should be in snake_case");
|
151
|
+
}
|
152
|
+
});
|
153
|
+
}
|
154
|
+
}
|
155
|
+
}
|
156
|
+
checkQueueEncryption(node) {
|
157
|
+
if (node instanceof aws_sqs_1.CfnQueue) {
|
158
|
+
if (!node.kmsMasterKeyId) {
|
159
|
+
this.addAnnotation(node, ResourceType.queueEncryption, "Queue must have encryption enabled");
|
160
|
+
}
|
161
|
+
}
|
162
|
+
}
|
163
|
+
checkLogGroupRetention(node) {
|
164
|
+
if (node instanceof aws_logs_1.LogRetention) {
|
165
|
+
const child = node.node.defaultChild;
|
166
|
+
const retention = child._cfnProperties.RetentionInDays;
|
167
|
+
if (!retention) {
|
168
|
+
this.addAnnotation(node, ResourceType.logGroupRetention, "Log group must define log group retention");
|
169
|
+
}
|
170
|
+
}
|
171
|
+
}
|
172
|
+
}
|
173
|
+
exports.StackCheckingAspect = StackCheckingAspect;
|
174
|
+
//# sourceMappingURL=stack-checking-aspect.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"stack-checking-aspect.js","sourceRoot":"","sources":["../../../../src/aws/infra/stack/stack-checking-aspect.ts"],"names":[],"mappings":"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"}
|
@@ -11,7 +11,7 @@ export declare const SOLUTION_KEY = "Solution";
|
|
11
11
|
export declare const SSM_KEY_WARNING_TOPIC: string;
|
12
12
|
export declare const SSM_KEY_ALARM_TOPIC: string;
|
13
13
|
export interface StackConfiguration {
|
14
|
-
readonly shortName
|
14
|
+
readonly shortName: string;
|
15
15
|
readonly secretId?: string;
|
16
16
|
readonly alarmTopicArn: string;
|
17
17
|
readonly warningTopicArn: string;
|
@@ -30,15 +30,16 @@ export interface StackConfiguration {
|
|
30
30
|
readonly whitelistedResources?: string[];
|
31
31
|
}
|
32
32
|
export declare class DigitrafficStack extends Stack {
|
33
|
-
readonly vpc
|
34
|
-
readonly lambdaDbSg
|
33
|
+
readonly vpc?: IVpc;
|
34
|
+
readonly lambdaDbSg?: ISecurityGroup;
|
35
35
|
readonly alarmTopic: ITopic;
|
36
36
|
readonly warningTopic: ITopic;
|
37
|
-
readonly secret
|
37
|
+
readonly secret?: ISecret;
|
38
38
|
readonly configuration: StackConfiguration;
|
39
39
|
constructor(scope: Construct, id: string, configuration: StackConfiguration);
|
40
40
|
addAspects(): void;
|
41
41
|
createLambdaEnvironment(): DBLambdaEnvironment;
|
42
42
|
createDefaultLambdaEnvironment(dbApplication: string): DBLambdaEnvironment;
|
43
|
+
getSecret(): ISecret;
|
43
44
|
grantSecret(...lambdas: AWSFunction[]): void;
|
44
45
|
}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.DigitrafficStack = exports.SSM_KEY_ALARM_TOPIC = exports.SSM_KEY_WARNING_TOPIC = exports.SOLUTION_KEY = void 0;
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
5
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
6
|
+
const aws_sns_1 = require("aws-cdk-lib/aws-sns");
|
7
|
+
const aws_ssm_1 = require("aws-cdk-lib/aws-ssm");
|
8
|
+
const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
|
9
|
+
const stack_checking_aspect_1 = require("./stack-checking-aspect");
|
10
|
+
const SSM_ROOT = "/digitraffic";
|
11
|
+
exports.SOLUTION_KEY = "Solution";
|
12
|
+
const MONITORING_ROOT = "/monitoring";
|
13
|
+
exports.SSM_KEY_WARNING_TOPIC = `${SSM_ROOT}${MONITORING_ROOT}/warning-topic`;
|
14
|
+
exports.SSM_KEY_ALARM_TOPIC = `${SSM_ROOT}${MONITORING_ROOT}/alarm-topic`;
|
15
|
+
class DigitrafficStack extends aws_cdk_lib_1.Stack {
|
16
|
+
constructor(scope, id, configuration) {
|
17
|
+
super(scope, id, configuration.stackProps);
|
18
|
+
this.configuration = configuration;
|
19
|
+
if (configuration.secretId) {
|
20
|
+
this.secret = aws_secretsmanager_1.Secret.fromSecretNameV2(this, "Secret", configuration.secretId);
|
21
|
+
}
|
22
|
+
// VPC reference construction requires vpcId and availability zones
|
23
|
+
// private subnets are used in Lambda configuration
|
24
|
+
if (configuration.vpcId) {
|
25
|
+
this.vpc = aws_ec2_1.Vpc.fromVpcAttributes(this, "vpc", {
|
26
|
+
vpcId: configuration.vpcId,
|
27
|
+
privateSubnetIds: configuration.privateSubnetIds,
|
28
|
+
availabilityZones: configuration.availabilityZones ?? [],
|
29
|
+
});
|
30
|
+
}
|
31
|
+
// security group that allows Lambda database access
|
32
|
+
if (configuration.lambdaDbSgId) {
|
33
|
+
this.lambdaDbSg = aws_ec2_1.SecurityGroup.fromSecurityGroupId(this, "LambdaDbSG", configuration.lambdaDbSgId);
|
34
|
+
}
|
35
|
+
this.alarmTopic = aws_sns_1.Topic.fromTopicArn(this, "AlarmTopic", aws_ssm_1.StringParameter.fromStringParameterName(this, "AlarmTopicParam", exports.SSM_KEY_ALARM_TOPIC).stringValue);
|
36
|
+
this.warningTopic = aws_sns_1.Topic.fromTopicArn(this, "WarningTopic", aws_ssm_1.StringParameter.fromStringParameterName(this, "WarningTopicParam", exports.SSM_KEY_WARNING_TOPIC).stringValue);
|
37
|
+
this.addAspects();
|
38
|
+
}
|
39
|
+
addAspects() {
|
40
|
+
aws_cdk_lib_1.Aspects.of(this).add(stack_checking_aspect_1.StackCheckingAspect.create(this));
|
41
|
+
}
|
42
|
+
createLambdaEnvironment() {
|
43
|
+
return this.createDefaultLambdaEnvironment(this.configuration.shortName);
|
44
|
+
}
|
45
|
+
createDefaultLambdaEnvironment(dbApplication) {
|
46
|
+
return this.configuration.secretId
|
47
|
+
? {
|
48
|
+
SECRET_ID: this.configuration.secretId,
|
49
|
+
DB_APPLICATION: dbApplication,
|
50
|
+
}
|
51
|
+
: {
|
52
|
+
DB_APPLICATION: dbApplication,
|
53
|
+
};
|
54
|
+
}
|
55
|
+
getSecret() {
|
56
|
+
if (this.secret === undefined) {
|
57
|
+
throw new Error("Secret is undefined");
|
58
|
+
}
|
59
|
+
return this.secret;
|
60
|
+
}
|
61
|
+
grantSecret(...lambdas) {
|
62
|
+
const secret = this.getSecret();
|
63
|
+
lambdas.forEach((l) => secret.grantRead(l));
|
64
|
+
}
|
65
|
+
}
|
66
|
+
exports.DigitrafficStack = DigitrafficStack;
|
67
|
+
//# sourceMappingURL=stack.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"stack.js","sourceRoot":"","sources":["../../../../src/aws/infra/stack/stack.ts"],"names":[],"mappings":"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"}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import { CfnSubscriptionFilter } from
|
2
|
-
import { Function } from
|
1
|
+
import { CfnSubscriptionFilter } from "aws-cdk-lib/aws-logs";
|
2
|
+
import { Function as AWSFunction } from "aws-cdk-lib/aws-lambda";
|
3
3
|
import { DigitrafficStack } from "./stack";
|
4
4
|
import { Construct } from "constructs";
|
5
5
|
import { MonitoredFunction } from "./monitoredfunction";
|
@@ -11,7 +11,7 @@ import { MonitoredFunction } from "./monitoredfunction";
|
|
11
11
|
* @param logDestinationArn Destination for streamed logs
|
12
12
|
* @param stack CloudFormation stack
|
13
13
|
*/
|
14
|
-
export declare function createSubscription(lambda:
|
14
|
+
export declare function createSubscription(lambda: AWSFunction, lambdaName: string, logDestinationArn: string | undefined, stack: Construct): CfnSubscriptionFilter | undefined;
|
15
15
|
export declare class DigitrafficLogSubscriptions {
|
16
16
|
constructor(stack: DigitrafficStack, ...lambdas: MonitoredFunction[]);
|
17
17
|
}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.DigitrafficLogSubscriptions = exports.createSubscription = void 0;
|
4
|
+
const aws_logs_1 = require("aws-cdk-lib/aws-logs");
|
5
|
+
/**
|
6
|
+
* Creates a subscription filter that subscribes to a Lambda Log Group and delivers the logs to another destination.
|
7
|
+
* https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-subscriptionfilter.html
|
8
|
+
* @param lambda The Lambda function, needed to create a dependency
|
9
|
+
* @param lambdaName The Lambda name from which the Log Group name is derived
|
10
|
+
* @param logDestinationArn Destination for streamed logs
|
11
|
+
* @param stack CloudFormation stack
|
12
|
+
*/
|
13
|
+
function createSubscription(lambda, lambdaName, logDestinationArn, stack) {
|
14
|
+
if (logDestinationArn == undefined) {
|
15
|
+
return undefined;
|
16
|
+
}
|
17
|
+
const filter = new aws_logs_1.CfnSubscriptionFilter(stack, `${lambdaName}LogsSubscription`, {
|
18
|
+
logGroupName: `/aws/lambda/${lambdaName}`,
|
19
|
+
filterPattern: "",
|
20
|
+
destinationArn: logDestinationArn,
|
21
|
+
});
|
22
|
+
filter.node.addDependency(lambda);
|
23
|
+
return filter;
|
24
|
+
}
|
25
|
+
exports.createSubscription = createSubscription;
|
26
|
+
class DigitrafficLogSubscriptions {
|
27
|
+
constructor(stack, ...lambdas) {
|
28
|
+
const destinationArn = stack.configuration.logsDestinationArn;
|
29
|
+
if (destinationArn !== undefined) {
|
30
|
+
lambdas.forEach((lambda) => {
|
31
|
+
const filter = new aws_logs_1.CfnSubscriptionFilter(stack, `${lambda.givenName}LogsSubscription`, {
|
32
|
+
logGroupName: `/aws/lambda/${lambda.givenName}`,
|
33
|
+
filterPattern: "",
|
34
|
+
destinationArn,
|
35
|
+
});
|
36
|
+
filter.node.addDependency(lambda);
|
37
|
+
});
|
38
|
+
}
|
39
|
+
}
|
40
|
+
}
|
41
|
+
exports.DigitrafficLogSubscriptions = DigitrafficLogSubscriptions;
|
42
|
+
//# sourceMappingURL=subscription.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../../../src/aws/infra/stack/subscription.ts"],"names":[],"mappings":";;;AAAA,mDAA6D;AAM7D;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAC9B,MAAmB,EACnB,UAAkB,EAClB,iBAAqC,EACrC,KAAgB;IAEhB,IAAI,iBAAiB,IAAI,SAAS,EAAE;QAChC,OAAO,SAAS,CAAC;KACpB;IACD,MAAM,MAAM,GAAG,IAAI,gCAAqB,CACpC,KAAK,EACL,GAAG,UAAU,kBAAkB,EAC/B;QACI,YAAY,EAAE,eAAe,UAAU,EAAE;QACzC,aAAa,EAAE,EAAE;QACjB,cAAc,EAAE,iBAAiB;KACpC,CACJ,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC;AAClB,CAAC;AAtBD,gDAsBC;AAED,MAAa,2BAA2B;IACpC,YAAY,KAAuB,EAAE,GAAG,OAA4B;QAChE,MAAM,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,kBAAkB,CAAC;QAC9D,IAAI,cAAc,KAAK,SAAS,EAAE;YAC9B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBACvB,MAAM,MAAM,GAAG,IAAI,gCAAqB,CACpC,KAAK,EACL,GAAG,MAAM,CAAC,SAAS,kBAAkB,EACrC;oBACI,YAAY,EAAE,eAAe,MAAM,CAAC,SAAS,EAAE;oBAC/C,aAAa,EAAE,EAAE;oBACjB,cAAc;iBACjB,CACJ,CAAC;gBAEF,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;SACN;IACL,CAAC;CACJ;AAnBD,kEAmBC"}
|
File without changes
|
@@ -0,0 +1,42 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.createDefaultUsagePlan = exports.createUsagePlan = void 0;
|
4
|
+
/**
|
5
|
+
* Creates an usage plan for a REST API with a single API key
|
6
|
+
* @param api The REST API
|
7
|
+
* @param apiKeyId Id for the API key, this is a surrogate id for CDK, not displayed anywhere
|
8
|
+
* @param apiKeyName Name for the API key, this is displayed in the AWS Console
|
9
|
+
* @deprecated Creates randomized API key names, use createDefaultUsagePlan instead
|
10
|
+
*/
|
11
|
+
function createUsagePlan(api, apiKeyId, apiKeyName) {
|
12
|
+
const apiKey = api.addApiKey(apiKeyId);
|
13
|
+
const plan = api.addUsagePlan(apiKeyName, {
|
14
|
+
name: apiKeyName,
|
15
|
+
});
|
16
|
+
plan.addApiStage({
|
17
|
+
stage: api.deploymentStage,
|
18
|
+
});
|
19
|
+
plan.addApiKey(apiKey);
|
20
|
+
return apiKey;
|
21
|
+
}
|
22
|
+
exports.createUsagePlan = createUsagePlan;
|
23
|
+
/**
|
24
|
+
* Creates a default usage plan for a REST API with a single API key
|
25
|
+
* @param api The REST API
|
26
|
+
* @param apiName Name of the api. Will generate key: apiName + ' API Key' and plan: apiName + ' API Usage Plan'
|
27
|
+
*/
|
28
|
+
function createDefaultUsagePlan(api, apiName) {
|
29
|
+
const apiKeyName = apiName + ' API Key';
|
30
|
+
const usagePlanName = apiName + ' API Usage Plan';
|
31
|
+
const apiKey = api.addApiKey(apiKeyName, { apiKeyName: apiKeyName });
|
32
|
+
const plan = api.addUsagePlan(usagePlanName, {
|
33
|
+
name: usagePlanName,
|
34
|
+
});
|
35
|
+
plan.addApiStage({
|
36
|
+
stage: api.deploymentStage,
|
37
|
+
});
|
38
|
+
plan.addApiKey(apiKey);
|
39
|
+
return apiKey;
|
40
|
+
}
|
41
|
+
exports.createDefaultUsagePlan = createDefaultUsagePlan;
|
42
|
+
//# sourceMappingURL=usage-plans.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"usage-plans.js","sourceRoot":"","sources":["../../../src/aws/infra/usage-plans.ts"],"names":[],"mappings":";;;AAEA;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,GAAY,EAAE,QAAgB,EAAE,UAAkB;IAC9E,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE;QACtC,IAAI,EAAE,UAAU;KACnB,CAAC,CAAC;IACH,IAAI,CAAC,WAAW,CAAC;QACb,KAAK,EAAE,GAAG,CAAC,eAAe;KAC7B,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEvB,OAAO,MAAM,CAAC;AAClB,CAAC;AAXD,0CAWC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,GAAY,EAAE,OAAe;IAChE,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;IACxC,MAAM,aAAa,GAAG,OAAO,GAAG,iBAAiB,CAAC;IAClD,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,aAAa,EAAE;QACzC,IAAI,EAAE,aAAa;KACtB,CAAC,CAAC;IACH,IAAI,CAAC,WAAW,CAAC;QACb,KAAK,EAAE,GAAG,CAAC,eAAe;KAC7B,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEvB,OAAO,MAAM,CAAC;AAClB,CAAC;AAbD,wDAaC"}
|
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getApiKeyFromAPIGateway = void 0;
|
4
|
+
const aws_sdk_1 = require("aws-sdk");
|
5
|
+
function getApiKeyFromAPIGateway(keyId) {
|
6
|
+
const agw = new aws_sdk_1.APIGateway();
|
7
|
+
return agw.getApiKey({
|
8
|
+
apiKey: keyId,
|
9
|
+
includeValue: true,
|
10
|
+
}).promise();
|
11
|
+
}
|
12
|
+
exports.getApiKeyFromAPIGateway = getApiKeyFromAPIGateway;
|
13
|
+
//# sourceMappingURL=apikey.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"apikey.js","sourceRoot":"","sources":["../../../src/aws/runtime/apikey.ts"],"names":[],"mappings":";;;AAAA,qCAAmC;AAEnC,SAAgB,uBAAuB,CAAC,KAAa;IACjD,MAAM,GAAG,GAAG,IAAI,oBAAU,EAAE,CAAC;IAC7B,OAAO,GAAG,CAAC,SAAS,CAAC;QACjB,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC,OAAO,EAAE,CAAC;AACjB,CAAC;AAND,0DAMC"}
|
File without changes
|
@@ -0,0 +1,26 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.DigitrafficIntegrationResponse = void 0;
|
4
|
+
const mediatypes_1 = require("../types/mediatypes");
|
5
|
+
const response_1 = require("../infra/api/response");
|
6
|
+
class DigitrafficIntegrationResponse {
|
7
|
+
static ok(mediaType) {
|
8
|
+
return this.create("200", mediaType);
|
9
|
+
}
|
10
|
+
static badRequest(mediaType) {
|
11
|
+
return this.create("400", mediaType ?? mediatypes_1.MediaType.TEXT_PLAIN);
|
12
|
+
}
|
13
|
+
static notImplemented(mediaType) {
|
14
|
+
return this.create("501", mediaType ?? mediatypes_1.MediaType.TEXT_PLAIN);
|
15
|
+
}
|
16
|
+
static create(statusCode, mediaType) {
|
17
|
+
return {
|
18
|
+
statusCode,
|
19
|
+
responseTemplates: {
|
20
|
+
[mediaType]: response_1.RESPONSE_DEFAULT_LAMBDA,
|
21
|
+
},
|
22
|
+
};
|
23
|
+
}
|
24
|
+
}
|
25
|
+
exports.DigitrafficIntegrationResponse = DigitrafficIntegrationResponse;
|
26
|
+
//# sourceMappingURL=digitraffic-integration-response.js.map
|