@incloodsolutions/devkit 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +180 -41
- package/dist/{aws/cdk/constructs/api-gateway-v2-construct.cjs → aws-cdk/constructs/api-gateway-v2.cjs} +2 -2
- package/dist/aws-cdk/constructs/api-gateway-v2.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/api-gateway-v2-construct.d.ts → aws-cdk/constructs/api-gateway-v2.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/api-gateway-v2-construct.d.cts → aws-cdk/constructs/api-gateway-v2.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/api-gateway-v2-construct.js → aws-cdk/constructs/api-gateway-v2.js} +2 -2
- package/dist/aws-cdk/constructs/api-gateway-v2.js.map +1 -0
- package/dist/{aws/cdk/constructs/api-gateway-websocket-construct.cjs → aws-cdk/constructs/api-gateway-websocket.cjs} +18 -6
- package/dist/aws-cdk/constructs/api-gateway-websocket.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/api-gateway-websocket-construct.d.ts → aws-cdk/constructs/api-gateway-websocket.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/api-gateway-websocket-construct.d.cts → aws-cdk/constructs/api-gateway-websocket.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/api-gateway-websocket-construct.js → aws-cdk/constructs/api-gateway-websocket.js} +18 -6
- package/dist/aws-cdk/constructs/api-gateway-websocket.js.map +1 -0
- package/dist/{aws/cdk/constructs/api-gateway-construct.cjs → aws-cdk/constructs/api-gateway.cjs} +6 -3
- package/dist/aws-cdk/constructs/api-gateway.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/api-gateway-construct.d.ts → aws-cdk/constructs/api-gateway.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/api-gateway-construct.d.cts → aws-cdk/constructs/api-gateway.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/api-gateway-construct.js → aws-cdk/constructs/api-gateway.js} +6 -3
- package/dist/aws-cdk/constructs/api-gateway.js.map +1 -0
- package/dist/{aws/cdk/constructs/cloudfront-construct.cjs → aws-cdk/constructs/cloudfront.cjs} +2 -2
- package/dist/aws-cdk/constructs/cloudfront.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/cloudfront-construct.d.ts → aws-cdk/constructs/cloudfront.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/cloudfront-construct.d.cts → aws-cdk/constructs/cloudfront.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/cloudfront-construct.js → aws-cdk/constructs/cloudfront.js} +2 -2
- package/dist/aws-cdk/constructs/cloudfront.js.map +1 -0
- package/dist/{aws/cdk/constructs/cloudwatch-construct.cjs → aws-cdk/constructs/cloudwatch.cjs} +2 -2
- package/dist/aws-cdk/constructs/cloudwatch.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/cloudwatch-construct.d.ts → aws-cdk/constructs/cloudwatch.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/cloudwatch-construct.d.cts → aws-cdk/constructs/cloudwatch.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/cloudwatch-construct.js → aws-cdk/constructs/cloudwatch.js} +2 -2
- package/dist/aws-cdk/constructs/cloudwatch.js.map +1 -0
- package/dist/{aws/cdk/constructs/dynamo-db-construct.cjs → aws-cdk/constructs/dynamo-db.cjs} +2 -2
- package/dist/aws-cdk/constructs/dynamo-db.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/dynamo-db-construct.d.ts → aws-cdk/constructs/dynamo-db.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/dynamo-db-construct.d.cts → aws-cdk/constructs/dynamo-db.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/dynamo-db-construct.js → aws-cdk/constructs/dynamo-db.js} +2 -2
- package/dist/aws-cdk/constructs/dynamo-db.js.map +1 -0
- package/dist/{aws/cdk/constructs/event-bridge-construct.cjs → aws-cdk/constructs/event-bridge.cjs} +2 -2
- package/dist/aws-cdk/constructs/event-bridge.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/event-bridge-construct.d.ts → aws-cdk/constructs/event-bridge.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/event-bridge-construct.d.cts → aws-cdk/constructs/event-bridge.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/event-bridge-construct.js → aws-cdk/constructs/event-bridge.js} +2 -2
- package/dist/aws-cdk/constructs/event-bridge.js.map +1 -0
- package/dist/{aws/cdk/constructs/lambda-authorizer-v2-construct.cjs → aws-cdk/constructs/lambda-authorizer-v2.cjs} +6 -3
- package/dist/aws-cdk/constructs/lambda-authorizer-v2.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/lambda-authorizer-v2-construct.d.ts → aws-cdk/constructs/lambda-authorizer-v2.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/lambda-authorizer-v2-construct.d.cts → aws-cdk/constructs/lambda-authorizer-v2.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/lambda-authorizer-v2-construct.js → aws-cdk/constructs/lambda-authorizer-v2.js} +6 -3
- package/dist/aws-cdk/constructs/lambda-authorizer-v2.js.map +1 -0
- package/dist/{aws/cdk/constructs/lambda-authorizer-construct.cjs → aws-cdk/constructs/lambda-authorizer.cjs} +2 -2
- package/dist/aws-cdk/constructs/lambda-authorizer.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/lambda-authorizer-construct.d.cts → aws-cdk/constructs/lambda-authorizer.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/lambda-authorizer-construct.d.ts → aws-cdk/constructs/lambda-authorizer.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/lambda-authorizer-construct.js → aws-cdk/constructs/lambda-authorizer.js} +2 -2
- package/dist/aws-cdk/constructs/lambda-authorizer.js.map +1 -0
- package/dist/{aws/cdk/constructs/lambda-layer-construct.cjs → aws-cdk/constructs/lambda-layer.cjs} +3 -6
- package/dist/aws-cdk/constructs/lambda-layer.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/lambda-layer-construct.d.ts → aws-cdk/constructs/lambda-layer.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/lambda-layer-construct.d.cts → aws-cdk/constructs/lambda-layer.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/lambda-layer-construct.js → aws-cdk/constructs/lambda-layer.js} +3 -6
- package/dist/aws-cdk/constructs/lambda-layer.js.map +1 -0
- package/dist/{aws/cdk/constructs/lambda-construct.cjs → aws-cdk/constructs/lambda.cjs} +4 -4
- package/dist/aws-cdk/constructs/lambda.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/lambda-construct.d.ts → aws-cdk/constructs/lambda.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/lambda-construct.d.cts → aws-cdk/constructs/lambda.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/lambda-construct.js → aws-cdk/constructs/lambda.js} +4 -4
- package/dist/aws-cdk/constructs/lambda.js.map +1 -0
- package/dist/{aws/cdk/constructs/role-policy-construct.cjs → aws-cdk/constructs/role-policy.cjs} +2 -2
- package/dist/aws-cdk/constructs/role-policy.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/role-policy-construct.d.ts → aws-cdk/constructs/role-policy.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/role-policy-construct.d.cts → aws-cdk/constructs/role-policy.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/role-policy-construct.js → aws-cdk/constructs/role-policy.js} +2 -2
- package/dist/aws-cdk/constructs/role-policy.js.map +1 -0
- package/dist/aws-cdk/constructs/route53.cjs +79 -0
- package/dist/aws-cdk/constructs/route53.cjs.map +1 -0
- package/dist/aws-cdk/constructs/route53.d.cts +95 -0
- package/dist/aws-cdk/constructs/route53.d.ts +95 -0
- package/dist/aws-cdk/constructs/route53.js +77 -0
- package/dist/aws-cdk/constructs/route53.js.map +1 -0
- package/dist/{aws/cdk/constructs/s3-deployment-construct.cjs → aws-cdk/constructs/s3-deployment.cjs} +20 -11
- package/dist/aws-cdk/constructs/s3-deployment.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/s3-deployment-construct.d.ts → aws-cdk/constructs/s3-deployment.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/s3-deployment-construct.d.cts → aws-cdk/constructs/s3-deployment.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/s3-deployment-construct.js → aws-cdk/constructs/s3-deployment.js} +20 -11
- package/dist/aws-cdk/constructs/s3-deployment.js.map +1 -0
- package/dist/{aws/cdk/constructs/s3-construct.cjs → aws-cdk/constructs/s3.cjs} +2 -2
- package/dist/aws-cdk/constructs/s3.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/s3-construct.d.ts → aws-cdk/constructs/s3.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/s3-construct.d.cts → aws-cdk/constructs/s3.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/s3-construct.js → aws-cdk/constructs/s3.js} +2 -2
- package/dist/aws-cdk/constructs/s3.js.map +1 -0
- package/dist/{aws/cdk/constructs/sns-construct.cjs → aws-cdk/constructs/sns.cjs} +2 -2
- package/dist/aws-cdk/constructs/sns.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/sns-construct.d.ts → aws-cdk/constructs/sns.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/sns-construct.d.cts → aws-cdk/constructs/sns.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/sns-construct.js → aws-cdk/constructs/sns.js} +2 -2
- package/dist/aws-cdk/constructs/sns.js.map +1 -0
- package/dist/{aws/cdk/constructs/sqs-construct.cjs → aws-cdk/constructs/sqs.cjs} +2 -2
- package/dist/aws-cdk/constructs/sqs.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/sqs-construct.d.ts → aws-cdk/constructs/sqs.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/sqs-construct.d.cts → aws-cdk/constructs/sqs.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/sqs-construct.js → aws-cdk/constructs/sqs.js} +2 -2
- package/dist/aws-cdk/constructs/sqs.js.map +1 -0
- package/dist/{aws/cdk/constructs/vpc-construct.cjs → aws-cdk/constructs/vpc.cjs} +2 -2
- package/dist/aws-cdk/constructs/vpc.cjs.map +1 -0
- package/dist/{aws/cdk/constructs/vpc-construct.d.ts → aws-cdk/constructs/vpc.d.cts} +2 -1
- package/dist/{aws/cdk/constructs/vpc-construct.d.cts → aws-cdk/constructs/vpc.d.ts} +2 -1
- package/dist/{aws/cdk/constructs/vpc-construct.js → aws-cdk/constructs/vpc.js} +2 -2
- package/dist/aws-cdk/constructs/vpc.js.map +1 -0
- package/dist/aws-cdk/stacks/lambda-api.cjs +252 -0
- package/dist/aws-cdk/stacks/lambda-api.cjs.map +1 -0
- package/dist/aws-cdk/stacks/lambda-api.d.cts +16 -0
- package/dist/aws-cdk/stacks/lambda-api.d.ts +16 -0
- package/dist/aws-cdk/stacks/lambda-api.js +250 -0
- package/dist/aws-cdk/stacks/lambda-api.js.map +1 -0
- package/dist/aws-cdk/stacks/lambda-sns.cjs +211 -0
- package/dist/aws-cdk/stacks/lambda-sns.cjs.map +1 -0
- package/dist/aws-cdk/stacks/lambda-sns.d.cts +17 -0
- package/dist/aws-cdk/stacks/lambda-sns.d.ts +17 -0
- package/dist/aws-cdk/stacks/lambda-sns.js +209 -0
- package/dist/aws-cdk/stacks/lambda-sns.js.map +1 -0
- package/dist/aws-cdk/stacks/lambda-sqs.cjs +220 -0
- package/dist/aws-cdk/stacks/lambda-sqs.cjs.map +1 -0
- package/dist/aws-cdk/stacks/lambda-sqs.d.cts +18 -0
- package/dist/aws-cdk/stacks/lambda-sqs.d.ts +18 -0
- package/dist/aws-cdk/stacks/lambda-sqs.js +218 -0
- package/dist/aws-cdk/stacks/lambda-sqs.js.map +1 -0
- package/dist/aws-types.cjs +4 -0
- package/dist/aws-types.cjs.map +1 -0
- package/dist/aws-types.d.cts +55 -0
- package/dist/aws-types.d.ts +55 -0
- package/dist/aws-types.js +3 -0
- package/dist/aws-types.js.map +1 -0
- package/dist/{aws/cdk/constructs/index.cjs → aws.cjs} +244 -23
- package/dist/aws.cjs.map +1 -0
- package/dist/aws.d.cts +40 -0
- package/dist/aws.d.ts +40 -0
- package/dist/{aws/index.js → aws.js} +243 -26
- package/dist/aws.js.map +1 -0
- package/dist/index.cjs +242 -21
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -18
- package/dist/index.d.ts +24 -18
- package/dist/index.js +241 -24
- package/dist/index.js.map +1 -1
- package/package.json +160 -25
- package/dist/aws/cdk/constructs/api-gateway-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/api-gateway-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/api-gateway-v2-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/api-gateway-v2-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/api-gateway-websocket-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/api-gateway-websocket-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/cloudfront-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/cloudfront-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/cloudwatch-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/cloudwatch-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/dynamo-db-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/dynamo-db-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/event-bridge-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/event-bridge-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/index.cjs.map +0 -1
- package/dist/aws/cdk/constructs/index.d.cts +0 -34
- package/dist/aws/cdk/constructs/index.d.ts +0 -34
- package/dist/aws/cdk/constructs/index.js +0 -863
- package/dist/aws/cdk/constructs/index.js.map +0 -1
- package/dist/aws/cdk/constructs/lambda-authorizer-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/lambda-authorizer-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/lambda-authorizer-v2-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/lambda-authorizer-v2-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/lambda-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/lambda-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/lambda-layer-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/lambda-layer-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/role-policy-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/role-policy-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/s3-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/s3-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/s3-deployment-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/s3-deployment-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/sns-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/sns-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/sqs-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/sqs-construct.js.map +0 -1
- package/dist/aws/cdk/constructs/vpc-construct.cjs.map +0 -1
- package/dist/aws/cdk/constructs/vpc-construct.js.map +0 -1
- package/dist/aws/cdk/index.cjs +0 -881
- package/dist/aws/cdk/index.cjs.map +0 -1
- package/dist/aws/cdk/index.d.cts +0 -34
- package/dist/aws/cdk/index.d.ts +0 -34
- package/dist/aws/cdk/index.js +0 -863
- package/dist/aws/cdk/index.js.map +0 -1
- package/dist/aws/cli/index.cjs +0 -4
- package/dist/aws/cli/index.cjs.map +0 -1
- package/dist/aws/cli/index.d.cts +0 -2
- package/dist/aws/cli/index.d.ts +0 -2
- package/dist/aws/cli/index.js +0 -3
- package/dist/aws/cli/index.js.map +0 -1
- package/dist/aws/index.cjs +0 -881
- package/dist/aws/index.cjs.map +0 -1
- package/dist/aws/index.d.cts +0 -34
- package/dist/aws/index.d.ts +0 -34
- package/dist/aws/index.js.map +0 -1
- package/dist/aws/types/index.cjs +0 -4
- package/dist/aws/types/index.cjs.map +0 -1
- package/dist/aws/types/index.d.cts +0 -18
- package/dist/aws/types/index.d.ts +0 -18
- package/dist/aws/types/index.js +0 -3
- package/dist/aws/types/index.js.map +0 -1
- package/dist/lint/index.cjs +0 -4
- package/dist/lint/index.cjs.map +0 -1
- package/dist/lint/index.d.cts +0 -2
- package/dist/lint/index.d.ts +0 -2
- package/dist/lint/index.js +0 -3
- package/dist/lint/index.js.map +0 -1
- package/dist/prettier/index.cjs +0 -4
- package/dist/prettier/index.cjs.map +0 -1
- package/dist/prettier/index.d.cts +0 -2
- package/dist/prettier/index.d.ts +0 -2
- package/dist/prettier/index.js +0 -3
- package/dist/prettier/index.js.map +0 -1
- package/dist/utility/index.cjs +0 -4
- package/dist/utility/index.cjs.map +0 -1
- package/dist/utility/index.d.cts +0 -2
- package/dist/utility/index.d.ts +0 -2
- package/dist/utility/index.js +0 -3
- package/dist/utility/index.js.map +0 -1
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { RemovalPolicy, CfnOutput, Duration, Stack } from 'aws-cdk-lib';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { HttpLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations';
|
|
4
|
+
import { HttpApi, CorsHttpMethod, HttpMethod } from 'aws-cdk-lib/aws-apigatewayv2';
|
|
5
|
+
import { CustomException, detectDuplicateProperties, AppEnvironmentEnum } from '@incloodsolutions/toolkit';
|
|
6
|
+
import { Function, Architecture, Runtime, Code, LayerVersion } from 'aws-cdk-lib/aws-lambda';
|
|
7
|
+
|
|
8
|
+
var __defProp = Object.defineProperty;
|
|
9
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
10
|
+
var BaseApiGatewayV2Construct = class extends Construct {
|
|
11
|
+
static {
|
|
12
|
+
__name(this, "BaseApiGatewayV2Construct");
|
|
13
|
+
}
|
|
14
|
+
/** The created HTTP API instance */
|
|
15
|
+
api;
|
|
16
|
+
/** Enables debug logging (if used externally) */
|
|
17
|
+
enableDebug = false;
|
|
18
|
+
/**
|
|
19
|
+
* @param scope Parent construct
|
|
20
|
+
* @param id Unique construct identifier
|
|
21
|
+
* @param props Configuration for API, routes, and handlers
|
|
22
|
+
*/
|
|
23
|
+
constructor(scope, id, props) {
|
|
24
|
+
super(scope, id);
|
|
25
|
+
this.enableDebug = props.enableDebug;
|
|
26
|
+
this.api = new HttpApi(this, id, {
|
|
27
|
+
...props?.options?.gatewayOptions,
|
|
28
|
+
/** Default API description if not provided */
|
|
29
|
+
description: props?.options?.gatewayOptions?.description || "This is an Http API using CDK",
|
|
30
|
+
/**
|
|
31
|
+
* CORS configuration
|
|
32
|
+
* Falls back to allowing all methods and standard headers if not explicitly defined
|
|
33
|
+
*/
|
|
34
|
+
corsPreflight: {
|
|
35
|
+
...props.options?.gatewayOptions?.corsPreflight,
|
|
36
|
+
/** Allow all HTTP methods by default */
|
|
37
|
+
allowMethods: props.options?.gatewayOptions?.corsPreflight?.allowMethods || Object.values(CorsHttpMethod),
|
|
38
|
+
/** Merge default headers with user-defined headers */
|
|
39
|
+
allowHeaders: [
|
|
40
|
+
"Content-Type",
|
|
41
|
+
"Accept",
|
|
42
|
+
"X-Amz-Date",
|
|
43
|
+
"Authorization",
|
|
44
|
+
"X-Api-Key",
|
|
45
|
+
"X-Amz-Security-Token",
|
|
46
|
+
"X-Amz-User-Agent",
|
|
47
|
+
...props.options?.gatewayOptions?.corsPreflight?.allowHeaders || []
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
if (!props?.handlerFunctions?.length) {
|
|
52
|
+
throw new CustomException("Construct requires atleast one function");
|
|
53
|
+
}
|
|
54
|
+
if (props?.options?.routeOptions?.length) {
|
|
55
|
+
props.handlerFunctions.forEach((handlerFunc) => {
|
|
56
|
+
props?.options?.routeOptions.forEach((route) => {
|
|
57
|
+
this.api.addRoutes({
|
|
58
|
+
...route,
|
|
59
|
+
/**
|
|
60
|
+
* Lambda integration for each route
|
|
61
|
+
*/
|
|
62
|
+
integration: new HttpLambdaIntegration("routes", handlerFunc)
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
this.api.applyRemovalPolicy(RemovalPolicy.DESTROY);
|
|
68
|
+
new CfnOutput(this, "ApiGatewayV2", {
|
|
69
|
+
value: this.api.url
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
var BaseLambdaConstruct = class extends Construct {
|
|
74
|
+
static {
|
|
75
|
+
__name(this, "BaseLambdaConstruct");
|
|
76
|
+
}
|
|
77
|
+
/** The created Lambda function instance */
|
|
78
|
+
function;
|
|
79
|
+
/**
|
|
80
|
+
* @param scope Parent construct
|
|
81
|
+
* @param id Unique construct identifier
|
|
82
|
+
* @param props Configuration for Lambda function
|
|
83
|
+
*/
|
|
84
|
+
constructor(scope, id, props) {
|
|
85
|
+
super(scope, id);
|
|
86
|
+
const environment = {
|
|
87
|
+
...props.options?.lambdaOptions?.environment,
|
|
88
|
+
NODE_ENV: props.stage,
|
|
89
|
+
NODE_OPTIONS: "--enable-source-maps",
|
|
90
|
+
AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1"
|
|
91
|
+
};
|
|
92
|
+
detectDuplicateProperties({ data: environment });
|
|
93
|
+
this.function = new Function(this, id, {
|
|
94
|
+
...props?.options?.lambdaOptions,
|
|
95
|
+
/**
|
|
96
|
+
* Lambda function name
|
|
97
|
+
* Defaults to "<stackName>" if not provided
|
|
98
|
+
*/
|
|
99
|
+
functionName: `${props?.options?.lambdaOptions?.functionName || props?.stackName}`,
|
|
100
|
+
/**
|
|
101
|
+
* Function description
|
|
102
|
+
*/
|
|
103
|
+
description: props?.options?.lambdaOptions?.description || "A lambda function",
|
|
104
|
+
/**
|
|
105
|
+
* Entry handler for the Lambda function
|
|
106
|
+
*/
|
|
107
|
+
handler: props?.options?.lambdaOptions?.handler || "lambda.handler",
|
|
108
|
+
/**
|
|
109
|
+
* Runtime environment
|
|
110
|
+
*/
|
|
111
|
+
runtime: props?.options?.lambdaOptions?.runtime || Runtime.NODEJS_24_X,
|
|
112
|
+
/**
|
|
113
|
+
* Execution timeout
|
|
114
|
+
* - 30 seconds in production
|
|
115
|
+
* - 15 seconds otherwise
|
|
116
|
+
*/
|
|
117
|
+
timeout: props?.options?.lambdaOptions?.timeout || Duration.seconds(
|
|
118
|
+
props.stage === AppEnvironmentEnum.PRODUCTION ? 30 : 15
|
|
119
|
+
),
|
|
120
|
+
/**
|
|
121
|
+
* Memory allocation (in MB)
|
|
122
|
+
*/
|
|
123
|
+
memorySize: props?.options?.lambdaOptions?.memorySize || 1024,
|
|
124
|
+
/**
|
|
125
|
+
* CPU architecture
|
|
126
|
+
*/
|
|
127
|
+
architecture: props?.options?.lambdaOptions?.architecture || Architecture.ARM_64,
|
|
128
|
+
/**
|
|
129
|
+
* Lambda deployment package source
|
|
130
|
+
*/
|
|
131
|
+
code: props?.options?.lambdaOptions?.code || Code.fromAsset("dist"),
|
|
132
|
+
/**
|
|
133
|
+
* Final merged environment variables
|
|
134
|
+
*/
|
|
135
|
+
environment
|
|
136
|
+
});
|
|
137
|
+
new CfnOutput(this, "LambdaFunctionArn", {
|
|
138
|
+
value: this.function.functionArn
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
var BaseLambdaLayerConstruct = class extends Construct {
|
|
143
|
+
static {
|
|
144
|
+
__name(this, "BaseLambdaLayerConstruct");
|
|
145
|
+
}
|
|
146
|
+
/** Newly created Lambda Layer (null if importing existing layer) */
|
|
147
|
+
layer;
|
|
148
|
+
/** Imported Lambda Layer reference (null if creating new layer) */
|
|
149
|
+
existingLayer;
|
|
150
|
+
/**
|
|
151
|
+
* @param scope Parent construct
|
|
152
|
+
* @param id Unique construct identifier
|
|
153
|
+
* @param props Configuration for layer creation or import
|
|
154
|
+
*/
|
|
155
|
+
constructor(scope, id, props) {
|
|
156
|
+
super(scope, id);
|
|
157
|
+
if (props?.options?.fromExistingLayerArn) {
|
|
158
|
+
this.existingLayer = LayerVersion.fromLayerVersionArn(
|
|
159
|
+
this,
|
|
160
|
+
`${id}-Arn`,
|
|
161
|
+
props?.options?.fromExistingLayerArn
|
|
162
|
+
);
|
|
163
|
+
} else if (props?.options?.fromExistingLayerAttribute) {
|
|
164
|
+
this.existingLayer = LayerVersion.fromLayerVersionAttributes(
|
|
165
|
+
this,
|
|
166
|
+
`${id}-Attribute`,
|
|
167
|
+
props?.options?.fromExistingLayerAttribute
|
|
168
|
+
);
|
|
169
|
+
} else {
|
|
170
|
+
this.layer = new LayerVersion(this, id, {
|
|
171
|
+
...props.options?.layerOptions,
|
|
172
|
+
/**
|
|
173
|
+
* Default layer code asset
|
|
174
|
+
*/
|
|
175
|
+
code: props?.options?.layerOptions?.code || Code.fromAsset("./dist-layer"),
|
|
176
|
+
/**
|
|
177
|
+
* Layer description
|
|
178
|
+
*/
|
|
179
|
+
description: props?.options?.layerOptions?.description || "Lambda Layer written in NodeJS, NestJS, NodeJS-express, serverless-express",
|
|
180
|
+
/**
|
|
181
|
+
* Supported CPU architectures
|
|
182
|
+
*/
|
|
183
|
+
compatibleArchitectures: [Architecture.ARM_64, Architecture.X86_64],
|
|
184
|
+
/**
|
|
185
|
+
* Supported runtimes
|
|
186
|
+
*/
|
|
187
|
+
compatibleRuntimes: [
|
|
188
|
+
Runtime.NODEJS_22_X,
|
|
189
|
+
Runtime.NODEJS_24_X,
|
|
190
|
+
Runtime.NODEJS_LATEST
|
|
191
|
+
]
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
new CfnOutput(this, "LambdaLayerArn", {
|
|
195
|
+
value: props.options?.fromExistingLayerArn || props.options?.fromExistingLayerAttribute ? this.existingLayer.layerVersionArn : this.layer.layerVersionArn
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
var BaseLambdaApiStack = class extends Stack {
|
|
200
|
+
static {
|
|
201
|
+
__name(this, "BaseLambdaApiStack");
|
|
202
|
+
}
|
|
203
|
+
constructor(scope, id, props) {
|
|
204
|
+
super(scope, id, props);
|
|
205
|
+
let layers = [];
|
|
206
|
+
if (props?.stackOptions?.layerOptions) {
|
|
207
|
+
if (!props.stackOptions?.layerOptions?.name || !props.stackOptions?.layerOptions?.version) {
|
|
208
|
+
throw new CustomException("Invalid layer options provided! Both layer 'name' and 'version' are required.");
|
|
209
|
+
}
|
|
210
|
+
const { existingLayer } = new BaseLambdaLayerConstruct(
|
|
211
|
+
this,
|
|
212
|
+
"layer",
|
|
213
|
+
{
|
|
214
|
+
options: {
|
|
215
|
+
fromExistingLayerArn: `arn:aws:lambda:${props.env?.region}:${props.env?.account}:layer:${props.stackOptions?.layerOptions?.name}:${props.stackOptions?.layerOptions?.version}`
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
);
|
|
219
|
+
layers.push(existingLayer);
|
|
220
|
+
}
|
|
221
|
+
const { function: lambdaFunction } = new BaseLambdaConstruct(this, "lambda", {
|
|
222
|
+
stage: props.stackOptions?.stage,
|
|
223
|
+
stackName: props.stackName,
|
|
224
|
+
options: {
|
|
225
|
+
lambdaOptions: { layers }
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
new BaseApiGatewayV2Construct(this, "apiGateway", {
|
|
229
|
+
handlerFunctions: [lambdaFunction],
|
|
230
|
+
options: {
|
|
231
|
+
gatewayOptions: {
|
|
232
|
+
apiName: props.stackName,
|
|
233
|
+
corsPreflight: {
|
|
234
|
+
allowOrigins: ["*"]
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
routeOptions: [
|
|
238
|
+
{
|
|
239
|
+
path: "/{proxy+}",
|
|
240
|
+
methods: [HttpMethod.ANY]
|
|
241
|
+
}
|
|
242
|
+
]
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
export { BaseLambdaApiStack };
|
|
249
|
+
//# sourceMappingURL=lambda-api.js.map
|
|
250
|
+
//# sourceMappingURL=lambda-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/aws/cdk/constructs/api-gateway-v2-construct.ts","../../../src/aws/cdk/constructs/lambda-construct.ts","../../../src/aws/cdk/constructs/lambda-layer-construct.ts","../../../src/aws/cdk/stacks/lambda-api-stack.ts"],"names":["Construct","CfnOutput","Code","Architecture","Runtime","CustomException"],"mappings":"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","file":"lambda-api.js","sourcesContent":["import { Construct } from 'constructs';\nimport { Function } from 'aws-cdk-lib/aws-lambda';\nimport { CfnOutput, RemovalPolicy } from 'aws-cdk-lib';\nimport { HttpLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations';\nimport {\n\tAddRoutesOptions,\n\tCorsHttpMethod,\n\tHttpApi,\n\tHttpApiProps,\n} from 'aws-cdk-lib/aws-apigatewayv2';\n\nimport { CustomException } from '@incloodsolutions/toolkit';\nimport { IBaseCdkConstructProps, IBaseConstruct } from '../../types';\n\n/**\n * Properties for configuring the API Gateway v2 construct\n *\n * Extends base CDK construct props and provides configuration for:\n * - HTTP API (Api Gateway v2)\n * - Route definitions\n * - Lambda handlers\n */\ninterface IApiGatewayV2ConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** HTTP API configuration options */\n\t\treadonly gatewayOptions: HttpApiProps;\n\n\t\t/** Route definitions passed directly to `addRoutes` */\n\t\treadonly routeOptions: Partial<AddRoutesOptions>[];\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {\n\t/**\n\t * Lambda functions used as route handlers\n\t *\n\t * Note:\n\t * Each handler is paired with each route during route creation\n\t */\n\treadonly handlerFunctions: Function[];\n}\n\n/**\n * CDK construct for creating an API Gateway v2 (HTTP API)\n *\n * Responsibilities:\n * - Creates an HTTP API with optional custom configuration\n * - Applies default CORS configuration when not provided\n * - Attaches routes with Lambda integrations\n * - Exposes API URL as a CloudFormation output\n *\n * Behaviour:\n * - Each route is registered for every provided handler function\n * - Throws if no handler functions are supplied\n */\nexport class BaseApiGatewayV2Construct\n\textends Construct\n\timplements IBaseConstruct\n{\n\t/** The created HTTP API instance */\n\treadonly api: HttpApi;\n\n\t/** Enables debug logging (if used externally) */\n\tenableDebug = false;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for API, routes, and handlers\n\t */\n\tconstructor(\n\t\tscope: Construct,\n\t\tid: string,\n\t\tprops: IApiGatewayV2ConstructProps,\n\t) {\n\t\tsuper(scope, id);\n\n\t\tthis.enableDebug = props.enableDebug;\n\n\t\tthis.api = new HttpApi(this, id, {\n\t\t\t...props?.options?.gatewayOptions,\n\n\t\t\t/** Default API description if not provided */\n\t\t\tdescription:\n\t\t\t\tprops?.options?.gatewayOptions?.description ||\n\t\t\t\t'This is an Http API using CDK',\n\n\t\t\t/**\n\t\t\t * CORS configuration\n\t\t\t * Falls back to allowing all methods and standard headers if not explicitly defined\n\t\t\t */\n\t\t\tcorsPreflight: {\n\t\t\t\t...props.options?.gatewayOptions?.corsPreflight,\n\n\t\t\t\t/** Allow all HTTP methods by default */\n\t\t\t\tallowMethods:\n\t\t\t\t\tprops.options?.gatewayOptions?.corsPreflight?.allowMethods ||\n\t\t\t\t\tObject.values(CorsHttpMethod),\n\n\t\t\t\t/** Merge default headers with user-defined headers */\n\t\t\t\tallowHeaders: [\n\t\t\t\t\t'Content-Type',\n\t\t\t\t\t'Accept',\n\t\t\t\t\t'X-Amz-Date',\n\t\t\t\t\t'Authorization',\n\t\t\t\t\t'X-Api-Key',\n\t\t\t\t\t'X-Amz-Security-Token',\n\t\t\t\t\t'X-Amz-User-Agent',\n\t\t\t\t\t...(props.options?.gatewayOptions?.corsPreflight?.allowHeaders || []),\n\t\t\t\t],\n\t\t\t},\n\t\t});\n\n\t\t/**\n\t\t * Ensure at least one handler function is provided\n\t\t */\n\t\tif (!props?.handlerFunctions?.length) {\n\t\t\tthrow new CustomException('Construct requires atleast one function');\n\t\t}\n\n\t\t/**\n\t\t * Register routes with Lambda integrations\n\t\t */\n\t\tif (props?.options?.routeOptions?.length) {\n\t\t\tprops.handlerFunctions.forEach((handlerFunc) => {\n\t\t\t\tprops?.options?.routeOptions.forEach((route) => {\n\t\t\t\t\tthis.api.addRoutes({\n\t\t\t\t\t\t...route,\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Lambda integration for each route\n\t\t\t\t\t\t */\n\t\t\t\t\t\tintegration: new HttpLambdaIntegration('routes', handlerFunc),\n\t\t\t\t\t} as AddRoutesOptions);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Apply removal policy (useful for non-production environments)\n\t\t */\n\t\tthis.api.applyRemovalPolicy(RemovalPolicy.DESTROY);\n\n\t\t/**\n\t\t * CloudFormation output exposing the API base URL\n\t\t */\n\t\tnew CfnOutput(this, 'ApiGatewayV2', {\n\t\t\tvalue: this.api.url,\n\t\t});\n\t}\n}\n","import { Construct } from 'constructs';\nimport { CfnOutput, Duration } from 'aws-cdk-lib';\nimport {\n\tArchitecture,\n\tCode,\n\tFunction,\n\tFunctionProps,\n\tRuntime,\n} from 'aws-cdk-lib/aws-lambda';\n\nimport {\n\tdetectDuplicateProperties,\n\tAppEnvironmentEnum,\n} from '@incloodsolutions/toolkit';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseLambdaConstruct\n *\n * Provides configuration for creating a Lambda function\n * with optional overrides for runtime, memory, timeout, and environment.\n */\ninterface ILambdaConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** Partial Lambda configuration options */\n\t\treadonly lambdaOptions: Partial<FunctionProps>;\n\t}>,\n\t'appName'\n> {}\n\n/**\n * CDK construct for AWS Lambda function\n *\n * Responsibilities:\n * - Creates a Lambda function with sensible defaults\n * - Merges and validates environment variables\n * - Applies stage-based configuration (e.g. timeout)\n * - Exposes the function ARN as a CloudFormation output\n */\nexport class BaseLambdaConstruct extends Construct {\n\t/** The created Lambda function instance */\n\treadonly function: Function;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for Lambda function\n\t */\n\tconstructor(scope: Construct, id: string, props: ILambdaConstructProps) {\n\t\tsuper(scope, id);\n\n\t\t/**\n\t\t * Environment variables for the Lambda function\n\t\t *\n\t\t * Includes:\n\t\t * - User-defined variables\n\t\t * - NODE_ENV derived from stage\n\t\t * - Node.js runtime optimisations\n\t\t */\n\t\tconst environment = {\n\t\t\t...props.options?.lambdaOptions?.environment,\n\t\t\tNODE_ENV: props.stage,\n\t\t\tNODE_OPTIONS: '--enable-source-maps',\n\t\t\tAWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',\n\t\t};\n\n\t\t/**\n\t\t * Validate environment variables for duplicate keys\n\t\t */\n\t\tdetectDuplicateProperties({ data: environment });\n\n\t\tthis.function = new Function(this, id, {\n\t\t\t...props?.options?.lambdaOptions,\n\n\t\t\t/**\n\t\t\t * Lambda function name\n\t\t\t * Defaults to \"<stackName>\" if not provided\n\t\t\t */\n\t\t\tfunctionName: `${props?.options?.lambdaOptions?.functionName || props?.stackName}`,\n\n\t\t\t/**\n\t\t\t * Function description\n\t\t\t */\n\t\t\tdescription:\n\t\t\t\tprops?.options?.lambdaOptions?.description || 'A lambda function',\n\n\t\t\t/**\n\t\t\t * Entry handler for the Lambda function\n\t\t\t */\n\t\t\thandler: props?.options?.lambdaOptions?.handler || 'lambda.handler',\n\n\t\t\t/**\n\t\t\t * Runtime environment\n\t\t\t */\n\t\t\truntime: props?.options?.lambdaOptions?.runtime || Runtime.NODEJS_24_X,\n\n\t\t\t/**\n\t\t\t * Execution timeout\n\t\t\t * - 30 seconds in production\n\t\t\t * - 15 seconds otherwise\n\t\t\t */\n\t\t\ttimeout:\n\t\t\t\tprops?.options?.lambdaOptions?.timeout ||\n\t\t\t\tDuration.seconds(\n\t\t\t\t\tprops.stage === AppEnvironmentEnum.PRODUCTION ? 30 : 15,\n\t\t\t\t),\n\n\t\t\t/**\n\t\t\t * Memory allocation (in MB)\n\t\t\t */\n\t\t\tmemorySize: props?.options?.lambdaOptions?.memorySize || 1024,\n\n\t\t\t/**\n\t\t\t * CPU architecture\n\t\t\t */\n\t\t\tarchitecture:\n\t\t\t\tprops?.options?.lambdaOptions?.architecture || Architecture.ARM_64,\n\n\t\t\t/**\n\t\t\t * Lambda deployment package source\n\t\t\t */\n\t\t\tcode: props?.options?.lambdaOptions?.code || Code.fromAsset('dist'),\n\n\t\t\t/**\n\t\t\t * Final merged environment variables\n\t\t\t */\n\t\t\tenvironment,\n\t\t});\n\n\t\t/**\n\t\t * CloudFormation output exposing the Lambda function ARN\n\t\t */\n\t\tnew CfnOutput(this, 'LambdaFunctionArn', {\n\t\t\tvalue: this.function.functionArn,\n\t\t});\n\t}\n}\n","import { Construct } from 'constructs';\nimport { CfnOutput } from 'aws-cdk-lib';\nimport {\n\tArchitecture,\n\tCode,\n\tILayerVersion,\n\tLayerVersion,\n\tLayerVersionProps,\n\tRuntime,\n} from 'aws-cdk-lib/aws-lambda';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseLambdaLayerConstruct\n *\n * Provides configuration for:\n * - Creating a new Lambda Layer\n * - Importing an existing layer by ARN or attributes\n */\ninterface ILambdaLayerConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/**\n\t\t * Configuration for creating a new Lambda layer\n\t\t *\n\t\t * Note:\n\t\t * - `layerVersionName` is required\n\t\t * - `compatibleArchitectures` is managed internally\n\t\t */\n\t\treadonly layerOptions?: Partial<\n\t\t\tOmit<LayerVersionProps, 'layerVersionName' | 'compatibleArchitectures'>\n\t\t> &\n\t\t\tRequired<Pick<LayerVersionProps, 'layerVersionName'>>;\n\n\t\t/** Import an existing layer by ARN */\n\t\treadonly fromExistingLayerArn?: string;\n\n\t\t/** Import an existing layer using attributes */\n\t\treadonly fromExistingLayerAttribute?: {\n\t\t\treadonly layerVersionArn: string;\n\t\t\treadonly compatibleRuntimes?: Runtime[];\n\t\t};\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {}\n\n/**\n * CDK construct for Lambda Layer\n *\n * Responsibilities:\n * - Creates a new Lambda layer or imports an existing one\n * - Applies default runtime and architecture compatibility\n * - Exposes the layer ARN as a CloudFormation output\n */\nexport class BaseLambdaLayerConstruct extends Construct {\n\t/** Newly created Lambda Layer (null if importing existing layer) */\n\treadonly layer: LayerVersion;\n\n\t/** Imported Lambda Layer reference (null if creating new layer) */\n\treadonly existingLayer: ILayerVersion;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for layer creation or import\n\t */\n\tconstructor(\n\t\tscope: Construct,\n\t\tid: string,\n\t\tprops?: ILambdaLayerConstructProps,\n\t) {\n\t\tsuper(scope, id);\n\n\t\t/**\n\t\t * Import layer by ARN\n\t\t */\n\t\tif (props?.options?.fromExistingLayerArn) {\n\t\t\tthis.existingLayer = LayerVersion.fromLayerVersionArn(\n\t\t\t\tthis,\n\t\t\t\t`${id}-Arn`,\n\t\t\t\tprops?.options?.fromExistingLayerArn,\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Import layer using attributes\n\t\t\t */\n\t\t} else if (props?.options?.fromExistingLayerAttribute) {\n\t\t\tthis.existingLayer = LayerVersion.fromLayerVersionAttributes(\n\t\t\t\tthis,\n\t\t\t\t`${id}-Attribute`,\n\t\t\t\tprops?.options?.fromExistingLayerAttribute,\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Create new Lambda layer\n\t\t\t */\n\t\t} else {\n\t\t\tthis.layer = new LayerVersion(this, id, {\n\t\t\t\t...props.options?.layerOptions,\n\n\t\t\t\t/**\n\t\t\t\t * Default layer code asset\n\t\t\t\t */\n\t\t\t\tcode:\n\t\t\t\t\tprops?.options?.layerOptions?.code || Code.fromAsset('./dist-layer'),\n\n\t\t\t\t/**\n\t\t\t\t * Layer description\n\t\t\t\t */\n\t\t\t\tdescription:\n\t\t\t\t\tprops?.options?.layerOptions?.description ||\n\t\t\t\t\t'Lambda Layer written in NodeJS, NestJS, NodeJS-express, serverless-express',\n\n\t\t\t\t/**\n\t\t\t\t * Supported CPU architectures\n\t\t\t\t */\n\t\t\t\tcompatibleArchitectures: [Architecture.ARM_64, Architecture.X86_64],\n\n\t\t\t\t/**\n\t\t\t\t * Supported runtimes\n\t\t\t\t */\n\t\t\t\tcompatibleRuntimes: [\n\t\t\t\t\tRuntime.NODEJS_22_X,\n\t\t\t\t\tRuntime.NODEJS_24_X,\n\t\t\t\t\tRuntime.NODEJS_LATEST,\n\t\t\t\t],\n\t\t\t} as LayerVersionProps);\n\t\t}\n\n\t\t/**\n\t\t * CloudFormation output exposing the layer ARN\n\t\t * Resolves to either created or imported layer\n\t\t */\n\t\tnew CfnOutput(this, 'LambdaLayerArn', {\n\t\t\tvalue:\n\t\t\t\tprops.options?.fromExistingLayerArn ||\n\t\t\t\tprops.options?.fromExistingLayerAttribute\n\t\t\t\t\t? this.existingLayer.layerVersionArn\n\t\t\t\t\t: this.layer.layerVersionArn,\n\t\t});\n\t}\n}\n","import { App, Stack } from \"aws-cdk-lib\";\n\nimport { IBaseStackProps } from \"../../types\";\nimport { BaseApiGatewayV2Construct, BaseLambdaConstruct, BaseLambdaLayerConstruct } from \"../constructs\";\nimport { CustomException } from \"@incloodsolutions/toolkit\";\nimport { ILayerVersion } from \"aws-cdk-lib/aws-lambda\";\nimport { HttpMethod } from \"aws-cdk-lib/aws-apigatewayv2\";\n\nexport class BaseLambdaApiStack extends Stack {\n\tconstructor(scope: App, id: string, props: IBaseStackProps<{\n\t\tlayerOptions?: {\n\t\t\tname: string;\n\t\t\tversion: number;\n\t\t};\n\t\tlambdaOptions?: {};\n\t\tapiGatewayOptions?: {};\n\t}>) {\n\t\tsuper(scope, id, props);\n\t\tlet layers: ILayerVersion[] = [];\n\n\t\tif (props?.stackOptions?.layerOptions) {\n\t\t\tif (!props.stackOptions?.layerOptions?.name || !props.stackOptions?.layerOptions?.version) {\n\t\t\t\tthrow new CustomException(\"Invalid layer options provided! Both layer 'name' and 'version' are required.\");\n\t\t\t}\n\t\t\tconst { existingLayer } = new BaseLambdaLayerConstruct(\n\t\t\t\tthis,\n\t\t\t\t'layer',\n\t\t\t\t{\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tfromExistingLayerArn: `arn:aws:lambda:${props.env?.region}:${props.env?.account}:layer:${props.stackOptions?.layerOptions?.name}:${props.stackOptions?.layerOptions?.version}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tlayers.push(existingLayer);\n\t\t}\n\n\t\tconst { function: lambdaFunction } = new BaseLambdaConstruct(this, 'lambda', {\n\t\t\tstage: props.stackOptions?.stage,\n\t\t\tstackName: props.stackName,\n\t\t\toptions: {\n\t\t\t\tlambdaOptions: { layers },\n\t\t\t},\n\t\t});\n\n\t\tnew BaseApiGatewayV2Construct(this, 'apiGateway', {\n\t\t\thandlerFunctions: [lambdaFunction],\n\t\t\toptions: {\n\t\t\t\tgatewayOptions: {\n\t\t\t\t\tapiName: props.stackName,\n\t\t\t\t\tcorsPreflight: {\n\t\t\t\t\t\tallowOrigins: ['*'],\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\trouteOptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tpath: '/{proxy+}',\n\t\t\t\t\t\tmethods: [HttpMethod.ANY],\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t});\n\n\t}\n}\n"]}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var awsCdkLib = require('aws-cdk-lib');
|
|
4
|
+
var constructs = require('constructs');
|
|
5
|
+
var awsLambda = require('aws-cdk-lib/aws-lambda');
|
|
6
|
+
var toolkit = require('@incloodsolutions/toolkit');
|
|
7
|
+
var awsSns = require('aws-cdk-lib/aws-sns');
|
|
8
|
+
var awsSnsSubscriptions = require('aws-cdk-lib/aws-sns-subscriptions');
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
12
|
+
var BaseLambdaConstruct = class extends constructs.Construct {
|
|
13
|
+
static {
|
|
14
|
+
__name(this, "BaseLambdaConstruct");
|
|
15
|
+
}
|
|
16
|
+
/** The created Lambda function instance */
|
|
17
|
+
function;
|
|
18
|
+
/**
|
|
19
|
+
* @param scope Parent construct
|
|
20
|
+
* @param id Unique construct identifier
|
|
21
|
+
* @param props Configuration for Lambda function
|
|
22
|
+
*/
|
|
23
|
+
constructor(scope, id, props) {
|
|
24
|
+
super(scope, id);
|
|
25
|
+
const environment = {
|
|
26
|
+
...props.options?.lambdaOptions?.environment,
|
|
27
|
+
NODE_ENV: props.stage,
|
|
28
|
+
NODE_OPTIONS: "--enable-source-maps",
|
|
29
|
+
AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1"
|
|
30
|
+
};
|
|
31
|
+
toolkit.detectDuplicateProperties({ data: environment });
|
|
32
|
+
this.function = new awsLambda.Function(this, id, {
|
|
33
|
+
...props?.options?.lambdaOptions,
|
|
34
|
+
/**
|
|
35
|
+
* Lambda function name
|
|
36
|
+
* Defaults to "<stackName>" if not provided
|
|
37
|
+
*/
|
|
38
|
+
functionName: `${props?.options?.lambdaOptions?.functionName || props?.stackName}`,
|
|
39
|
+
/**
|
|
40
|
+
* Function description
|
|
41
|
+
*/
|
|
42
|
+
description: props?.options?.lambdaOptions?.description || "A lambda function",
|
|
43
|
+
/**
|
|
44
|
+
* Entry handler for the Lambda function
|
|
45
|
+
*/
|
|
46
|
+
handler: props?.options?.lambdaOptions?.handler || "lambda.handler",
|
|
47
|
+
/**
|
|
48
|
+
* Runtime environment
|
|
49
|
+
*/
|
|
50
|
+
runtime: props?.options?.lambdaOptions?.runtime || awsLambda.Runtime.NODEJS_24_X,
|
|
51
|
+
/**
|
|
52
|
+
* Execution timeout
|
|
53
|
+
* - 30 seconds in production
|
|
54
|
+
* - 15 seconds otherwise
|
|
55
|
+
*/
|
|
56
|
+
timeout: props?.options?.lambdaOptions?.timeout || awsCdkLib.Duration.seconds(
|
|
57
|
+
props.stage === toolkit.AppEnvironmentEnum.PRODUCTION ? 30 : 15
|
|
58
|
+
),
|
|
59
|
+
/**
|
|
60
|
+
* Memory allocation (in MB)
|
|
61
|
+
*/
|
|
62
|
+
memorySize: props?.options?.lambdaOptions?.memorySize || 1024,
|
|
63
|
+
/**
|
|
64
|
+
* CPU architecture
|
|
65
|
+
*/
|
|
66
|
+
architecture: props?.options?.lambdaOptions?.architecture || awsLambda.Architecture.ARM_64,
|
|
67
|
+
/**
|
|
68
|
+
* Lambda deployment package source
|
|
69
|
+
*/
|
|
70
|
+
code: props?.options?.lambdaOptions?.code || awsLambda.Code.fromAsset("dist"),
|
|
71
|
+
/**
|
|
72
|
+
* Final merged environment variables
|
|
73
|
+
*/
|
|
74
|
+
environment
|
|
75
|
+
});
|
|
76
|
+
new awsCdkLib.CfnOutput(this, "LambdaFunctionArn", {
|
|
77
|
+
value: this.function.functionArn
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
var BaseLambdaLayerConstruct = class extends constructs.Construct {
|
|
82
|
+
static {
|
|
83
|
+
__name(this, "BaseLambdaLayerConstruct");
|
|
84
|
+
}
|
|
85
|
+
/** Newly created Lambda Layer (null if importing existing layer) */
|
|
86
|
+
layer;
|
|
87
|
+
/** Imported Lambda Layer reference (null if creating new layer) */
|
|
88
|
+
existingLayer;
|
|
89
|
+
/**
|
|
90
|
+
* @param scope Parent construct
|
|
91
|
+
* @param id Unique construct identifier
|
|
92
|
+
* @param props Configuration for layer creation or import
|
|
93
|
+
*/
|
|
94
|
+
constructor(scope, id, props) {
|
|
95
|
+
super(scope, id);
|
|
96
|
+
if (props?.options?.fromExistingLayerArn) {
|
|
97
|
+
this.existingLayer = awsLambda.LayerVersion.fromLayerVersionArn(
|
|
98
|
+
this,
|
|
99
|
+
`${id}-Arn`,
|
|
100
|
+
props?.options?.fromExistingLayerArn
|
|
101
|
+
);
|
|
102
|
+
} else if (props?.options?.fromExistingLayerAttribute) {
|
|
103
|
+
this.existingLayer = awsLambda.LayerVersion.fromLayerVersionAttributes(
|
|
104
|
+
this,
|
|
105
|
+
`${id}-Attribute`,
|
|
106
|
+
props?.options?.fromExistingLayerAttribute
|
|
107
|
+
);
|
|
108
|
+
} else {
|
|
109
|
+
this.layer = new awsLambda.LayerVersion(this, id, {
|
|
110
|
+
...props.options?.layerOptions,
|
|
111
|
+
/**
|
|
112
|
+
* Default layer code asset
|
|
113
|
+
*/
|
|
114
|
+
code: props?.options?.layerOptions?.code || awsLambda.Code.fromAsset("./dist-layer"),
|
|
115
|
+
/**
|
|
116
|
+
* Layer description
|
|
117
|
+
*/
|
|
118
|
+
description: props?.options?.layerOptions?.description || "Lambda Layer written in NodeJS, NestJS, NodeJS-express, serverless-express",
|
|
119
|
+
/**
|
|
120
|
+
* Supported CPU architectures
|
|
121
|
+
*/
|
|
122
|
+
compatibleArchitectures: [awsLambda.Architecture.ARM_64, awsLambda.Architecture.X86_64],
|
|
123
|
+
/**
|
|
124
|
+
* Supported runtimes
|
|
125
|
+
*/
|
|
126
|
+
compatibleRuntimes: [
|
|
127
|
+
awsLambda.Runtime.NODEJS_22_X,
|
|
128
|
+
awsLambda.Runtime.NODEJS_24_X,
|
|
129
|
+
awsLambda.Runtime.NODEJS_LATEST
|
|
130
|
+
]
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
new awsCdkLib.CfnOutput(this, "LambdaLayerArn", {
|
|
134
|
+
value: props.options?.fromExistingLayerArn || props.options?.fromExistingLayerAttribute ? this.existingLayer.layerVersionArn : this.layer.layerVersionArn
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
var BaseSnsConstruct = class extends constructs.Construct {
|
|
139
|
+
static {
|
|
140
|
+
__name(this, "BaseSnsConstruct");
|
|
141
|
+
}
|
|
142
|
+
/** The created SNS topic instance */
|
|
143
|
+
topic;
|
|
144
|
+
/**
|
|
145
|
+
* @param scope Parent construct
|
|
146
|
+
* @param id Unique construct identifier
|
|
147
|
+
* @param props Configuration for topic and subscriptions
|
|
148
|
+
*/
|
|
149
|
+
constructor(scope, id, props) {
|
|
150
|
+
super(scope, id);
|
|
151
|
+
this.topic = new awsSns.Topic(this, id, props.options?.topicOptions);
|
|
152
|
+
if (props.options?.targetFunctions?.length) {
|
|
153
|
+
props.options.targetFunctions.forEach((targetFunction) => {
|
|
154
|
+
this.topic.addSubscription(
|
|
155
|
+
/**
|
|
156
|
+
* Lambda subscription target
|
|
157
|
+
*/
|
|
158
|
+
new awsSnsSubscriptions.LambdaSubscription(targetFunction)
|
|
159
|
+
);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
this.topic.applyRemovalPolicy(awsCdkLib.RemovalPolicy.DESTROY);
|
|
163
|
+
new awsCdkLib.CfnOutput(this, "SnsTopicArn", {
|
|
164
|
+
value: this.topic.topicArn
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
var BaseLambdaSnsStack = class extends awsCdkLib.Stack {
|
|
169
|
+
static {
|
|
170
|
+
__name(this, "BaseLambdaSnsStack");
|
|
171
|
+
}
|
|
172
|
+
constructor(scope, id, props) {
|
|
173
|
+
super(scope, id, props);
|
|
174
|
+
let layers = [];
|
|
175
|
+
if (props?.stackOptions?.layerOptions) {
|
|
176
|
+
if (!props.stackOptions?.layerOptions?.name || !props.stackOptions?.layerOptions?.version) {
|
|
177
|
+
throw new toolkit.CustomException("Invalid layer options provided");
|
|
178
|
+
}
|
|
179
|
+
const { existingLayer } = new BaseLambdaLayerConstruct(
|
|
180
|
+
this,
|
|
181
|
+
"layer",
|
|
182
|
+
{
|
|
183
|
+
options: {
|
|
184
|
+
fromExistingLayerArn: `arn:aws:lambda:${props.env?.region}:${props.env?.account}:layer:${props.stackOptions?.layerOptions?.name}:${props.stackOptions?.layerOptions?.version}`
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
);
|
|
188
|
+
layers.push(existingLayer);
|
|
189
|
+
}
|
|
190
|
+
const { function: lambdaFunction } = new BaseLambdaConstruct(this, "lambda", {
|
|
191
|
+
stage: props.stackOptions?.stage,
|
|
192
|
+
stackName: props.stackName,
|
|
193
|
+
options: {
|
|
194
|
+
lambdaOptions: { layers }
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
new BaseSnsConstruct(this, "sns", {
|
|
198
|
+
options: {
|
|
199
|
+
targetFunctions: [lambdaFunction],
|
|
200
|
+
topicOptions: {
|
|
201
|
+
...props?.stackOptions?.topicOptions,
|
|
202
|
+
topicName: props?.stackOptions?.topicOptions?.topicName || props.stackName
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
exports.BaseLambdaSnsStack = BaseLambdaSnsStack;
|
|
210
|
+
//# sourceMappingURL=lambda-sns.cjs.map
|
|
211
|
+
//# sourceMappingURL=lambda-sns.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/aws/cdk/constructs/lambda-construct.ts","../../../src/aws/cdk/constructs/lambda-layer-construct.ts","../../../src/aws/cdk/constructs/sns-construct.ts","../../../src/aws/cdk/stacks/lambda-sns-stack.ts"],"names":["Construct","detectDuplicateProperties","Function","Runtime","Duration","AppEnvironmentEnum","Architecture","Code","CfnOutput","LayerVersion","Topic","LambdaSubscription","RemovalPolicy","Stack","CustomException"],"mappings":"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","file":"lambda-sns.cjs","sourcesContent":["import { Construct } from 'constructs';\nimport { CfnOutput, Duration } from 'aws-cdk-lib';\nimport {\n\tArchitecture,\n\tCode,\n\tFunction,\n\tFunctionProps,\n\tRuntime,\n} from 'aws-cdk-lib/aws-lambda';\n\nimport {\n\tdetectDuplicateProperties,\n\tAppEnvironmentEnum,\n} from '@incloodsolutions/toolkit';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseLambdaConstruct\n *\n * Provides configuration for creating a Lambda function\n * with optional overrides for runtime, memory, timeout, and environment.\n */\ninterface ILambdaConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** Partial Lambda configuration options */\n\t\treadonly lambdaOptions: Partial<FunctionProps>;\n\t}>,\n\t'appName'\n> {}\n\n/**\n * CDK construct for AWS Lambda function\n *\n * Responsibilities:\n * - Creates a Lambda function with sensible defaults\n * - Merges and validates environment variables\n * - Applies stage-based configuration (e.g. timeout)\n * - Exposes the function ARN as a CloudFormation output\n */\nexport class BaseLambdaConstruct extends Construct {\n\t/** The created Lambda function instance */\n\treadonly function: Function;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for Lambda function\n\t */\n\tconstructor(scope: Construct, id: string, props: ILambdaConstructProps) {\n\t\tsuper(scope, id);\n\n\t\t/**\n\t\t * Environment variables for the Lambda function\n\t\t *\n\t\t * Includes:\n\t\t * - User-defined variables\n\t\t * - NODE_ENV derived from stage\n\t\t * - Node.js runtime optimisations\n\t\t */\n\t\tconst environment = {\n\t\t\t...props.options?.lambdaOptions?.environment,\n\t\t\tNODE_ENV: props.stage,\n\t\t\tNODE_OPTIONS: '--enable-source-maps',\n\t\t\tAWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',\n\t\t};\n\n\t\t/**\n\t\t * Validate environment variables for duplicate keys\n\t\t */\n\t\tdetectDuplicateProperties({ data: environment });\n\n\t\tthis.function = new Function(this, id, {\n\t\t\t...props?.options?.lambdaOptions,\n\n\t\t\t/**\n\t\t\t * Lambda function name\n\t\t\t * Defaults to \"<stackName>\" if not provided\n\t\t\t */\n\t\t\tfunctionName: `${props?.options?.lambdaOptions?.functionName || props?.stackName}`,\n\n\t\t\t/**\n\t\t\t * Function description\n\t\t\t */\n\t\t\tdescription:\n\t\t\t\tprops?.options?.lambdaOptions?.description || 'A lambda function',\n\n\t\t\t/**\n\t\t\t * Entry handler for the Lambda function\n\t\t\t */\n\t\t\thandler: props?.options?.lambdaOptions?.handler || 'lambda.handler',\n\n\t\t\t/**\n\t\t\t * Runtime environment\n\t\t\t */\n\t\t\truntime: props?.options?.lambdaOptions?.runtime || Runtime.NODEJS_24_X,\n\n\t\t\t/**\n\t\t\t * Execution timeout\n\t\t\t * - 30 seconds in production\n\t\t\t * - 15 seconds otherwise\n\t\t\t */\n\t\t\ttimeout:\n\t\t\t\tprops?.options?.lambdaOptions?.timeout ||\n\t\t\t\tDuration.seconds(\n\t\t\t\t\tprops.stage === AppEnvironmentEnum.PRODUCTION ? 30 : 15,\n\t\t\t\t),\n\n\t\t\t/**\n\t\t\t * Memory allocation (in MB)\n\t\t\t */\n\t\t\tmemorySize: props?.options?.lambdaOptions?.memorySize || 1024,\n\n\t\t\t/**\n\t\t\t * CPU architecture\n\t\t\t */\n\t\t\tarchitecture:\n\t\t\t\tprops?.options?.lambdaOptions?.architecture || Architecture.ARM_64,\n\n\t\t\t/**\n\t\t\t * Lambda deployment package source\n\t\t\t */\n\t\t\tcode: props?.options?.lambdaOptions?.code || Code.fromAsset('dist'),\n\n\t\t\t/**\n\t\t\t * Final merged environment variables\n\t\t\t */\n\t\t\tenvironment,\n\t\t});\n\n\t\t/**\n\t\t * CloudFormation output exposing the Lambda function ARN\n\t\t */\n\t\tnew CfnOutput(this, 'LambdaFunctionArn', {\n\t\t\tvalue: this.function.functionArn,\n\t\t});\n\t}\n}\n","import { Construct } from 'constructs';\nimport { CfnOutput } from 'aws-cdk-lib';\nimport {\n\tArchitecture,\n\tCode,\n\tILayerVersion,\n\tLayerVersion,\n\tLayerVersionProps,\n\tRuntime,\n} from 'aws-cdk-lib/aws-lambda';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseLambdaLayerConstruct\n *\n * Provides configuration for:\n * - Creating a new Lambda Layer\n * - Importing an existing layer by ARN or attributes\n */\ninterface ILambdaLayerConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/**\n\t\t * Configuration for creating a new Lambda layer\n\t\t *\n\t\t * Note:\n\t\t * - `layerVersionName` is required\n\t\t * - `compatibleArchitectures` is managed internally\n\t\t */\n\t\treadonly layerOptions?: Partial<\n\t\t\tOmit<LayerVersionProps, 'layerVersionName' | 'compatibleArchitectures'>\n\t\t> &\n\t\t\tRequired<Pick<LayerVersionProps, 'layerVersionName'>>;\n\n\t\t/** Import an existing layer by ARN */\n\t\treadonly fromExistingLayerArn?: string;\n\n\t\t/** Import an existing layer using attributes */\n\t\treadonly fromExistingLayerAttribute?: {\n\t\t\treadonly layerVersionArn: string;\n\t\t\treadonly compatibleRuntimes?: Runtime[];\n\t\t};\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {}\n\n/**\n * CDK construct for Lambda Layer\n *\n * Responsibilities:\n * - Creates a new Lambda layer or imports an existing one\n * - Applies default runtime and architecture compatibility\n * - Exposes the layer ARN as a CloudFormation output\n */\nexport class BaseLambdaLayerConstruct extends Construct {\n\t/** Newly created Lambda Layer (null if importing existing layer) */\n\treadonly layer: LayerVersion;\n\n\t/** Imported Lambda Layer reference (null if creating new layer) */\n\treadonly existingLayer: ILayerVersion;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for layer creation or import\n\t */\n\tconstructor(\n\t\tscope: Construct,\n\t\tid: string,\n\t\tprops?: ILambdaLayerConstructProps,\n\t) {\n\t\tsuper(scope, id);\n\n\t\t/**\n\t\t * Import layer by ARN\n\t\t */\n\t\tif (props?.options?.fromExistingLayerArn) {\n\t\t\tthis.existingLayer = LayerVersion.fromLayerVersionArn(\n\t\t\t\tthis,\n\t\t\t\t`${id}-Arn`,\n\t\t\t\tprops?.options?.fromExistingLayerArn,\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Import layer using attributes\n\t\t\t */\n\t\t} else if (props?.options?.fromExistingLayerAttribute) {\n\t\t\tthis.existingLayer = LayerVersion.fromLayerVersionAttributes(\n\t\t\t\tthis,\n\t\t\t\t`${id}-Attribute`,\n\t\t\t\tprops?.options?.fromExistingLayerAttribute,\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Create new Lambda layer\n\t\t\t */\n\t\t} else {\n\t\t\tthis.layer = new LayerVersion(this, id, {\n\t\t\t\t...props.options?.layerOptions,\n\n\t\t\t\t/**\n\t\t\t\t * Default layer code asset\n\t\t\t\t */\n\t\t\t\tcode:\n\t\t\t\t\tprops?.options?.layerOptions?.code || Code.fromAsset('./dist-layer'),\n\n\t\t\t\t/**\n\t\t\t\t * Layer description\n\t\t\t\t */\n\t\t\t\tdescription:\n\t\t\t\t\tprops?.options?.layerOptions?.description ||\n\t\t\t\t\t'Lambda Layer written in NodeJS, NestJS, NodeJS-express, serverless-express',\n\n\t\t\t\t/**\n\t\t\t\t * Supported CPU architectures\n\t\t\t\t */\n\t\t\t\tcompatibleArchitectures: [Architecture.ARM_64, Architecture.X86_64],\n\n\t\t\t\t/**\n\t\t\t\t * Supported runtimes\n\t\t\t\t */\n\t\t\t\tcompatibleRuntimes: [\n\t\t\t\t\tRuntime.NODEJS_22_X,\n\t\t\t\t\tRuntime.NODEJS_24_X,\n\t\t\t\t\tRuntime.NODEJS_LATEST,\n\t\t\t\t],\n\t\t\t} as LayerVersionProps);\n\t\t}\n\n\t\t/**\n\t\t * CloudFormation output exposing the layer ARN\n\t\t * Resolves to either created or imported layer\n\t\t */\n\t\tnew CfnOutput(this, 'LambdaLayerArn', {\n\t\t\tvalue:\n\t\t\t\tprops.options?.fromExistingLayerArn ||\n\t\t\t\tprops.options?.fromExistingLayerAttribute\n\t\t\t\t\t? this.existingLayer.layerVersionArn\n\t\t\t\t\t: this.layer.layerVersionArn,\n\t\t});\n\t}\n}\n","import { Construct } from 'constructs';\nimport { Function } from 'aws-cdk-lib/aws-lambda';\nimport { CfnOutput, RemovalPolicy } from 'aws-cdk-lib';\nimport { Topic, TopicProps } from 'aws-cdk-lib/aws-sns';\nimport { LambdaSubscription } from 'aws-cdk-lib/aws-sns-subscriptions';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseSnsConstruct\n *\n * Provides configuration for:\n * - SNS topic creation\n * - Lambda subscriptions\n */\ninterface ISnsConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** SNS topic configuration options */\n\t\treadonly topicOptions: TopicProps;\n\n\t\t/**\n\t\t * Lambda functions to subscribe to the topic\n\t\t *\n\t\t * Each function will receive messages published to the topic\n\t\t */\n\t\treadonly targetFunctions: Function[];\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {}\n\n/**\n * CDK construct for SNS topic with Lambda subscriptions\n *\n * Responsibilities:\n * - Creates an SNS topic with configurable options\n * - Subscribes one or more Lambda functions to the topic\n * - Applies a removal policy\n * - Exposes the topic ARN as a CloudFormation output\n */\nexport class BaseSnsConstruct extends Construct {\n\t/** The created SNS topic instance */\n\treadonly topic: Topic;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for topic and subscriptions\n\t */\n\tconstructor(scope: Construct, id: string, props: ISnsConstructProps) {\n\t\tsuper(scope, id);\n\n\t\tthis.topic = new Topic(this, id, props.options?.topicOptions);\n\n\t\t/**\n\t\t * Attach Lambda subscriptions to the topic\n\t\t */\n\t\tif (props.options?.targetFunctions?.length) {\n\t\t\tprops.options.targetFunctions.forEach((targetFunction) => {\n\t\t\t\tthis.topic.addSubscription(\n\t\t\t\t\t/**\n\t\t\t\t\t * Lambda subscription target\n\t\t\t\t\t */\n\t\t\t\t\tnew LambdaSubscription(targetFunction),\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Apply removal policy (useful for non-production environments)\n\t\t */\n\t\tthis.topic.applyRemovalPolicy(RemovalPolicy.DESTROY);\n\n\t\t/**\n\t\t * CloudFormation output exposing the topic ARN\n\t\t */\n\t\tnew CfnOutput(this, 'SnsTopicArn', {\n\t\t\tvalue: this.topic.topicArn,\n\t\t});\n\t}\n}\n","import { App, Stack } from \"aws-cdk-lib\";\n\nimport { IBaseStackProps } from \"../../types\";\nimport { BaseLambdaConstruct, BaseLambdaLayerConstruct, BaseSnsConstruct } from \"../constructs\";\nimport { CustomException } from \"@incloodsolutions/toolkit\";\nimport { ILayerVersion } from \"aws-cdk-lib/aws-lambda\";\nimport { TopicProps } from \"aws-cdk-lib/aws-sns\";\n\nexport class BaseLambdaSnsStack extends Stack {\n\tconstructor(scope: App, id: string, props: IBaseStackProps<{\n\t\tlayerOptions?: {\n\t\t\tname: string;\n\t\t\tversion: number;\n\t\t};\n\t\tlambdaOptions?: {};\n\t\ttopicOptions?: TopicProps;\n\t}>) {\n\t\tsuper(scope, id, props);\n\t\tlet layers: ILayerVersion[] = [];\n\n\t\tif (props?.stackOptions?.layerOptions) {\n\t\t\tif (!props.stackOptions?.layerOptions?.name || !props.stackOptions?.layerOptions?.version) {\n\t\t\t\tthrow new CustomException(\"Invalid layer options provided\");\n\t\t\t}\n\t\t\tconst { existingLayer } = new BaseLambdaLayerConstruct(\n\t\t\t\tthis,\n\t\t\t\t'layer',\n\t\t\t\t{\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tfromExistingLayerArn: `arn:aws:lambda:${props.env?.region}:${props.env?.account}:layer:${props.stackOptions?.layerOptions?.name}:${props.stackOptions?.layerOptions?.version}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tlayers.push(existingLayer);\n\t\t}\n\n\t\tconst { function: lambdaFunction } = new BaseLambdaConstruct(this, 'lambda', {\n\t\t\tstage: props.stackOptions?.stage,\n\t\t\tstackName: props.stackName,\n\t\t\toptions: {\n\t\t\t\tlambdaOptions: { layers },\n\t\t\t},\n\t\t});\n\n\t\tnew BaseSnsConstruct(this, 'sns', {\n\t\t\toptions: {\n\t\t\t\ttargetFunctions: [lambdaFunction],\n\t\t\t\ttopicOptions: {\n\t\t\t\t\t...props?.stackOptions?.topicOptions,\n\t\t\t\t\ttopicName: props?.stackOptions?.topicOptions?.topicName || props.stackName,\n\t\t\t\t},\n\t\t\t}\n\t\t});\n\n\t}\n}"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Stack, App } from 'aws-cdk-lib';
|
|
2
|
+
import { IBaseStackProps } from '../../aws-types.cjs';
|
|
3
|
+
import { TopicProps } from 'aws-cdk-lib/aws-sns';
|
|
4
|
+
import '@incloodsolutions/toolkit';
|
|
5
|
+
|
|
6
|
+
declare class BaseLambdaSnsStack extends Stack {
|
|
7
|
+
constructor(scope: App, id: string, props: IBaseStackProps<{
|
|
8
|
+
layerOptions?: {
|
|
9
|
+
name: string;
|
|
10
|
+
version: number;
|
|
11
|
+
};
|
|
12
|
+
lambdaOptions?: {};
|
|
13
|
+
topicOptions?: TopicProps;
|
|
14
|
+
}>);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { BaseLambdaSnsStack };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Stack, App } from 'aws-cdk-lib';
|
|
2
|
+
import { IBaseStackProps } from '../../aws-types.js';
|
|
3
|
+
import { TopicProps } from 'aws-cdk-lib/aws-sns';
|
|
4
|
+
import '@incloodsolutions/toolkit';
|
|
5
|
+
|
|
6
|
+
declare class BaseLambdaSnsStack extends Stack {
|
|
7
|
+
constructor(scope: App, id: string, props: IBaseStackProps<{
|
|
8
|
+
layerOptions?: {
|
|
9
|
+
name: string;
|
|
10
|
+
version: number;
|
|
11
|
+
};
|
|
12
|
+
lambdaOptions?: {};
|
|
13
|
+
topicOptions?: TopicProps;
|
|
14
|
+
}>);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { BaseLambdaSnsStack };
|