Skip to content

Commit

Permalink
Readme, example fixes, version bump to 1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
adambar committed Nov 29, 2017
1 parent f485824 commit 56b9ccf
Show file tree
Hide file tree
Showing 3 changed files with 195 additions and 11 deletions.
169 changes: 168 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,169 @@
# cloudform.js
# cloudform
TypeScript-based imperative way to define AWS CloudFormation templates

[Read the introductory blog post](https://brightinventions.pl/blog/introducing-cloudform-tame-aws-cloudformation-templates/)

## Installation

`npm install --save-dev cloudform`

## Usage

1. Define your AWS CloudFormation template in a TypeScript file, for example `template.ts`:

```typescript
import cloudform, {Fn, Refs, EC2, StringParameter, ResourceTag} from "cloudform"

cloudform({
Description: 'My template',
Parameters: {
DeployEnv: new StringParameter({
Description: 'Deploy environment name',
AllowedValues: ['stage', 'production']
})
},
Mappings: {
DeploymentConfig: {
stage: {
InstanceType: 't2.small'
},
production: {
InstanceType: 't2.large'
}
}
},
Resources: {
VPC: new EC2.VPC({
CidrBlock: NetworkingConfig.VPC.CIDR,
EnableDnsHostnames: true,
Tags: [
new ResourceTag('Application', Refs.StackName),
new ResourceTag('Network', 'Public'),
new ResourceTag('Name', Fn.Join('-', [Refs.StackId, 'VPC']))
]
}),
Instance: new EC2.Instance({
InstanceType: Fn.FindInMap('DeploymentConfig', Fn.Ref('DeployEnv'), 'InstanceType'),
ImageId: 'ami-a85480c7'
}).dependsOn('VPC')
}
})
```

See also [example/example.ts](https://github.com/bright/cloudform/blob/master/example/example.ts).

2\. Run `cloudform path/to/your/template.ts` to generate the CloudFormation template as JSON.

It makes sense to define it in your `npm` scripts and run within your build or deployment pipeline, for example:

```json
"scripts"
// ...
"generate-cloudformation-template": "cloudform path/to/your/template > template.aws"
}
```

## API

The types are generated automatically from the [AWS-provided schema file](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-resource-specification.html), so `cloudform` supports all the types available in AWS CloudFormation.

The simple convention is used – all the AWS types’ namespaces are available directly as exports from the `cloudform` package. All the resources within this package are available inside. This way `EC2.VPC` object from our example translates into `AWS::EC2::VPC` type we can find in [CloudFormation documentation](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html). All the properties also match one-to-one, including casing.

Supported namespaces are:

```
ApiGateway
ApplicationAutoScaling
Athena
AutoScaling
Batch
CertificateManager
CloudFormation
CloudFront
CloudTrail
CloudWatch
CodeBuild
CodeCommit
CodeDeploy
CodePipeline
Cognito
Config
DAX
DMS
DataPipeline
DirectoryService
DynamoDB
EC2
ECR
ECS
EFS
EMR
ElastiCache
ElasticBeanstalk
ElasticLoadBalancing
ElasticLoadBalancingV2
Elasticsearch
Events
GameLift
GuardDuty
IAM
IoT
KMS
Kinesis
KinesisAnalytics
KinesisFirehose
Lambda
Logs
OpsWorks
RDS
Redshift
Route53
S3
SDB
SNS
SQS
SSM
StepFunctions
WAF
WAFRegional
WorkSpaces
```

All [Intrinsic Tunctions](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html) are available within `Fn` namespace:

```typescript
Fn.Base64(value: Value<string>)
Fn.FindInMap(mapName: Value<string>, topLevelKey: Value<string>, secondLevelKey: Value<string>)
Fn.GetAtt(logicalNameOfResource: Value<string>, attributeName: Value<string>)
Fn.GetAZs(region?: Value<string>)
Fn.ImportValue(sharedValueToImport: Value<any>)
Fn.Join(delimiter: Value<string>, values: List<any>)
Fn.Select(index: Value<number>, listOfObjects: List<any>)
Fn.Split(delimiter: Value<string>, sourceString: Value<string>)
Fn.Sub(string: Value<string>, vars [key: string]: Value<any> })
Fn.Ref(logicalName: Value<string>)

// condition functions
Fn.And(condition: List<Condition>)
Fn.Equals(left: any, right: any)
Fn.If(conditionName: Value<string>, valueIfTrue: any, valueIfFalse: any)
Fn.Not(condition: Condition)
Fn.Or(condition: List<Condition>)
```

All the [Pseudo Parameters](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html) are there, too:

```
Ref.AccountId
Ref.NotificationARNs
Ref.NoValue
Ref.Partition
Ref.Region
Ref.StackId
Ref.StackName
Ref.URLSuffix
```

## Licence

[MIT](https://github.com/bright/cloudform/blob/master/LICENCE)
35 changes: 26 additions & 9 deletions example/example.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,41 @@
import cloudform, {Fn, Refs, EC2} from "../index"
import {StringParameter} from "../types/parameter"
import {ResourceTag} from "../types/resource"
import cloudform, {Fn, Refs, EC2, StringParameter, ResourceTag} from ".." // you should import from cloudform here instead

const NetworkingConfig = {
VPC: {
CIDR: '10.0.0.0/16'
}
}

const DeployEnv = Fn.Ref('DeployEnv')

cloudform({
Description: 'My template',
Parameters: {
DeployEnv: new StringParameter({
Description: 'Deploy environment name',
AllowedValues: ['dev', 'stage', 'production']
AllowedValues: ['stage', 'production']
})
},
Mappings: {
SubnetConfig: {
VPC: {
CIDR: '10.0.0.0/16'
SomeGroup: {
stage: {
SomeValue: 'one'
},
production: {
SomeValue: 'two'
}
}
},
Conditions: {
FirstCondition: Fn.Equals(1, 2),
TestCondition: Fn.And([{Condition: 'FirstCondition'}, Fn.Equals("a", "b")])
TestCondition: Fn.And([
{Condition: 'FirstCondition'},
Fn.Equals(Fn.FindInMap('SomeGroup', DeployEnv, 'SomeValue'), 'three')
])
},
Resources: {
VPC: new EC2.VPC({
CidrBlock: Fn.FindInMap('SubnetConfig', 'VPC', 'CIDR'),
CidrBlock: NetworkingConfig.VPC.CIDR,
EnableDnsHostnames: true,
Tags: [
new ResourceTag('Application', Refs.StackName),
Expand All @@ -42,5 +54,10 @@ cloudform({
}
}
}
},
Outputs: {
VPCIpv6CidrBlocks: {
Value: Fn.GetAtt('VPC', 'Ipv6CidrBlocks')
}
}
})
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cloudform",
"version": "0.0.13",
"version": "1.0.0",
"description": "TypeScript-based imperative way to define AWS CloudFormation templates",
"main": "dist/index.js",
"scripts": {
Expand Down

0 comments on commit 56b9ccf

Please sign in to comment.