@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 +7 -0
- package/README.md +48 -0
- package/index.d.ts +3 -0
- package/index.js +8 -0
- package/lib/defaults/microservice-checks/microservice-checks.d.ts +17 -0
- package/lib/defaults/microservice-checks/microservice-checks.js +56 -0
- package/lib/defaults/version-functions/version-functions.d.ts +43 -0
- package/lib/defaults/version-functions/version-functions.js +67 -0
- package/package.json +28 -0
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
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
|
+
}
|