@aerisweather/deploy-cloud-formation

Easily deploy and update CloudFormation templates

Usage no npm install needed!

<script type="module">
  import aerisweatherDeployCloudFormation from 'https://cdn.skypack.dev/@aerisweather/deploy-cloud-formation';
</script>

README

deploy-cloud-formation

Easily deploy and update CloudFormation templates

What does it do?

When you pass a template to deployCloudFormation:

  • It creates a CloudFormation stack, if one doesn't exist
  • It executes a ChangeSet against a stack, if the stack already exists
  • Waits to resolve until the stack is fully created/updated
  • Throws an error if the stack fails to create/update

So nothing too fancy. But it turns out that this is kind of tricky using the AWS SDK alone.

Install

npm install --save-dev @aerisweather/deploy-cloud-formation

Usage

with the CLI tool

The simplest way to deploy a CloudFormation template is using the CLI tool:

node_modules/.bin/deploy-cloud-formation \
  --template ./my-cloud-formation-template.json \
  --stackName MyStack \
  --region us-east-1

with the node module

const deployCloudFormation = require('@aerisweather/deploy-cloud-formation').default;

const template = {
  "Resources": {
      "EC2Instance": {
        "Type": "AWS::EC2::Instance",
        "Properties": {
          // ...
        }
      },
      "InstanceSecurityGroup": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
          // ...
        }
      }
    }
}

deployCloudFormation({
  region: 'us-east-1',
  template: JSON.stringify(template),
  stackName: 'my-cloudformation-stack'
})
  .then(
    () => console.log(`Done!`),
    (err) => console.error(`Failed to create a CloudFormation stack: ${err.message}`)
  );

Template Utilities

To make writing JSON templates a little nicer, we provide you with some utility functions:

import {Join, AccountId, Attr, Ref} from '@aeriweather/deploy-cloud-formation';

const template = {
  Resources: {
    //...
    SomeRole: {
      Type: 'AWS::IAM::Role',
      Properties: {
        ManagedPolicyArns: [
          // Reference a policy ARN, using your AWS Account ID
          Join([
            'arn:aws:iam::',
            AccountId(),
          ]),
          
          // Reference a policy ARN, from the same CF template,
          // using `Fn::Att`
          Attr('SomePolicy', 'Arn'),
          
          // Reference a policy ARN, from the same CF template,
          // using `{ Ref }`
          Ref('SomePolicy')
        ]
      }
    }
  }
};