@aligent/cdk-aspects 0.2.0

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/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @aligent/cdk-aspects
2
+
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1573](https://github.com/aligent/cdk-constructs/pull/1573) [`9c26514`](https://github.com/aligent/cdk-constructs/commit/9c26514be321e73b4217aa4a040ac4a91f9b1503) Thanks [@ryanrixxh](https://github.com/ryanrixxh)! - Restucture of the internal codebase and addition of CDK Aspects package. The Aspects package exports a number of usable cdk aspects
package/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # Aligent CDK Aspects
2
+
3
+ This package provides a collection of CDK aspects that can be applied to your AWS CDK stacks to enforce best practices and automate common configurations.
4
+
5
+ ## Defaults
6
+
7
+ ### Microservice Checks
8
+
9
+ A set of rules that validate your infrastructure against recommended practices using the cdk-nag library.
10
+
11
+ #### Features
12
+
13
+ - Validates Lambda function memory configuration
14
+ - Validates Lambda function timeout configuration
15
+ - Validates Lambda function tracing configuration
16
+ - Validates CloudWatch Log Group retention policy
17
+
18
+ #### Usage
19
+
20
+ ```typescript
21
+ import { Aspects } from "aws-cdk-lib";
22
+ import { MicroserviceChecks } from "@aligent/cdk-aspects";
23
+
24
+ const app = new App();
25
+ const stack = new Stack(app, "MyStack");
26
+
27
+ Aspects.of(stack).add(new MicroserviceChecks());
28
+ ```
29
+
30
+ ### Version Functions
31
+
32
+ An aspect that automatically adds versioning and aliases to Lambda functions and Step Functions.
33
+
34
+ #### Features
35
+
36
+ - Automatically creates function aliases for Lambda functions
37
+ - Creates versions and aliases for Step Functions with 100% traffic routing
38
+ - Supports custom alias names
39
+
40
+ #### Usage
41
+
42
+ ```typescript
43
+ import { Aspects } from "aws-cdk-lib";
44
+ import { VersionFunctionsAspect } from "@aligent/cdk-aspects";
45
+
46
+ const app = new App();
47
+ Aspects.of(app).add(new VersionFunctionsAspect({ alias: "PROD" }));
48
+ ```
package/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { MicroserviceChecks } from "./lib/defaults/microservice-checks/microservice-checks";
2
+ import { VersionFunctionsAspect } from "./lib/defaults/version-functions/version-functions";
3
+ export { MicroserviceChecks, VersionFunctionsAspect };
package/index.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VersionFunctionsAspect = exports.MicroserviceChecks = void 0;
4
+ const microservice_checks_1 = require("./lib/defaults/microservice-checks/microservice-checks");
5
+ Object.defineProperty(exports, "MicroserviceChecks", { enumerable: true, get: function () { return microservice_checks_1.MicroserviceChecks; } });
6
+ const version_functions_1 = require("./lib/defaults/version-functions/version-functions");
7
+ Object.defineProperty(exports, "VersionFunctionsAspect", { enumerable: true, get: function () { return version_functions_1.VersionFunctionsAspect; } });
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnR0FBNEY7QUFHbkYsbUdBSEEsd0NBQWtCLE9BR0E7QUFGM0IsMEZBQTRGO0FBRS9ELHVHQUZwQiwwQ0FBc0IsT0FFb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNaWNyb3NlcnZpY2VDaGVja3MgfSBmcm9tIFwiLi9saWIvZGVmYXVsdHMvbWljcm9zZXJ2aWNlLWNoZWNrcy9taWNyb3NlcnZpY2UtY2hlY2tzXCI7XG5pbXBvcnQgeyBWZXJzaW9uRnVuY3Rpb25zQXNwZWN0IH0gZnJvbSBcIi4vbGliL2RlZmF1bHRzL3ZlcnNpb24tZnVuY3Rpb25zL3ZlcnNpb24tZnVuY3Rpb25zXCI7XG5cbmV4cG9ydCB7IE1pY3Jvc2VydmljZUNoZWNrcywgVmVyc2lvbkZ1bmN0aW9uc0FzcGVjdCB9O1xuIl19
@@ -0,0 +1,17 @@
1
+ import { NagPack, type NagPackProps } from "cdk-nag";
2
+ import type { IConstruct } from "constructs";
3
+ /**
4
+ * Microservice Checks are a compilation of rules to validate infrastructure-as-code template
5
+ * against recommended practices using the cdk-nag library.
6
+ *
7
+ * @see https://github.com/cdk-patterns/cdk-nag/
8
+ *
9
+ * @example
10
+ * const app = new App();
11
+ * const stack = new Stack(app, 'MyStack');
12
+ * Aspects.of(stack).add(new MicroservicesChecks());
13
+ */
14
+ export declare class MicroserviceChecks extends NagPack {
15
+ constructor(props?: NagPackProps);
16
+ visit(node: IConstruct): void;
17
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MicroserviceChecks = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const cdk_nag_1 = require("cdk-nag");
6
+ /**
7
+ * Microservice Checks are a compilation of rules to validate infrastructure-as-code template
8
+ * against recommended practices using the cdk-nag library.
9
+ *
10
+ * @see https://github.com/cdk-patterns/cdk-nag/
11
+ *
12
+ * @example
13
+ * const app = new App();
14
+ * const stack = new Stack(app, 'MyStack');
15
+ * Aspects.of(stack).add(new MicroservicesChecks());
16
+ */
17
+ class MicroserviceChecks extends cdk_nag_1.NagPack {
18
+ constructor(props) {
19
+ super(props);
20
+ this.packName = "Microservices";
21
+ }
22
+ visit(node) {
23
+ if (node instanceof aws_cdk_lib_1.CfnResource) {
24
+ this.applyRule({
25
+ info: "The Lambda function does not have an explicit memory value configured.",
26
+ explanation: "Lambda allocates CPU power in proportion to the amount of memory configured. By default, your functions have 128 MB of memory allocated. You can increase that value up to 10 GB. With more CPU resources, your Lambda function's duration might decrease. You can use tools such as AWS Lambda Power Tuning to test your function at different memory settings to find the one that matches your cost and performance requirements the best.",
27
+ level: cdk_nag_1.NagMessageLevel.ERROR,
28
+ rule: cdk_nag_1.rules.lambda.LambdaDefaultMemorySize,
29
+ node: node,
30
+ });
31
+ this.applyRule({
32
+ info: "The Lambda function does not have an explicitly defined timeout value.",
33
+ explanation: "Lambda functions have a default timeout of 3 seconds. If your timeout value is too short, Lambda might terminate invocations prematurely. On the other side, setting the timeout much higher than the average execution may cause functions to execute for longer upon code malfunction, resulting in higher costs and possibly reaching concurrency limits depending on how such functions are invoked. You can also use AWS Lambda Power Tuning to test your function at different timeout settings to find the one that matches your cost and performance requirements the best.",
34
+ level: cdk_nag_1.NagMessageLevel.ERROR,
35
+ rule: cdk_nag_1.rules.lambda.LambdaDefaultTimeout,
36
+ node: node,
37
+ });
38
+ this.applyRule({
39
+ info: "The Lambda function does not have tracing set to Tracing.ACTIVE.",
40
+ explanation: "When a Lambda function has ACTIVE tracing, Lambda automatically samples invocation requests, based on the sampling algorithm specified by X-Ray.",
41
+ level: cdk_nag_1.NagMessageLevel.ERROR,
42
+ rule: cdk_nag_1.rules.lambda.LambdaTracing,
43
+ node: node,
44
+ });
45
+ this.applyRule({
46
+ info: "The CloudWatch Log Group does not have an explicit retention policy defined.",
47
+ explanation: "By default, logs are kept indefinitely and never expire. You can adjust the retention policy for each log group, keeping the indefinite retention, or choosing a retention period between one day and 10 years. For Lambda functions, this applies to their automatically created CloudWatch Log Groups.",
48
+ level: cdk_nag_1.NagMessageLevel.ERROR,
49
+ rule: cdk_nag_1.rules.cloudwatch.CloudWatchLogGroupRetentionPeriod,
50
+ node: node,
51
+ });
52
+ }
53
+ }
54
+ }
55
+ exports.MicroserviceChecks = MicroserviceChecks;
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zZXJ2aWNlLWNoZWNrcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1pY3Jvc2VydmljZS1jaGVja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTBDO0FBQzFDLHFDQUE2RTtBQUc3RTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxpQkFBTztJQUM3QyxZQUFZLEtBQW9CO1FBQzlCLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBZ0I7UUFDM0IsSUFBSSxJQUFJLFlBQVkseUJBQVcsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2IsSUFBSSxFQUFFLHdFQUF3RTtnQkFDOUUsV0FBVyxFQUNULGdiQUFnYjtnQkFDbGIsS0FBSyxFQUFFLHlCQUFlLENBQUMsS0FBSztnQkFDNUIsSUFBSSxFQUFFLGVBQUssQ0FBQyxNQUFNLENBQUMsdUJBQXVCO2dCQUMxQyxJQUFJLEVBQUUsSUFBSTthQUNYLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2IsSUFBSSxFQUFFLHdFQUF3RTtnQkFDOUUsV0FBVyxFQUNULHFqQkFBcWpCO2dCQUN2akIsS0FBSyxFQUFFLHlCQUFlLENBQUMsS0FBSztnQkFDNUIsSUFBSSxFQUFFLGVBQUssQ0FBQyxNQUFNLENBQUMsb0JBQW9CO2dCQUN2QyxJQUFJLEVBQUUsSUFBSTthQUNYLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2IsSUFBSSxFQUFFLGtFQUFrRTtnQkFDeEUsV0FBVyxFQUNULGtKQUFrSjtnQkFDcEosS0FBSyxFQUFFLHlCQUFlLENBQUMsS0FBSztnQkFDNUIsSUFBSSxFQUFFLGVBQUssQ0FBQyxNQUFNLENBQUMsYUFBYTtnQkFDaEMsSUFBSSxFQUFFLElBQUk7YUFDWCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNiLElBQUksRUFBRSw4RUFBOEU7Z0JBQ3BGLFdBQVcsRUFDVCwwU0FBMFM7Z0JBQzVTLEtBQUssRUFBRSx5QkFBZSxDQUFDLEtBQUs7Z0JBQzVCLElBQUksRUFBRSxlQUFLLENBQUMsVUFBVSxDQUFDLGlDQUFpQztnQkFDeEQsSUFBSSxFQUFFLElBQUk7YUFDWCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBMUNELGdEQTBDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmblJlc291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBOYWdNZXNzYWdlTGV2ZWwsIE5hZ1BhY2ssIHJ1bGVzLCB0eXBlIE5hZ1BhY2tQcm9wcyB9IGZyb20gXCJjZGstbmFnXCI7XG5pbXBvcnQgdHlwZSB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG4vKipcbiAqIE1pY3Jvc2VydmljZSBDaGVja3MgYXJlIGEgY29tcGlsYXRpb24gb2YgcnVsZXMgdG8gdmFsaWRhdGUgaW5mcmFzdHJ1Y3R1cmUtYXMtY29kZSB0ZW1wbGF0ZVxuICogYWdhaW5zdCByZWNvbW1lbmRlZCBwcmFjdGljZXMgdXNpbmcgdGhlIGNkay1uYWcgbGlicmFyeS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jZGstcGF0dGVybnMvY2RrLW5hZy9cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuICogY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnTXlTdGFjaycpO1xuICogQXNwZWN0cy5vZihzdGFjaykuYWRkKG5ldyBNaWNyb3NlcnZpY2VzQ2hlY2tzKCkpO1xuICovXG5leHBvcnQgY2xhc3MgTWljcm9zZXJ2aWNlQ2hlY2tzIGV4dGVuZHMgTmFnUGFjayB7XG4gIGNvbnN0cnVjdG9yKHByb3BzPzogTmFnUGFja1Byb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMucGFja05hbWUgPSBcIk1pY3Jvc2VydmljZXNcIjtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdChub2RlOiBJQ29uc3RydWN0KSB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDZm5SZXNvdXJjZSkge1xuICAgICAgdGhpcy5hcHBseVJ1bGUoe1xuICAgICAgICBpbmZvOiBcIlRoZSBMYW1iZGEgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhbiBleHBsaWNpdCBtZW1vcnkgdmFsdWUgY29uZmlndXJlZC5cIixcbiAgICAgICAgZXhwbGFuYXRpb246XG4gICAgICAgICAgXCJMYW1iZGEgYWxsb2NhdGVzIENQVSBwb3dlciBpbiBwcm9wb3J0aW9uIHRvIHRoZSBhbW91bnQgb2YgbWVtb3J5IGNvbmZpZ3VyZWQuIEJ5IGRlZmF1bHQsIHlvdXIgZnVuY3Rpb25zIGhhdmUgMTI4IE1CIG9mIG1lbW9yeSBhbGxvY2F0ZWQuIFlvdSBjYW4gaW5jcmVhc2UgdGhhdCB2YWx1ZSB1cCB0byAxMCBHQi4gV2l0aCBtb3JlIENQVSByZXNvdXJjZXMsIHlvdXIgTGFtYmRhIGZ1bmN0aW9uJ3MgZHVyYXRpb24gbWlnaHQgZGVjcmVhc2UuICBZb3UgY2FuIHVzZSB0b29scyBzdWNoIGFzIEFXUyBMYW1iZGEgUG93ZXIgVHVuaW5nIHRvIHRlc3QgeW91ciBmdW5jdGlvbiBhdCBkaWZmZXJlbnQgbWVtb3J5IHNldHRpbmdzIHRvIGZpbmQgdGhlIG9uZSB0aGF0IG1hdGNoZXMgeW91ciBjb3N0IGFuZCBwZXJmb3JtYW5jZSByZXF1aXJlbWVudHMgdGhlIGJlc3QuXCIsXG4gICAgICAgIGxldmVsOiBOYWdNZXNzYWdlTGV2ZWwuRVJST1IsXG4gICAgICAgIHJ1bGU6IHJ1bGVzLmxhbWJkYS5MYW1iZGFEZWZhdWx0TWVtb3J5U2l6ZSxcbiAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hcHBseVJ1bGUoe1xuICAgICAgICBpbmZvOiBcIlRoZSBMYW1iZGEgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhbiBleHBsaWNpdGx5IGRlZmluZWQgdGltZW91dCB2YWx1ZS5cIixcbiAgICAgICAgZXhwbGFuYXRpb246XG4gICAgICAgICAgXCJMYW1iZGEgZnVuY3Rpb25zIGhhdmUgYSBkZWZhdWx0IHRpbWVvdXQgb2YgMyBzZWNvbmRzLiBJZiB5b3VyIHRpbWVvdXQgdmFsdWUgaXMgdG9vIHNob3J0LCBMYW1iZGEgbWlnaHQgdGVybWluYXRlIGludm9jYXRpb25zIHByZW1hdHVyZWx5LiBPbiB0aGUgb3RoZXIgc2lkZSwgc2V0dGluZyB0aGUgdGltZW91dCBtdWNoIGhpZ2hlciB0aGFuIHRoZSBhdmVyYWdlIGV4ZWN1dGlvbiBtYXkgY2F1c2UgZnVuY3Rpb25zIHRvIGV4ZWN1dGUgZm9yIGxvbmdlciB1cG9uIGNvZGUgbWFsZnVuY3Rpb24sIHJlc3VsdGluZyBpbiBoaWdoZXIgY29zdHMgYW5kIHBvc3NpYmx5IHJlYWNoaW5nIGNvbmN1cnJlbmN5IGxpbWl0cyBkZXBlbmRpbmcgb24gaG93IHN1Y2ggZnVuY3Rpb25zIGFyZSBpbnZva2VkLiBZb3UgY2FuIGFsc28gdXNlIEFXUyBMYW1iZGEgUG93ZXIgVHVuaW5nIHRvIHRlc3QgeW91ciBmdW5jdGlvbiBhdCBkaWZmZXJlbnQgdGltZW91dCBzZXR0aW5ncyB0byBmaW5kIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHlvdXIgY29zdCBhbmQgcGVyZm9ybWFuY2UgcmVxdWlyZW1lbnRzIHRoZSBiZXN0LlwiLFxuICAgICAgICBsZXZlbDogTmFnTWVzc2FnZUxldmVsLkVSUk9SLFxuICAgICAgICBydWxlOiBydWxlcy5sYW1iZGEuTGFtYmRhRGVmYXVsdFRpbWVvdXQsXG4gICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwbHlSdWxlKHtcbiAgICAgICAgaW5mbzogXCJUaGUgTGFtYmRhIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdHJhY2luZyBzZXQgdG8gVHJhY2luZy5BQ1RJVkUuXCIsXG4gICAgICAgIGV4cGxhbmF0aW9uOlxuICAgICAgICAgIFwiV2hlbiBhIExhbWJkYSBmdW5jdGlvbiBoYXMgQUNUSVZFIHRyYWNpbmcsIExhbWJkYSBhdXRvbWF0aWNhbGx5IHNhbXBsZXMgaW52b2NhdGlvbiByZXF1ZXN0cywgYmFzZWQgb24gdGhlIHNhbXBsaW5nIGFsZ29yaXRobSBzcGVjaWZpZWQgYnkgWC1SYXkuXCIsXG4gICAgICAgIGxldmVsOiBOYWdNZXNzYWdlTGV2ZWwuRVJST1IsXG4gICAgICAgIHJ1bGU6IHJ1bGVzLmxhbWJkYS5MYW1iZGFUcmFjaW5nLFxuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmFwcGx5UnVsZSh7XG4gICAgICAgIGluZm86IFwiVGhlIENsb3VkV2F0Y2ggTG9nIEdyb3VwIGRvZXMgbm90IGhhdmUgYW4gZXhwbGljaXQgcmV0ZW50aW9uIHBvbGljeSBkZWZpbmVkLlwiLFxuICAgICAgICBleHBsYW5hdGlvbjpcbiAgICAgICAgICBcIkJ5IGRlZmF1bHQsIGxvZ3MgYXJlIGtlcHQgaW5kZWZpbml0ZWx5IGFuZCBuZXZlciBleHBpcmUuIFlvdSBjYW4gYWRqdXN0IHRoZSByZXRlbnRpb24gcG9saWN5IGZvciBlYWNoIGxvZyBncm91cCwga2VlcGluZyB0aGUgaW5kZWZpbml0ZSByZXRlbnRpb24sIG9yIGNob29zaW5nIGEgcmV0ZW50aW9uIHBlcmlvZCBiZXR3ZWVuIG9uZSBkYXkgYW5kIDEwIHllYXJzLiBGb3IgTGFtYmRhIGZ1bmN0aW9ucywgdGhpcyBhcHBsaWVzIHRvIHRoZWlyIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBDbG91ZFdhdGNoIExvZyBHcm91cHMuXCIsXG4gICAgICAgIGxldmVsOiBOYWdNZXNzYWdlTGV2ZWwuRVJST1IsXG4gICAgICAgIHJ1bGU6IHJ1bGVzLmNsb3Vkd2F0Y2guQ2xvdWRXYXRjaExvZ0dyb3VwUmV0ZW50aW9uUGVyaW9kLFxuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,43 @@
1
+ import type { IAspect } from "aws-cdk-lib";
2
+ import { IConstruct } from "constructs";
3
+ /**
4
+ * Aspect that automatically adds versioning and aliases to Lambda and Step Functions
5
+ *
6
+ * Visits all constructs in the scope and automatically creates versions and aliases
7
+ * for supported resource types. This enables blue-green deployments, traffic shifting,
8
+ * and provides stable ARNs for external integrations.
9
+ *
10
+ * Currently supports:
11
+ * - Lambda Functions: Creates function aliases
12
+ * - Step Functions: Creates versions and aliases with 100% traffic routing
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * // Apply to entire app for automatic versioning
17
+ * Aspects.of(app).add(new VersionFunctionsAspect());
18
+ *
19
+ * // Or with custom alias name
20
+ * Aspects.of(app).add(new VersionFunctionsAspect({ alias: 'PROD' }));
21
+ * ```
22
+ */
23
+ export declare class VersionFunctionsAspect implements IAspect {
24
+ private readonly props;
25
+ /**
26
+ * Creates a new VersionFunctionsAspect
27
+ *
28
+ * @param props - Configuration for the aspect
29
+ * @param props.alias - Name for the alias to create. Defaults to 'LATEST'
30
+ */
31
+ constructor(props?: {
32
+ alias: string;
33
+ });
34
+ /**
35
+ * Visits a construct and applies versioning if it's a supported resource type
36
+ *
37
+ * For Lambda Functions: Adds a function alias pointing to $LATEST
38
+ * For Step Functions: Creates a version and alias with 100% traffic routing
39
+ *
40
+ * @param node - The construct to potentially add versioning to
41
+ */
42
+ visit(node: IConstruct): void;
43
+ }
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VersionFunctionsAspect = void 0;
4
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
5
+ const aws_stepfunctions_1 = require("aws-cdk-lib/aws-stepfunctions");
6
+ /**
7
+ * Aspect that automatically adds versioning and aliases to Lambda and Step Functions
8
+ *
9
+ * Visits all constructs in the scope and automatically creates versions and aliases
10
+ * for supported resource types. This enables blue-green deployments, traffic shifting,
11
+ * and provides stable ARNs for external integrations.
12
+ *
13
+ * Currently supports:
14
+ * - Lambda Functions: Creates function aliases
15
+ * - Step Functions: Creates versions and aliases with 100% traffic routing
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * // Apply to entire app for automatic versioning
20
+ * Aspects.of(app).add(new VersionFunctionsAspect());
21
+ *
22
+ * // Or with custom alias name
23
+ * Aspects.of(app).add(new VersionFunctionsAspect({ alias: 'PROD' }));
24
+ * ```
25
+ */
26
+ class VersionFunctionsAspect {
27
+ /**
28
+ * Creates a new VersionFunctionsAspect
29
+ *
30
+ * @param props - Configuration for the aspect
31
+ * @param props.alias - Name for the alias to create. Defaults to 'LATEST'
32
+ */
33
+ constructor(props = {
34
+ alias: "LATEST",
35
+ }) {
36
+ this.props = props;
37
+ }
38
+ /**
39
+ * Visits a construct and applies versioning if it's a supported resource type
40
+ *
41
+ * For Lambda Functions: Adds a function alias pointing to $LATEST
42
+ * For Step Functions: Creates a version and alias with 100% traffic routing
43
+ *
44
+ * @param node - The construct to potentially add versioning to
45
+ */
46
+ visit(node) {
47
+ if (node instanceof aws_stepfunctions_1.StateMachine) {
48
+ const version = new aws_stepfunctions_1.CfnStateMachineVersion(node, `Version`, {
49
+ stateMachineArn: node.stateMachineArn,
50
+ });
51
+ new aws_stepfunctions_1.CfnStateMachineAlias(node, `Alias`, {
52
+ name: this.props.alias,
53
+ routingConfiguration: [
54
+ {
55
+ stateMachineVersionArn: version.attrArn,
56
+ weight: 100,
57
+ },
58
+ ],
59
+ });
60
+ }
61
+ if (node instanceof aws_lambda_1.Function) {
62
+ node.addAlias(this.props.alias);
63
+ }
64
+ }
65
+ }
66
+ exports.VersionFunctionsAspect = VersionFunctionsAspect;
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZXJzaW9uLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx1REFBa0Q7QUFDbEQscUVBSXVDO0FBR3ZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBYSxzQkFBc0I7SUFDakM7Ozs7O09BS0c7SUFDSCxZQUNtQixRQUViO1FBQ0YsS0FBSyxFQUFFLFFBQVE7S0FDaEI7UUFKZ0IsVUFBSyxHQUFMLEtBQUssQ0FJckI7SUFDQSxDQUFDO0lBRUo7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxJQUFnQjtRQUNwQixJQUFJLElBQUksWUFBWSxnQ0FBWSxFQUFFLENBQUM7WUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSwwQ0FBc0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO2dCQUMxRCxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7YUFDdEMsQ0FBQyxDQUFDO1lBRUgsSUFBSSx3Q0FBb0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO2dCQUN0QyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLO2dCQUN0QixvQkFBb0IsRUFBRTtvQkFDcEI7d0JBQ0Usc0JBQXNCLEVBQUUsT0FBTyxDQUFDLE9BQU87d0JBQ3ZDLE1BQU0sRUFBRSxHQUFHO3FCQUNaO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksSUFBSSxZQUFZLHFCQUFRLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTVDRCx3REE0Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IElBc3BlY3QgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEZ1bmN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7XG4gIENmblN0YXRlTWFjaGluZUFsaWFzLFxuICBDZm5TdGF0ZU1hY2hpbmVWZXJzaW9uLFxuICBTdGF0ZU1hY2hpbmUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9uc1wiO1xuaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbi8qKlxuICogQXNwZWN0IHRoYXQgYXV0b21hdGljYWxseSBhZGRzIHZlcnNpb25pbmcgYW5kIGFsaWFzZXMgdG8gTGFtYmRhIGFuZCBTdGVwIEZ1bmN0aW9uc1xuICpcbiAqIFZpc2l0cyBhbGwgY29uc3RydWN0cyBpbiB0aGUgc2NvcGUgYW5kIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyB2ZXJzaW9ucyBhbmQgYWxpYXNlc1xuICogZm9yIHN1cHBvcnRlZCByZXNvdXJjZSB0eXBlcy4gVGhpcyBlbmFibGVzIGJsdWUtZ3JlZW4gZGVwbG95bWVudHMsIHRyYWZmaWMgc2hpZnRpbmcsXG4gKiBhbmQgcHJvdmlkZXMgc3RhYmxlIEFSTnMgZm9yIGV4dGVybmFsIGludGVncmF0aW9ucy5cbiAqXG4gKiBDdXJyZW50bHkgc3VwcG9ydHM6XG4gKiAtIExhbWJkYSBGdW5jdGlvbnM6IENyZWF0ZXMgZnVuY3Rpb24gYWxpYXNlc1xuICogLSBTdGVwIEZ1bmN0aW9uczogQ3JlYXRlcyB2ZXJzaW9ucyBhbmQgYWxpYXNlcyB3aXRoIDEwMCUgdHJhZmZpYyByb3V0aW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEFwcGx5IHRvIGVudGlyZSBhcHAgZm9yIGF1dG9tYXRpYyB2ZXJzaW9uaW5nXG4gKiBBc3BlY3RzLm9mKGFwcCkuYWRkKG5ldyBWZXJzaW9uRnVuY3Rpb25zQXNwZWN0KCkpO1xuICpcbiAqIC8vIE9yIHdpdGggY3VzdG9tIGFsaWFzIG5hbWVcbiAqIEFzcGVjdHMub2YoYXBwKS5hZGQobmV3IFZlcnNpb25GdW5jdGlvbnNBc3BlY3QoeyBhbGlhczogJ1BST0QnIH0pKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVmVyc2lvbkZ1bmN0aW9uc0FzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBWZXJzaW9uRnVuY3Rpb25zQXNwZWN0XG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBhc3BlY3RcbiAgICogQHBhcmFtIHByb3BzLmFsaWFzIC0gTmFtZSBmb3IgdGhlIGFsaWFzIHRvIGNyZWF0ZS4gRGVmYXVsdHMgdG8gJ0xBVEVTVCdcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IHtcbiAgICAgIGFsaWFzOiBzdHJpbmc7XG4gICAgfSA9IHtcbiAgICAgIGFsaWFzOiBcIkxBVEVTVFwiLFxuICAgIH1cbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBWaXNpdHMgYSBjb25zdHJ1Y3QgYW5kIGFwcGxpZXMgdmVyc2lvbmluZyBpZiBpdCdzIGEgc3VwcG9ydGVkIHJlc291cmNlIHR5cGVcbiAgICpcbiAgICogRm9yIExhbWJkYSBGdW5jdGlvbnM6IEFkZHMgYSBmdW5jdGlvbiBhbGlhcyBwb2ludGluZyB0byAkTEFURVNUXG4gICAqIEZvciBTdGVwIEZ1bmN0aW9uczogQ3JlYXRlcyBhIHZlcnNpb24gYW5kIGFsaWFzIHdpdGggMTAwJSB0cmFmZmljIHJvdXRpbmdcbiAgICpcbiAgICogQHBhcmFtIG5vZGUgLSBUaGUgY29uc3RydWN0IHRvIHBvdGVudGlhbGx5IGFkZCB2ZXJzaW9uaW5nIHRvXG4gICAqL1xuICB2aXNpdChub2RlOiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTdGF0ZU1hY2hpbmUpIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBuZXcgQ2ZuU3RhdGVNYWNoaW5lVmVyc2lvbihub2RlLCBgVmVyc2lvbmAsIHtcbiAgICAgICAgc3RhdGVNYWNoaW5lQXJuOiBub2RlLnN0YXRlTWFjaGluZUFybixcbiAgICAgIH0pO1xuXG4gICAgICBuZXcgQ2ZuU3RhdGVNYWNoaW5lQWxpYXMobm9kZSwgYEFsaWFzYCwge1xuICAgICAgICBuYW1lOiB0aGlzLnByb3BzLmFsaWFzLFxuICAgICAgICByb3V0aW5nQ29uZmlndXJhdGlvbjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXRlTWFjaGluZVZlcnNpb25Bcm46IHZlcnNpb24uYXR0ckFybixcbiAgICAgICAgICAgIHdlaWdodDogMTAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICBub2RlLmFkZEFsaWFzKHRoaXMucHJvcHMuYWxpYXMpO1xuICAgIH1cbiAgfVxufVxuIl19
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@aligent/cdk-aspects",
3
+ "version": "0.2.0",
4
+ "description": "Collection of CDK Asppects",
5
+ "main": "index.js",
6
+ "types": "index.d.ts",
7
+ "license": "MIT",
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "test": "npx nx test cdk-aspects",
11
+ "lint": "npx nx lint cdk-aspects"
12
+ },
13
+ "devDependencies": {
14
+ "@types/jest": "^29.5.10",
15
+ "@types/node": "^20.6.3",
16
+ "aws-cdk": "^2.1019.1",
17
+ "jest": "^29.7.0",
18
+ "ts-jest": "^29.1.1",
19
+ "ts-node": "^10.9.1",
20
+ "typescript": "^5.3.2"
21
+ },
22
+ "dependencies": {
23
+ "aws-cdk-lib": "^2.201.0",
24
+ "constructs": "^10.3.0",
25
+ "esbuild": "^0.18.0",
26
+ "source-map-support": "^0.5.21"
27
+ }
28
+ }