@sylvesterllc/aws-constructs 1.1.37 → 1.1.39

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 (186) hide show
  1. package/.github/workflows/publish.yml +56 -56
  2. package/__tests__/app-config.test.ts +32 -32
  3. package/__tests__/data/testConfig.ts +146 -146
  4. package/__tests__/mocks/ResourceMock.ts +9 -9
  5. package/__tests__/router.test.ts +194 -194
  6. package/dist/config/AppConfig.js +1 -1
  7. package/dist/config/Constants.js +1 -1
  8. package/dist/config/Environments.js +1 -1
  9. package/dist/config/MicroserviceAppConfig.js +1 -1
  10. package/dist/config/ServiceBundleConfig.js +1 -1
  11. package/dist/config/bishopConfig.js +1 -1
  12. package/dist/config/customConfigs/ApiAppConfig.js +1 -1
  13. package/dist/config/customConfigs/GlobalAppConfig.js +1 -1
  14. package/dist/config/customConfigs/IAppConfig.js +1 -1
  15. package/dist/config/customConfigs/ResourceAppConfig.js +1 -1
  16. package/dist/config/microServiceConfig.js +1 -1
  17. package/dist/config/types/LogDuration.js +1 -1
  18. package/dist/config/types/TsgAuthorizerProp.js +1 -1
  19. package/dist/config/types/TsgAuthorizerType.js +1 -1
  20. package/dist/config/types/TsgCdkConfigType.js +1 -1
  21. package/dist/config/types/TsgCognitoConfig.js +1 -1
  22. package/dist/config/types/TsgDnsConfig.js +1 -1
  23. package/dist/config/types/TsgDynamoDbProp.js +1 -1
  24. package/dist/config/types/TsgDynamoIndex.js +1 -1
  25. package/dist/config/types/TsgDynamoProp.js +1 -1
  26. package/dist/config/types/TsgDynamoTable.js +1 -1
  27. package/dist/config/types/TsgDynamoTableRef.js +1 -1
  28. package/dist/config/types/TsgEc2Prop.js +1 -1
  29. package/dist/config/types/TsgKeyPair.js +1 -1
  30. package/dist/config/types/TsgLambda.js +1 -1
  31. package/dist/config/types/TsgLambdaLayerProp.js +1 -1
  32. package/dist/config/types/TsgLambdaMap.js +1 -1
  33. package/dist/config/types/TsgLambdaName.js +1 -1
  34. package/dist/config/types/TsgLambdaNode.js +1 -1
  35. package/dist/config/types/TsgLambdaProp.js +1 -1
  36. package/dist/config/types/TsgLambdaProps.js +1 -1
  37. package/dist/config/types/TsgLambdaRoutable.js +1 -1
  38. package/dist/config/types/index.js +1 -1
  39. package/dist/constants/aws-service-principal-constants.js +1 -1
  40. package/dist/constructs/BasicLambda.js +1 -1
  41. package/dist/constructs/DynamoDbSingleTable.js +4 -2
  42. package/dist/constructs/MicroService.js +1 -1
  43. package/dist/constructs/basic-queue.d.ts +9 -0
  44. package/dist/constructs/basic-queue.js +16 -0
  45. package/dist/constructs/index.d.ts +1 -0
  46. package/dist/constructs/index.js +16 -1
  47. package/dist/constructs/timer-job.js +1 -1
  48. package/dist/helpers/logger.js +1 -1
  49. package/dist/helpers/util-helper.js +1 -1
  50. package/dist/index.js +1 -1
  51. package/dist/interfaces/ApiLambdaResult.js +1 -1
  52. package/dist/interfaces/BaseResourceProps.js +1 -1
  53. package/dist/interfaces/CreateLambdaFunctionInput.js +1 -1
  54. package/dist/interfaces/MicroserviceProps.js +1 -1
  55. package/dist/interfaces/lambda/index.js +1 -1
  56. package/dist/interfaces/lambda/lambda-props.js +1 -1
  57. package/dist/interfaces/timer-job/timer-job-props.js +1 -1
  58. package/dist/resources/base/baseResource.js +1 -1
  59. package/dist/resources/base/tsgBaseResource.js +1 -1
  60. package/dist/resources/certificate/createCertificate.js +1 -1
  61. package/dist/resources/cognito/createCognito.js +1 -1
  62. package/dist/resources/cognito/createCognitoProps.js +1 -1
  63. package/dist/resources/customResource/createSeedDatabaseCustomResource.js +1 -1
  64. package/dist/resources/dynamodb/CreateDynamo.js +1 -1
  65. package/dist/resources/dynamodb/CreateDynamoSingleTableDesign.d.ts +2 -1
  66. package/dist/resources/dynamodb/CreateDynamoSingleTableDesign.js +29 -28
  67. package/dist/resources/ec2/create-ec2-instance.js +3 -3
  68. package/dist/resources/ecr/CreateEcr.js +2 -2
  69. package/dist/resources/gateway/CreateApiAndAttachLambdas.js +1 -1
  70. package/dist/resources/gateway/createApi.js +1 -1
  71. package/dist/resources/gateway/createApiKey.js +1 -1
  72. package/dist/resources/helpers/createCommonLayer.js +1 -1
  73. package/dist/resources/helpers/createRoutes.js +1 -1
  74. package/dist/resources/index.js +1 -1
  75. package/dist/resources/lambda/create-basic-lambda-helper.js +11 -24
  76. package/dist/resources/lambda/create-basic-lambda.js +8 -21
  77. package/dist/resources/lambda/createLambda.js +1 -1
  78. package/dist/resources/lambda/lambdaHelper.js +1 -1
  79. package/dist/resources/lambda-authorizer/TsgJwtTokenAuthorizer.js +1 -1
  80. package/dist/resources/lambda-authorizer/TsgRequestAuthorizer.js +1 -1
  81. package/dist/resources/lambda-authorizer/createAuthorizerHelpers.js +1 -1
  82. package/dist/resources/lambda-layer/createLambdaLayer.js +1 -1
  83. package/dist/resources/layers/common/src/nodejs/api-response/responses.js +1 -1
  84. package/dist/resources/layers/common/src/nodejs/index.js +1 -1
  85. package/dist/resources/layers/common/src/nodejs/logger/IContext.js +1 -1
  86. package/dist/resources/layers/common/src/nodejs/logger/index.js +1 -1
  87. package/dist/resources/layers/common/src/nodejs/logger/logger.js +1 -1
  88. package/dist/resources/resources/iam/policyDocuments/cognitoPolicy.js +1 -1
  89. package/dist/resources/resources/iam/roles/createRole.js +1 -1
  90. package/dist/resources/route53/CreateZone.js +1 -1
  91. package/dist/resources/route53/create-zones.js +1 -1
  92. package/dist/resources/securityManager/index.js +1 -1
  93. package/dist/resources/sqs/create-sqs-resource.d.ts +3 -0
  94. package/dist/resources/sqs/create-sqs-resource.js +21 -0
  95. package/jest.config.js +8 -8
  96. package/jest.config.ts.old +20 -20
  97. package/package.json +57 -55
  98. package/readme.md +147 -147
  99. package/src/config/AppConfig.ts +106 -106
  100. package/src/config/Constants.ts +26 -26
  101. package/src/config/Environments.ts +1 -1
  102. package/src/config/MicroserviceAppConfig.ts +8 -8
  103. package/src/config/ServiceBundleConfig.ts +17 -17
  104. package/src/config/bishopConfig.ts +82 -82
  105. package/src/config/customConfigs/ApiAppConfig.ts +5 -5
  106. package/src/config/customConfigs/GlobalAppConfig.ts +10 -10
  107. package/src/config/customConfigs/IAppConfig.ts +12 -12
  108. package/src/config/customConfigs/ResourceAppConfig.ts +15 -15
  109. package/src/config/microServiceConfig.ts +83 -83
  110. package/src/config/types/LogDuration.ts +7 -7
  111. package/src/config/types/TsgAuthorizerProp.ts +8 -8
  112. package/src/config/types/TsgAuthorizerType.ts +4 -4
  113. package/src/config/types/TsgCdkConfigType.ts +2 -2
  114. package/src/config/types/TsgCognitoConfig.ts +5 -5
  115. package/src/config/types/TsgDnsConfig.ts +10 -10
  116. package/src/config/types/TsgDynamoDbProp.ts +9 -9
  117. package/src/config/types/TsgDynamoIndex.ts +15 -15
  118. package/src/config/types/TsgDynamoProp.ts +16 -16
  119. package/src/config/types/TsgDynamoTable.ts +4 -4
  120. package/src/config/types/TsgDynamoTableRef.ts +3 -3
  121. package/src/config/types/TsgEc2Prop.ts +8 -8
  122. package/src/config/types/TsgKeyPair.ts +5 -5
  123. package/src/config/types/TsgLambda.ts +5 -5
  124. package/src/config/types/TsgLambdaLayerProp.ts +4 -4
  125. package/src/config/types/TsgLambdaMap.ts +3 -3
  126. package/src/config/types/TsgLambdaName.ts +3 -3
  127. package/src/config/types/TsgLambdaNode.ts +3 -3
  128. package/src/config/types/TsgLambdaProp.ts +19 -19
  129. package/src/config/types/TsgLambdaProps.ts +17 -17
  130. package/src/config/types/TsgLambdaRoutable.ts +8 -8
  131. package/src/config/types/index.ts +11 -11
  132. package/src/constants/aws-service-principal-constants.ts +2 -2
  133. package/src/constructs/BasicLambda.ts +19 -19
  134. package/src/constructs/DynamoDbSingleTable.ts +13 -12
  135. package/src/constructs/MicroService.ts +131 -131
  136. package/src/constructs/basic-queue.ts +19 -0
  137. package/src/constructs/index.ts +6 -5
  138. package/src/constructs/timer-job.ts +19 -19
  139. package/src/helpers/logger.ts +12 -12
  140. package/src/helpers/util-helper.ts +19 -19
  141. package/src/index.ts +8 -8
  142. package/src/interfaces/ApiLambdaResult.ts +6 -6
  143. package/src/interfaces/BaseResourceProps.ts +6 -6
  144. package/src/interfaces/CreateLambdaFunctionInput.ts +10 -10
  145. package/src/interfaces/MicroserviceProps.ts +10 -10
  146. package/src/interfaces/lambda/index.ts +1 -1
  147. package/src/interfaces/lambda/lambda-props.ts +15 -15
  148. package/src/interfaces/timer-job/timer-job-props.ts +6 -6
  149. package/src/resources/base/baseResource.ts +14 -14
  150. package/src/resources/base/tsgBaseResource.ts +21 -21
  151. package/src/resources/certificate/createCertificate.ts +57 -57
  152. package/src/resources/cognito/createCognito.ts +47 -47
  153. package/src/resources/cognito/createCognitoProps.ts +46 -46
  154. package/src/resources/customResource/createSeedDatabaseCustomResource.ts +36 -36
  155. package/src/resources/dynamodb/CreateDynamo.ts +110 -110
  156. package/src/resources/dynamodb/CreateDynamoSingleTableDesign.ts +112 -118
  157. package/src/resources/ec2/create-ec2-instance.ts +52 -52
  158. package/src/resources/ecr/CreateEcr.ts +57 -57
  159. package/src/resources/gateway/CreateApiAndAttachLambdas.ts +161 -161
  160. package/src/resources/gateway/createApi.ts +173 -173
  161. package/src/resources/gateway/createApiKey.ts +88 -88
  162. package/src/resources/helpers/createCommonLayer.ts +18 -18
  163. package/src/resources/helpers/createRoutes.ts +74 -74
  164. package/src/resources/index.ts +1 -1
  165. package/src/resources/lambda/create-basic-lambda-helper.ts +124 -146
  166. package/src/resources/lambda/create-basic-lambda.ts +159 -173
  167. package/src/resources/lambda/createLambda.ts +203 -203
  168. package/src/resources/lambda/lambdaHelper.ts +133 -133
  169. package/src/resources/lambda-authorizer/TsgJwtTokenAuthorizer.ts +107 -107
  170. package/src/resources/lambda-authorizer/TsgRequestAuthorizer.ts +44 -44
  171. package/src/resources/lambda-authorizer/createAuthorizerHelpers.ts +76 -76
  172. package/src/resources/lambda-layer/createLambdaLayer.ts +39 -39
  173. package/src/resources/layers/common/package.json +22 -22
  174. package/src/resources/layers/common/src/nodejs/api-response/responses.ts +41 -41
  175. package/src/resources/layers/common/src/nodejs/index.ts +3 -3
  176. package/src/resources/layers/common/src/nodejs/logger/IContext.ts +6 -6
  177. package/src/resources/layers/common/src/nodejs/logger/index.ts +1 -1
  178. package/src/resources/layers/common/src/nodejs/logger/logger.ts +10 -10
  179. package/src/resources/layers/common/tsconfig.json +7 -7
  180. package/src/resources/resources/iam/policyDocuments/cognitoPolicy.ts +54 -54
  181. package/src/resources/resources/iam/roles/createRole.ts +29 -29
  182. package/src/resources/route53/CreateZone.ts +61 -61
  183. package/src/resources/route53/create-zones.ts +40 -40
  184. package/src/resources/securityManager/index.ts +23 -23
  185. package/src/resources/sqs/create-sqs-resource.ts +22 -0
  186. package/tsconfig.json +44 -44
@@ -1,89 +1,89 @@
1
- import { Construct } from "constructs";
2
- import { BaseResource } from "../base/baseResource";
3
- import { ApiKeyProps, IApiKey, ApiKey as AWS_API_KEY, IRestApi, RestApi } from "aws-cdk-lib/aws-apigateway";
4
- import { AppConfig } from "../../config/AppConfig";
5
- import { CfnOutput, RemovalPolicy } from "aws-cdk-lib";
6
- import { UsagePlanProps } from "aws-cdk-lib/aws-apigateway";
7
-
8
- export class TsgApiKey extends BaseResource<AWS_API_KEY> {
9
-
10
-
11
- private api: RestApi;
12
- private apiKey: IApiKey;
13
-
14
- constructor(scope: Construct, config: AppConfig, api: RestApi) {
15
- super(scope, config);
16
-
17
- this.api = api;
18
-
19
- this.createdResources = this.createResource(scope);
20
-
21
- this.applyRemovalPolicy();
22
-
23
- this.createOutput(scope, this.createdResources);
24
- }
25
-
26
- get APIKey() {
27
- return this.apiKey;
28
- }
29
-
30
- public createResource(scope: Construct): AWS_API_KEY[] {
31
-
32
- const keyProps: ApiKeyProps = {
33
- apiKeyName: `${this.config.AppPrefix}-x-api-key`,
34
- resources: [this.api],
35
- value: `ddGTsLQrae2U6zTEjw4M07qO4pHGt60u73zImLHE`,
36
- enabled: true,
37
- description: `API App Key for ${this.config.AppName}`,
38
-
39
- };
40
-
41
- const apiKey = new AWS_API_KEY(scope, `${this.config.AppPrefix}-api-key`, keyProps);
42
-
43
- this.createUsagePlan(scope, this.config, this.api, apiKey);
44
-
45
- return [apiKey];
46
- }
47
-
48
- protected createOutput<T>(scope: Construct, createdAssets: T[]): void {
49
- this.createdResources.forEach((key, idx) => {
50
-
51
- new CfnOutput(scope, `api-key-${idx}`, {
52
- value: `${key.keyId}\t${key.keyArn}`
53
- });
54
- });
55
- }
56
-
57
- private applyRemovalPolicy() {
58
-
59
- const apiKey = this.createdResources[0];
60
-
61
- if (apiKey) {
62
- apiKey.applyRemovalPolicy(RemovalPolicy.DESTROY);
63
- }
64
- }
65
-
66
- private createUsagePlan(scope: Construct, config: AppConfig, api: RestApi, apiKey: AWS_API_KEY) {
67
-
68
- const planProps: UsagePlanProps = {
69
- name: `${config.AppName}-easy-plan`,
70
- throttle: {
71
- rateLimit: 1000,
72
- burstLimit: 10,
73
- },
74
- apiStages: [
75
- {
76
- api: api,
77
- stage: api.deploymentStage,
78
- },
79
- ],
80
- };
81
-
82
- const plan = api.addUsagePlan(
83
- `${config.AppPrefix}-${config.AppName}-usage-plan`,
84
- planProps
85
- );
86
-
87
- plan.addApiKey(apiKey);
88
- }
1
+ import { Construct } from "constructs";
2
+ import { BaseResource } from "../base/baseResource";
3
+ import { ApiKeyProps, IApiKey, ApiKey as AWS_API_KEY, IRestApi, RestApi } from "aws-cdk-lib/aws-apigateway";
4
+ import { AppConfig } from "../../config/AppConfig";
5
+ import { CfnOutput, RemovalPolicy } from "aws-cdk-lib";
6
+ import { UsagePlanProps } from "aws-cdk-lib/aws-apigateway";
7
+
8
+ export class TsgApiKey extends BaseResource<AWS_API_KEY> {
9
+
10
+
11
+ private api: RestApi;
12
+ private apiKey: IApiKey;
13
+
14
+ constructor(scope: Construct, config: AppConfig, api: RestApi) {
15
+ super(scope, config);
16
+
17
+ this.api = api;
18
+
19
+ this.createdResources = this.createResource(scope);
20
+
21
+ this.applyRemovalPolicy();
22
+
23
+ this.createOutput(scope, this.createdResources);
24
+ }
25
+
26
+ get APIKey() {
27
+ return this.apiKey;
28
+ }
29
+
30
+ public createResource(scope: Construct): AWS_API_KEY[] {
31
+
32
+ const keyProps: ApiKeyProps = {
33
+ apiKeyName: `${this.config.AppPrefix}-x-api-key`,
34
+ resources: [this.api],
35
+ value: `ddGTsLQrae2U6zTEjw4M07qO4pHGt60u73zImLHE`,
36
+ enabled: true,
37
+ description: `API App Key for ${this.config.AppName}`,
38
+
39
+ };
40
+
41
+ const apiKey = new AWS_API_KEY(scope, `${this.config.AppPrefix}-api-key`, keyProps);
42
+
43
+ this.createUsagePlan(scope, this.config, this.api, apiKey);
44
+
45
+ return [apiKey];
46
+ }
47
+
48
+ protected createOutput<T>(scope: Construct, createdAssets: T[]): void {
49
+ this.createdResources.forEach((key, idx) => {
50
+
51
+ new CfnOutput(scope, `api-key-${idx}`, {
52
+ value: `${key.keyId}\t${key.keyArn}`
53
+ });
54
+ });
55
+ }
56
+
57
+ private applyRemovalPolicy() {
58
+
59
+ const apiKey = this.createdResources[0];
60
+
61
+ if (apiKey) {
62
+ apiKey.applyRemovalPolicy(RemovalPolicy.DESTROY);
63
+ }
64
+ }
65
+
66
+ private createUsagePlan(scope: Construct, config: AppConfig, api: RestApi, apiKey: AWS_API_KEY) {
67
+
68
+ const planProps: UsagePlanProps = {
69
+ name: `${config.AppName}-easy-plan`,
70
+ throttle: {
71
+ rateLimit: 1000,
72
+ burstLimit: 10,
73
+ },
74
+ apiStages: [
75
+ {
76
+ api: api,
77
+ stage: api.deploymentStage,
78
+ },
79
+ ],
80
+ };
81
+
82
+ const plan = api.addUsagePlan(
83
+ `${config.AppPrefix}-${config.AppName}-usage-plan`,
84
+ planProps
85
+ );
86
+
87
+ plan.addApiKey(apiKey);
88
+ }
89
89
  }
@@ -1,18 +1,18 @@
1
- import { Construct } from "constructs";
2
- import { createLambdaLayer } from "../lambda-layer/createLambdaLayer";
3
- import { TsgLambdaLayerProp } from "../../config/types/TsgLambdaLayerProp";
4
- import { AppConfig } from "../../config/AppConfig";
5
-
6
- export const createCommonLayer = (scope: Construct, appProps: AppConfig) => {
7
-
8
- const prop: TsgLambdaLayerProp = {
9
- description: appProps.RESOURCES.LAMBDA_LAYERS![0].description,
10
- codePath: appProps.RESOURCES.LAMBDA_LAYERS![0].codePath,
11
- name: appProps.RESOURCES.LAMBDA_LAYERS![0].name,
12
- };
13
-
14
- const layer = createLambdaLayer(scope, appProps, prop)
15
-
16
- return [layer];
17
- };
18
-
1
+ import { Construct } from "constructs";
2
+ import { createLambdaLayer } from "../lambda-layer/createLambdaLayer";
3
+ import { TsgLambdaLayerProp } from "../../config/types/TsgLambdaLayerProp";
4
+ import { AppConfig } from "../../config/AppConfig";
5
+
6
+ export const createCommonLayer = (scope: Construct, appProps: AppConfig) => {
7
+
8
+ const prop: TsgLambdaLayerProp = {
9
+ description: appProps.RESOURCES.LAMBDA_LAYERS![0].description,
10
+ codePath: appProps.RESOURCES.LAMBDA_LAYERS![0].codePath,
11
+ name: appProps.RESOURCES.LAMBDA_LAYERS![0].name,
12
+ };
13
+
14
+ const layer = createLambdaLayer(scope, appProps, prop)
15
+
16
+ return [layer];
17
+ };
18
+
@@ -1,75 +1,75 @@
1
- import { AuthorizationType, IRestApi, LambdaIntegration, RequestAuthorizer, Resource, TokenAuthorizer } from "aws-cdk-lib/aws-apigateway";
2
- import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs";
3
- import { TsgLambdaProp } from "../../config/types";
4
- import { Logger } from "../../helpers/logger";
5
- import { logger } from "../layers/common/src/nodejs";
6
-
7
-
8
- export class Routes {
9
-
10
- public static Resources: Resource[] = [];
11
- private static routeMap = new Map();
12
-
13
- public static createResource(
14
- prop: TsgLambdaProp,
15
- api: IRestApi,
16
- lambdaNode: NodejsFunction,
17
- authorizer?: TokenAuthorizer | RequestAuthorizer,
18
- ): void {
19
-
20
- const routeMap: Map<string, Resource> = new Map();
21
-
22
- let activeRoutePath = "";
23
- let activeResource: Resource | undefined = undefined;
24
-
25
- // Only attach lambda to an Api Gateway if a route exist
26
- if (prop.apiGateway?.route) {
27
-
28
- if (!prop.apiGateway.useRouteOverride) {
29
- // First we create the root resource if it doesn't exist.
30
- // Note: this now uses the bundle version as the first segment in the path.
31
- activeRoutePath = `v${(prop.apiGateway?.version) ? prop.apiGateway.version : 1}`;
32
- activeResource = Routes.routeMap.get(activeRoutePath) || api.root.addResource(activeRoutePath);
33
- Routes.routeMap.set(activeRoutePath, activeResource);
34
- }
35
-
36
-
37
- // Now we go through our route segments creating the rest of the path.
38
- const pathSegments = prop.apiGateway?.route.split("/").filter(x => (x));
39
-
40
- for (let i = 0; i < pathSegments.length; i++) {
41
- activeRoutePath = `${activeRoutePath}/${pathSegments[i]}`;
42
- let secondaryResource = Routes.routeMap.get(activeRoutePath) || activeResource?.addResource(pathSegments[i]) || api.root.addResource(pathSegments[i]);
43
- Routes.routeMap.set(activeRoutePath, secondaryResource);
44
- activeResource = secondaryResource;
45
- }
46
-
47
- // console.log(`Route: ${prop.apiGateway.method}\t Lambda Name: ${lambdaNode.node.id}\t Path: ${activeRoutePath}`);
48
- // Finally, we attach our function to the last resource
49
- activeResource?.addMethod(prop.apiGateway.method || 'GET',
50
- new LambdaIntegration(lambdaNode, { proxy: true, }),
51
- {
52
- requestParameters: Routes.createQueryStringObject(prop.apiGateway.queryStrings),
53
- apiKeyRequired: (prop.apiGateway.requireApiKey) ? true : false,
54
- authorizer: prop.apiGateway.secure ? authorizer : undefined,
55
- authorizationType: prop.apiGateway.secure ? AuthorizationType.CUSTOM : undefined,
56
- });
57
- }
58
- }
59
-
60
- public static createQueryStringObject(queryStrings: string[] | undefined): { [key: string]: boolean } {
61
-
62
- if (!queryStrings || queryStrings.length === 0) {
63
- return {};
64
- }
65
-
66
- const obj: { [key: string]: boolean } = {};
67
-
68
- queryStrings.forEach((qs: string) => {
69
- obj[`method.request.querystring.${qs}`] = true;
70
- });
71
-
72
- return obj;
73
- }
74
-
1
+ import { AuthorizationType, IRestApi, LambdaIntegration, RequestAuthorizer, Resource, TokenAuthorizer } from "aws-cdk-lib/aws-apigateway";
2
+ import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs";
3
+ import { TsgLambdaProp } from "../../config/types";
4
+ import { Logger } from "../../helpers/logger";
5
+ import { logger } from "../layers/common/src/nodejs";
6
+
7
+
8
+ export class Routes {
9
+
10
+ public static Resources: Resource[] = [];
11
+ private static routeMap = new Map();
12
+
13
+ public static createResource(
14
+ prop: TsgLambdaProp,
15
+ api: IRestApi,
16
+ lambdaNode: NodejsFunction,
17
+ authorizer?: TokenAuthorizer | RequestAuthorizer,
18
+ ): void {
19
+
20
+ const routeMap: Map<string, Resource> = new Map();
21
+
22
+ let activeRoutePath = "";
23
+ let activeResource: Resource | undefined = undefined;
24
+
25
+ // Only attach lambda to an Api Gateway if a route exist
26
+ if (prop.apiGateway?.route) {
27
+
28
+ if (!prop.apiGateway.useRouteOverride) {
29
+ // First we create the root resource if it doesn't exist.
30
+ // Note: this now uses the bundle version as the first segment in the path.
31
+ activeRoutePath = `v${(prop.apiGateway?.version) ? prop.apiGateway.version : 1}`;
32
+ activeResource = Routes.routeMap.get(activeRoutePath) || api.root.addResource(activeRoutePath);
33
+ Routes.routeMap.set(activeRoutePath, activeResource);
34
+ }
35
+
36
+
37
+ // Now we go through our route segments creating the rest of the path.
38
+ const pathSegments = prop.apiGateway?.route.split("/").filter(x => (x));
39
+
40
+ for (let i = 0; i < pathSegments.length; i++) {
41
+ activeRoutePath = `${activeRoutePath}/${pathSegments[i]}`;
42
+ let secondaryResource = Routes.routeMap.get(activeRoutePath) || activeResource?.addResource(pathSegments[i]) || api.root.addResource(pathSegments[i]);
43
+ Routes.routeMap.set(activeRoutePath, secondaryResource);
44
+ activeResource = secondaryResource;
45
+ }
46
+
47
+ // console.log(`Route: ${prop.apiGateway.method}\t Lambda Name: ${lambdaNode.node.id}\t Path: ${activeRoutePath}`);
48
+ // Finally, we attach our function to the last resource
49
+ activeResource?.addMethod(prop.apiGateway.method || 'GET',
50
+ new LambdaIntegration(lambdaNode, { proxy: true, }),
51
+ {
52
+ requestParameters: Routes.createQueryStringObject(prop.apiGateway.queryStrings),
53
+ apiKeyRequired: (prop.apiGateway.requireApiKey) ? true : false,
54
+ authorizer: prop.apiGateway.secure ? authorizer : undefined,
55
+ authorizationType: prop.apiGateway.secure ? AuthorizationType.CUSTOM : undefined,
56
+ });
57
+ }
58
+ }
59
+
60
+ public static createQueryStringObject(queryStrings: string[] | undefined): { [key: string]: boolean } {
61
+
62
+ if (!queryStrings || queryStrings.length === 0) {
63
+ return {};
64
+ }
65
+
66
+ const obj: { [key: string]: boolean } = {};
67
+
68
+ queryStrings.forEach((qs: string) => {
69
+ obj[`method.request.querystring.${qs}`] = true;
70
+ });
71
+
72
+ return obj;
73
+ }
74
+
75
75
  }
@@ -1 +1 @@
1
- export { CreateCertificate } from "./certificate/createCertificate";
1
+ export { CreateCertificate } from "./certificate/createCertificate";
@@ -1,146 +1,124 @@
1
- import { Duration } from "aws-cdk-lib";
2
- import { ServicePrincipal } from "aws-cdk-lib/aws-iam";
3
- import { LayerVersion, Runtime } from "aws-cdk-lib/aws-lambda";
4
- import {
5
- NodejsFunction,
6
- NodejsFunctionProps,
7
- SourceMapMode,
8
- } from "aws-cdk-lib/aws-lambda-nodejs";
9
- import { RetentionDays } from "aws-cdk-lib/aws-logs";
10
- import path = require("path");
11
- import { LambdaProps } from "../../interfaces/lambda";
12
- import { Construct } from "constructs";
13
- import { Table } from "aws-cdk-lib/aws-dynamodb";
14
-
15
- export const createBasicLambda = (
16
- scope: Construct,
17
- props: LambdaProps
18
- ): NodejsFunction => {
19
- const lambdaProps = createBasicLambdaProps(props);
20
-
21
- const functionName = `${props.appPrefix || ""}${props.functionName}`;
22
-
23
- let lambdaFunction = new NodejsFunction(scope, functionName, lambdaProps);
24
-
25
- grantAccessToDynamoTables(
26
- scope,
27
- lambdaFunction,
28
- functionName,
29
- props.dynamoTableNames
30
- );
31
-
32
- addLambdaLayers(scope, lambdaFunction, functionName, props.lambdaLayerArn);
33
-
34
- return lambdaFunction;
35
- };
36
-
37
- const createBasicLambdaProps = (props: LambdaProps): NodejsFunctionProps => {
38
- let resolvedEntry: string;
39
- let depsLockFilePath: string | undefined = props.depsLockFilePath;
40
-
41
- if (props.codePath && path.isAbsolute(props.codePath)) {
42
- resolvedEntry = props.codePath;
43
- } else if (props.codePath && props.projectRoot) {
44
- // codePath is relative, resolve from current directory + projectRoot
45
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
46
- } else if (props.projectRoot) {
47
- // No codePath, use default path with projectRoot
48
- resolvedEntry = path.resolve(
49
- process.cwd(),
50
- props.projectRoot,
51
- `resources/lambdas/${props.functionName}/main.mts`
52
- );
53
- } else if (props.codePath) {
54
- // codePath without projectRoot
55
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
56
- } else {
57
- // Default path without projectRoot
58
- resolvedEntry = path.join(
59
- `./resources/lambdas/${props.functionName}/main.mts`
60
- );
61
- }
62
-
63
- // When projectRoot is provided, override depsLockFilePath to point to the projectRoot's lock file
64
- if (props.projectRoot && !depsLockFilePath) {
65
- const lockFiles = ["pnpm-lock.yaml", "yarn.lock", "package-lock.json"];
66
- for (const lockFile of lockFiles) {
67
- const lockPath = path.join(props.projectRoot, lockFile);
68
- if (require("fs").existsSync(lockPath)) {
69
- depsLockFilePath = lockPath;
70
- break;
71
- }
72
- }
73
- }
74
-
75
- const lambdaProp: NodejsFunctionProps = {
76
- entry: resolvedEntry,
77
- functionName: `${props.appPrefix ? `${props.appPrefix}-` : ""}${
78
- props.functionName
79
- }`,
80
- handler: "index.main",
81
- logRetention: RetentionDays.TWO_WEEKS,
82
- runtime: Runtime.NODEJS_LATEST,
83
- timeout: Duration.minutes(
84
- props.timeoutInMinutes ? props.timeoutInMinutes : 1
85
- ),
86
- memorySize: props.memory,
87
- environment: {
88
- ...props.envs,
89
- },
90
- bundling: {
91
- minify: true,
92
- target: `esnext`,
93
- sourceMap: true,
94
- sourceMapMode: SourceMapMode.EXTERNAL,
95
- environment: {
96
- ...props.envs,
97
- },
98
- ...(props.projectRoot && { projectRoot: props.projectRoot }),
99
- ...(depsLockFilePath && {
100
- depsLockFilePath: depsLockFilePath,
101
- }),
102
- },
103
- role: props.role,
104
- layers: undefined,
105
- };
106
-
107
- return lambdaProp;
108
- };
109
-
110
- const grantAccessToDynamoTables = (
111
- scope: Construct,
112
- lambda: NodejsFunction,
113
- functionName: string,
114
- tableNames?: string[]
115
- ) => {
116
- if (tableNames && tableNames.length > 0) {
117
- tableNames.forEach((tableName, idx) => {
118
- const table = Table.fromTableName(
119
- scope,
120
- `${tableName}-table-${idx}`,
121
- tableName
122
- );
123
-
124
- table.grantReadWriteData(lambda);
125
- });
126
- }
127
- };
128
-
129
- const addLambdaLayers = (
130
- scope: Construct,
131
- lambda: NodejsFunction,
132
- functionName: string,
133
- layerArns?: string[]
134
- ) => {
135
- if (layerArns && layerArns.length > 0) {
136
- layerArns.forEach((arn: string, idx: number) => {
137
- const layer = LayerVersion.fromLayerVersionArn(
138
- scope,
139
- `common-layer-${idx}`,
140
- arn
141
- );
142
-
143
- lambda.addLayers(layer);
144
- });
145
- }
146
- };
1
+ import { Duration } from "aws-cdk-lib";
2
+ import { ServicePrincipal } from "aws-cdk-lib/aws-iam";
3
+ import { LayerVersion, Runtime } from "aws-cdk-lib/aws-lambda";
4
+ import {
5
+ NodejsFunction,
6
+ NodejsFunctionProps,
7
+ SourceMapMode,
8
+ } from "aws-cdk-lib/aws-lambda-nodejs";
9
+ import { RetentionDays } from "aws-cdk-lib/aws-logs";
10
+ import path = require("path");
11
+ import { LambdaProps } from "../../interfaces/lambda";
12
+ import { Construct } from "constructs";
13
+ import { Table } from "aws-cdk-lib/aws-dynamodb";
14
+
15
+ export const createBasicLambda = (
16
+ scope: Construct,
17
+ props: LambdaProps
18
+ ): NodejsFunction => {
19
+ const lambdaProps = createBasicLambdaProps(props);
20
+
21
+ let lambdaFunction = new NodejsFunction(
22
+ scope,
23
+ `${props.appPrefix || ""}${props.functionName}`,
24
+ lambdaProps
25
+ );
26
+
27
+ grantAccessToDynamoTables(scope, lambdaFunction, props.dynamoTableNames);
28
+
29
+ addLambdaLayers(scope, lambdaFunction, props.lambdaLayerArn);
30
+
31
+ return lambdaFunction;
32
+ };
33
+
34
+ const createBasicLambdaProps = (props: LambdaProps): NodejsFunctionProps => {
35
+ let resolvedEntry: string;
36
+
37
+ if (props.codePath && path.isAbsolute(props.codePath)) {
38
+ resolvedEntry = props.codePath;
39
+ } else if (props.codePath && props.projectRoot) {
40
+ // codePath is relative, resolve from current directory + projectRoot
41
+ resolvedEntry = path.resolve(process.cwd(), props.codePath);
42
+ } else if (props.projectRoot) {
43
+ // No codePath, use default path with projectRoot
44
+ resolvedEntry = path.resolve(
45
+ process.cwd(),
46
+ props.projectRoot,
47
+ `resources/lambdas/${props.functionName}/main.mts`
48
+ );
49
+ } else if (props.codePath) {
50
+ // codePath without projectRoot
51
+ resolvedEntry = path.resolve(process.cwd(), props.codePath);
52
+ } else {
53
+ // Default path without projectRoot
54
+ resolvedEntry = path.join(
55
+ `./resources/lambdas/${props.functionName}/main.mts`
56
+ );
57
+ }
58
+
59
+ const lambdaProp: NodejsFunctionProps = {
60
+ entry: resolvedEntry,
61
+ functionName: `${props.appPrefix ? `${props.appPrefix}-` : ""}${
62
+ props.functionName
63
+ }`,
64
+ handler: "main.ts",
65
+ logRetention: RetentionDays.TWO_WEEKS,
66
+ runtime: Runtime.NODEJS_LATEST,
67
+ timeout: Duration.minutes(
68
+ props.timeoutInMinutes ? props.timeoutInMinutes : 1
69
+ ),
70
+ memorySize: props.memory,
71
+ environment: {
72
+ ...props.envs,
73
+ },
74
+ bundling: {
75
+ minify: true,
76
+ target: `esnext`,
77
+ sourceMap: true,
78
+ sourceMapMode: SourceMapMode.EXTERNAL,
79
+ environment: {
80
+ ...props.envs,
81
+ },
82
+ ...(props.projectRoot && { projectRoot: props.projectRoot }),
83
+ ...(props.depsLockFilePath && {
84
+ depsLockFilePath: props.depsLockFilePath,
85
+ }),
86
+ },
87
+ role: props.role,
88
+ layers: undefined,
89
+ };
90
+
91
+ return lambdaProp;
92
+ };
93
+
94
+ const grantAccessToDynamoTables = (
95
+ scope: Construct,
96
+ lambda: NodejsFunction,
97
+ tableNames?: string[]
98
+ ) => {
99
+ if (tableNames && tableNames.length > 0) {
100
+ tableNames.forEach((tableName) => {
101
+ const table = Table.fromTableName(scope, `${tableName}-table`, tableName);
102
+
103
+ table.grantReadWriteData(lambda);
104
+ });
105
+ }
106
+ };
107
+
108
+ const addLambdaLayers = (
109
+ scope: Construct,
110
+ lambda: NodejsFunction,
111
+ layerArns?: string[]
112
+ ) => {
113
+ if (layerArns && layerArns.length > 0) {
114
+ layerArns.forEach((arn: string, idx: number) => {
115
+ const layer = LayerVersion.fromLayerVersionArn(
116
+ scope,
117
+ `common-layer-${idx}`,
118
+ arn
119
+ );
120
+
121
+ lambda.addLayers(layer);
122
+ });
123
+ }
124
+ };