Coder Social home page Coder Social logo

cloudform's Introduction

cloudform

TypeScript-based imperative way to define AWS CloudFormation templates

Read the introductory blog post

Installation

npm install --save-dev cloudform

Usage

  1. Define your AWS CloudFormation template in a TypeScript file, for example template.ts:
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.

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:

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

API

The types are generated automatically from the AWS-provided schema file, 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. 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 are available within Fn namespace:

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 are there, too:

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

Licence

MIT

cloudform's People

Contributors

notherdev avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.