Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bright/cloudform
TypeScript-based imperative way to define AWS CloudFormation templates
https://github.com/bright/cloudform
aws aws-cloudformation cloudformation
Last synced: about 2 months ago
JSON representation
TypeScript-based imperative way to define AWS CloudFormation templates
- Host: GitHub
- URL: https://github.com/bright/cloudform
- Owner: bright
- License: mit
- Created: 2017-11-20T20:58:46.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2023-11-20T17:16:43.000Z (about 1 year ago)
- Last Synced: 2024-10-31T16:41:01.181Z (about 2 months ago)
- Topics: aws, aws-cloudformation, cloudformation
- Language: TypeScript
- Size: 6.81 MB
- Stars: 153
- Watchers: 11
- Forks: 27
- Open Issues: 36
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# 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"export default 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/packages/cloudform/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"
}
```Use `cloudform --minify path/to/your/template.ts` if you want CloudForm to output minified JSON instead of formatted. It might be useful if you reach [CloudFormation template body size limitation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html).
## API
The types are generated automatically from the [AWS-provided schema file](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-resource-specification.html) throughout all the regions, 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.
All [Intrinsic Functions](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html) are available within `Fn` namespace:
```typescript
Fn.Base64(value: Value)
Fn.FindInMap(mapName: Value, topLevelKey: Value, secondLevelKey: Value)
Fn.GetAtt(logicalNameOfResource: Value, attributeName: Value)
Fn.GetAZs(region?: Value)
Fn.ImportValue(sharedValueToImport: Value)
Fn.Join(delimiter: Value, values: List)
Fn.Select(index: Value, listOfObjects: List)
Fn.Split(delimiter: Value, sourceString: Value)
Fn.Sub(string: Value, vars [key: string]: Value })
Fn.Ref(logicalName: Value)// condition functions
Fn.And(condition: List)
Fn.Equals(left: any, right: any)
Fn.If(conditionName: Value, valueIfTrue: any, valueIfFalse: any)
Fn.Not(condition: Condition)
Fn.Or(condition: List)
```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)