Skip to content

Commit

Permalink
feat(new-ex): custom logical names (aws-samples#120)
Browse files Browse the repository at this point in the history
* custom logical names

an example for how to implement custom logical name allocation.

related: aws/aws-cdk#4045

* Use `ApplicationLoadBalancedFargateService`
  • Loading branch information
Elad Ben-Israel authored and NGL321 committed Jan 8, 2020
1 parent 59ab034 commit 29efbdb
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ $ cdk destroy
| [stepfunctions-job-poller](https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript/stepfunctions-job-poller/) | A simple StepFunctions workflow |
| [ecs-service-with-logging](https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript/ecs/ecs-service-with-logging/) | Starting a container fronted by a load balancer on ECS |
| [fargate-service-with-logging](https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript/ecs/fargate-service-with-logging/) | Starting a container fronted by a load balancer on Fargate |
| [custom-logical-names](https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript/custom-logical-names/) | Example of how to override logical name allocation |

## Java examples <a name="Java"></a>

Expand Down
79 changes: 79 additions & 0 deletions typescript/custom-logical-names/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# Custom Logical Names
<!--BEGIN STABILITY BANNER-->
---

![Stability: Stable](https://img.shields.io/badge/stability-Stable-success.svg?style=for-the-badge)

> **This is a stable example. It should successfully build out of the box**
>
> This examples does is built on Construct Libraries marked "Stable" and does not have any infrastructure prerequisites to build.
---
<!--END STABILITY BANNER-->

This sample shows how you can override the behavior for allocating
logical names for CloudFormation resources in the CDK.

It implements a feature that allows users to specify a prefix for
all logical names using the `prefix` context key.

## Usage

1. Extend your stacks from `BaseStack` instead of from `Stack`.
2. Specify context when calling the CLI through `--context prefix=PREFIX`.

## Implementation

The `BaseStack` class implements this custom behavior. Using a base stack is a a
common and recommended pattern for reusing policy within an organization.

Then, any stack that derives from `BaseStack` will automatically have this
behavior.

## Build

To build this app, you need to be in this example's root folder. Then run the following:

```bash
npm install -g aws-cdk
npm install
npm run build
```

This will install the necessary CDK, then this example's dependencies, and then build your TypeScript files and your CloudFormation template.

## Deploy

Run `cdk deploy --context prefix=PREFIX`. This will deploy / redeploy your Stack to your AWS Account.

## Example

```shell
$ cdk synth -j
{
"Resources": {
"MyTopic86869434": {
"Type": "AWS::SNS::Topic"
},
"MyBucketF68F3FF0": {
"Type": "AWS::S3::Bucket"
}
}
}
```

Now with prefix:

```shell
$ cdk synth -j -c prefix="MyTeam"
{
"Resources": {
"MyTeamMyTopic86869434": {
"Type": "AWS::SNS::Topic"
},
"MyTeamMyBucketF68F3FF0": {
"Type": "AWS::S3::Bucket"
}
}
}
```
16 changes: 16 additions & 0 deletions typescript/custom-logical-names/base-stack.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Stack, CfnElement } from '@aws-cdk/core';

/**
* A base stack class that implements custom logical name
* allocation. Adds a prefix if it is defined in the "prefix"
* context key.
*
* Use `cdk --context prefix=PREFIX` to set the prefix.
*/
export class BaseStack extends Stack {
public allocateLogicalId(element: CfnElement) {
const orig = super.allocateLogicalId(element);
const prefix = this.node.tryGetContext('prefix');
return prefix ? prefix + orig : orig;
}
}
3 changes: 3 additions & 0 deletions typescript/custom-logical-names/cdk.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"app": "npx ts-node index.ts"
}
18 changes: 18 additions & 0 deletions typescript/custom-logical-names/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/usr/bin/env node
import { BaseStack } from './base-stack';
import { App, Construct, StackProps } from '@aws-cdk/core';
import s3 = require('@aws-cdk/aws-s3');
import sns = require('@aws-cdk/aws-sns');

class MyStack extends BaseStack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);

new sns.Topic(this, 'MyTopic');
new s3.Bucket(this, 'MyBucket');
}
}

const app = new App();
new MyStack(app, 'MyStack');
app.synth();
23 changes: 23 additions & 0 deletions typescript/custom-logical-names/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "custom-logical-names",
"version": "0.1.0",
"bin": {
"custom-logical-names": "bin/custom-logical-names.js"
},
"scripts": {
"build": "tsc",
"watch": "tsc -w",
"cdk": "cdk"
},
"devDependencies": {
"aws-cdk": "*",
"ts-node": "^8.1.0",
"typescript": "~3.7.2"
},
"dependencies": {
"@aws-cdk/aws-s3": "*",
"@aws-cdk/aws-sns": "*",
"@aws-cdk/core": "*",
"source-map-support": "^0.5.9"
}
}
23 changes: 23 additions & 0 deletions typescript/custom-logical-names/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"compilerOptions": {
"target":"ES2018",
"module": "commonjs",
"lib": ["es2016", "es2017.object", "es2017.string"],
"declaration": true,
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"noImplicitThis": true,
"alwaysStrict": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": false,
"inlineSourceMap": true,
"inlineSources": true,
"experimentalDecorators": true,
"strictPropertyInitialization":false,
"typeRoots": ["./node_modules/@types"]
},
"exclude": ["cdk.out"]
}

0 comments on commit 29efbdb

Please sign in to comment.