@almamedia-open-source/cdk-project-context
v0.0.19
Published
Opinionated CDK utility construct for managing project information & AWS account-specific configuration.
Downloads
97
Readme
CDK utility construct for managing project information & AWS account-specific configuration.
Why you'd use this?
- If you use multi-account deployments, i.e. separate
dev
andprod
workloads to different accounts. - Especially if you develop microservices, you end up with a lot of CDK projects. Without well-defined method of managing project configuration one often ends up reinventing the wheel in each project.
- A developer can be quaranteed the configuration information is available and in correct format – or otherwise
cdk synth|diff|deploy
will fail.
Note: This is not a replacement for tools such as AWS AppConfig, Parameter Store or Secrets Manager! Project Context should only contain non-secret values that define "where to deploy" and certain values that you may wish to use for example as part of tagging or naming resources.
Important
🚧 This tool is work-in-progress and experimental!
All @almamedia-open-source/cdk-
prefixed constructs/utilities are based on existing CDK constructs/utilities we've developed & used (in production) internally at Alma Media since 2019.
Breaking changes may occur at any given time without prior warning before first v1
major is released, as we rewrite them for CDK v2 and use this opportunity to also redesign & refactor.
Feedback is most welcome, but do note that we intend to implement these new constructs/utilities and their APIs in such manner that our existing CDK v1 production workloads can easily migrate into these new @almamedia-open-source/cdk-
constructs/utilities.
Installation
Ensure you meet following requirements:
- NodeJS
v14.17.6
or newer - AWS Cloud Development Kit
v2.0.0
or newer
- NodeJS
Install:
npm i -D @almamedia-open-source/cdk-project-context
Usage
In your CDK application (for example
lib/app.ts
) useProject
instead ofApp
to initialize the CDK app:import { Project } from '@almamedia-open-source/cdk-project-context'; // new Project instead of new App const project = new Project({ name: 'my-cool-project', author: { organization: 'Acme Corp', name: 'Mad Scientists', email: '[email protected]', }, defaultRegion: 'eu-west-1', // defaults to one of: $CDK_DEFAULT_REGION, $AWS_REGION or us-east-1 accounts: { dev: { id: '111111111111', config: { baseDomain: 'example.net', }, }, prod: { id: '222222222222', config: { baseDomain: 'example.com', }, }, }, })
Somewhere in your stacks you may use static methods of
ProjectContext
class:import { Stack, StackProps, CfnOutput } from 'aws-cdk-lib'; import { ProjectContext } from '@almamedia-open-source/cdk-project-context'; export class MyStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); // Get the default region for this project new CfnOutput(this, 'DefaultRegion', { value: ProjectContext.getDefaultRegion(this) }); // Get the project name new CfnOutput(this, 'Name', { value: ProjectContext.getName(this) }); // Get information about the project author new CfnOutput(this, 'AuthorOrganization', { value: ProjectContext.getAuthorOrganization(this) }); new CfnOutput(this, 'AuthorName', { value: ProjectContext.getAuthorName(this) }); new CfnOutput(this, 'AuthorEmail', { value: ProjectContext.getAuthorEmail(this) }); // Get AWS account specific configuration new CfnOutput(this, 'AccountType', { value: ProjectContext.getAccountType(this) }); new CfnOutput(this, 'AccountId', { value: ProjectContext.getAccountId(this) }); new CfnOutput(this, 'AccountBaseDomain', { value: ProjectContext.getAccountConfig(this, 'baseDomain') }); } }
There's also a shorthand alias
PC
available, for example:PC.getAccountId(this)
.Run CDK commands with
account-type
(or shorthand:account
) CLI context flag to select the desired account configuration:npx cdk deploy --context account=dev
You'll get the following CloudFormation outputs: | Name | Example Value | | :----------------- | :-------------------------------- | | DefaultRegion |
eu-west-1
| | Name |my-cool-project
| | AuthorOrganization |Acme Corp
| | AuthorName |Mad Scientists
| | AuthorEmail |[email protected]
| | AccountType |dev
| | AccountId |111111111111
| | AccountBaseDomain |example.net
|
Application Environment Retrieval
Often you may want to deploy multiple different application environments – “isolated copies” of your CDK application such as feature environments – into same AWS account. To manage that, you need some kind of "modifier" which selects the target application environment.
You may use this utility to retrieve application environment information. In the context of this utility, environment is just a string value such as staging
or production
– not to be confused with CDK environments (which instead define the target AWS Account & Region configuration for a stack).
Somewhere in your stacks you may use static method
ProjectContext.getEnvironment(scope)
:import { Stack, StackProps, CfnOutput } from 'aws-cdk-lib'; import { PC } from '@almamedia-open-source/cdk-project-context'; // Using the PC shorthand here export class MyStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); // Get the default region for this project new CfnOutput(this, 'Environment', { value: PC.getEnvironment(this) }); } }
Specify
environment-type
(or shorthand:environment
orenv
) CLI context flag to select the desired environment:npx cdk deploy --context account=dev --context environment=staging
You'll get the following CloudFormation outputs: | Name | Example Value | | :---------- | :------------ | | Environment |
staging
|