@genie-solutions/gdk
v1.0.1
Published
Common AWS CDK constructs for Genie
Downloads
648
Readme
GDK - Genie Constructs Library for AWS CDK
Set of reusable constructs for deploying AWS resources to Gentu and Platform.
Installing
Installing this library into your project
$ npm i @genie-solutions/gdk
Dependencies
IMPORTANT:
Major version 1.0.0 is built using version 2.0.0 of the AWS CDK. If you are using this library fresh, please use version 1.0.0 of the library and version 2.0.0+ of the AWS CDK. Legacy instructions remain below for supporting version 0.40.0.
LEGACY SUPPORT ONLY
This library is built using using version 1.151.0 of the AWS CDK. To ensure that you are able to use cdk and this library, please pin your cdk version.
$ npm i -g [email protected]
Again also if you are using native CDK packages in your project, please ensure that you are using the same version. Example: S3 package...
$ npm install @aws-cdk/[email protected]
Structure
Modules
The GDK Library is organized into several modules but are packaged up into a single asset. The structure of the project is as follows:
- src/xxx: where xxx represents the service component of an AWS CDK package name. Example: src/ecs will contain constructs that are extensions of aws-ecs constructs.
- src/base-infra: this contains base infrastructure constructs that are imports of native CloudFormation templates.
Module Contents
Modules contain the following types:
- Constructs - All higher-level constructs in this library.
- Other Types - All non-construct classes, interfaces, structs and enums that exist to support the constructs.
Module Tests
The tests for the library should follow the same structure as the src folder.
How to publish a new version
After your branch has been merged into master:
- Push your feature onto master
- Tag your commit, like so:
git tag -a v<major>.<minor>.<patch> -m "<major>.<minor>.<patch>"
-- eg.git tag -a v0.31.14 -m "0.31.14"
(comment here is very important) - Push tag to master
git push --tags origin master
Gitlab pipeline will publish new version.
Useful commands
npm run build
compile typescript to jsnpm run watch
watch for changes and compilenpm run test
perform the jest unit tests
Examples
Prerequisites
These variables are used to namespace all resources, generate stack names, tags and to ensure that the correct base infrastructure is targeted. They form the base of a GenieStack type.
❗ Required variables include:
- executionEnvironment
- featureEnvironment
- application
- service
- version
You can read more about environment strategy on the wiki.
Example 1
This example creates an empty stack in which to build upon.
// The GDK includes a util module that allows developers to map environment variables to variables
export const configFromEnv =
fromEnv({
executionEnvironment: "EXECUTION_ENVIRONMENT",
featureEnvironment: "FEATURE_ENVIRONMENT",
application: "APPLICATION",
service: "SERVICE",
version: "VERSION",
containerImage: "CONTAINER_IMAGE"
});
// The service stack where everything is created
export class MyWebServiceStack extends GenieStack {
constructor(scope: Construct, id: string, props: BaseServiceStackProps) {
super(props, scope, id);
}
}
const app = new App();
// Service stack is instantiated with the properties pulled from environment variables
new MyWebServiceStack(app, "MyWebServiceStack", {
...configFromEnv
});
app.synth();
Example 2
Building upon Example 1, this code contains a number of constructs in use, GenieFargateTaskDefinition and GenieFargateService. You will notice that props is passed around to each construct. This variable contains the minimum required variables as mentioned in Prerequisites, which again helps namespace, tag and target the correct infrastructure.
export class MyWebServiceStack extends GenieStack {
constructor(scope: Construct, id: string, props: BaseServiceStackProps) {
super(props, scope, id);
const myWebServiceTaskDef = new GenieFargateTaskDefinition(this, "EcsTaskDefinition", {
...props,
memoryLimitMiB: 1024,
cpu: 512,
});
myWebServiceTaskDef.addGenieContainer("MyWebContainer", {
imageName: configFromEnv.containerImage,
port: 8086,
cpu: 512,
memoryLimitMiB: 1024,
environment: {
"THIRD_PARTY_API_URL": "http://www.somethirdparty.com/api/v2"
},
...props
});
new GenieFargateService(this, "EcsService", {
...props,
taskDefinition: myWebServiceTaskDef,
desiredCount: 2,
isPublic: true,
healthCheck: {
path: "/health",
port: "8086"
}
});
}
}