Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/seanedwards/cfer
Toolkit and Ruby DSL for automating infrastructure using AWS CloudFormation
https://github.com/seanedwards/cfer
aws cloudformation ruby
Last synced: 2 days ago
JSON representation
Toolkit and Ruby DSL for automating infrastructure using AWS CloudFormation
- Host: GitHub
- URL: https://github.com/seanedwards/cfer
- Owner: seanedwards
- License: mit
- Created: 2015-05-18T16:17:43.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2024-01-08T15:41:42.000Z (10 months ago)
- Last Synced: 2024-10-31T14:27:36.468Z (13 days ago)
- Topics: aws, cloudformation, ruby
- Language: Ruby
- Homepage:
- Size: 793 KB
- Stars: 90
- Watchers: 9
- Forks: 18
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.txt
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# Cfer
![Build Status](https://github.com/seanedwards/cfer/actions/workflows/build.yml/badge.svg?branch=master)
[![Gem Version](https://badge.fury.io/rb/cfer.svg)](http://badge.fury.io/rb/cfer)Cfer is a lightweight toolkit for managing CloudFormation templates.
Read about Cfer [here](https://github.com/seanedwards/cfer/blob/master/examples/vpc.md).
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'cfer'
```And then execute:
$ bundle
Or install it yourself as:
$ gem install cfer
## Usage
To quickly see Cfer in action, try converging the example stacks:
```bash
cfer converge vpc -t examples/vpc.rb --profile [YOUR-PROFILE] --region [YOUR-REGION]
cfer converge instance -t examples/instance.rb --profile [YOUR-PROFILE] --region [YOUR-REGION] KeyName=[YOUR-EC2-SSH-KEY]
```You should see something like this:
![Demo](https://raw.githubusercontent.com/seanedwards/cfer/master/doc/cfer-demo.gif)
### Command line
COMMANDS
converge Create or update a cloudformation stack according to the template
delete Deletes a CloudFormation stack
describe Fetches and prints information about a CloudFormation
estimate Prints a link to the Amazon cost caculator estimating the cost of the resulting CloudFormation stack
generate Generates a CloudFormation template by evaluating a Cfer template
help show help
tail Follows stack events on standard output as they occur### Template Anatomy
See the `examples` directory for some examples of complete templates.
#### Parameters
Parameters may be defined using the `parameter` function:
```ruby
parameter :ParameterName,
type: 'String',
default: 'ParameterValue'
```Any parameter can be referenced either in Ruby by using the `parameters` hash:
```ruby
parameters[:ParameterName]
```Parameters can also be used in a CloudFormation reference by using the `Fn::ref` function:
```ruby
Fn::ref(:ParameterName)
```#### Resources
Resources may be defined using the `resource` function:
```ruby
resource :ResourceName, 'AWS::CloudFormation::CustomResource', AttributeName: {:attribute_key => 'attribute_value'} do
property_name 'property_value'
end
```Gets transformed into the corresponding CloudFormation block:
```json
"ResourceName": {
"Type": "AWS::CloudFormation::CustomResource",
"AttributeName": {
"attribute_key": "attribute_value"
},
"Properties": {
"PropertyName": "property_value"
}
}
```#### Outputs
Outputs may be defined using the `output` function:
```ruby
output :OutputName, Fn::ref(:ResourceName)
```Outputs may have an optional description:
```ruby
output :OutputName, Fn::ref(:ResourceName), description: 'The resource that does stuff'
```Outputs may be retireved from other stacks anywhere in a template by using the `lookup_output` function.
```ruby
lookup_output('stack_name', 'output_name')
```Outputs may also be exported for use by `Fn::ImportValue` in other cloudformation stacks:
```ruby
output :OutputName, Fn::ref(:ResourceName), export: Fn::sub('${AWS::StackName}-OutputName')
```#### Including code from multiple files
Templates can get pretty large, and splitting template code into multiple
files can help keep things more manageable. The `include_template`
function works in a similar way to ruby's `require_relative`, but
within the context of the CloudFormation stack:```ruby
include_template 'ec2.rb'
```You can also include multiple files in a single call:
```ruby
include_template(
'stack/ec2.rb',
'stack/elb.rb'
)
```The path to included files is relative to the base template file
(e.g. the `converge` command `-t` option).## SDK
Embedding the Cfer SDK involves interacting with two components: The `Client` and the `Stack`.
The Cfer `Client` is the interface with the Cloud provider.### Basic API
The simplest way to use Cfer from Ruby looks similar to the CLI:
```ruby
Cfer.converge! '', template: ''
```This is identical to running `cfer converge --template `, but is better suited to embedding in Rakefiles, chef recipes, or your own Ruby scripts.
See the Rakefile in this repository for how this might look.### Cfn Client
The Client is a wrapper around Amazon's CloudFormation client from the AWS Ruby SDK.
Its purpose is to interact with the CloudFormation API.Create a new client:
```ruby
Cfer::Cfn::Client.new(stack_name: )
````Cfer::Cfn::Client` also accepts options to be passed into the internal `Aws::CloudFormation::Client` constructor.
#### `converge(stack)`
Creates or updates the CloudFormation stack to match the input `stack` object. See below for how to create Cfer stack objects.
```ruby
client.converge()
```#### `tail(options = {})`
Yields to the specified block for each CloudFormation event that qualifies given the specified options.
```ruby
client.tail number: 1, follow: true do |event|
# Called for each CloudFormation event, as they occur, until the stack enters a COMPLETE or FAILED state.
end
```### Cfer Stacks
A Cfer stack represents a baked CloudFormation template, which is ready to be converted to JSON.
Create a new stack:
#### `stack_from_file`
```ruby
stack = Cfer::stack_from_file(, client: )
```#### `stack_from_block`
```ruby
stack = Cfer::stack_from_block(client: ) do
# Stack definition goes here
end
```## Contributing
This project uses [git-flow](http://nvie.com/posts/a-successful-git-branching-model/). Please name branches and pull requests according to that convention.
Always use `--no-ff` when merging into `develop` or `master`.
This project also contains a [Code of Conduct](https://github.com/seanedwards/cfer/blob/master/CODE_OF_CONDUCT.md), which should be followed when submitting feedback or contributions to this project.
### New features
* Branch from `develop`
* Merge into `develop`
* Name branch `feature/`### Unreleased bugs
* Branch from `develop`
* Merge into `develop`
* Name branch `bugfix/`### Bugfixes against releases
* Branch from `master`
* Merge into `develop` and `master`
* Name branch `hotfix/`### Releases
* Branch from `develop`
* Merge into `develop` and `master`
* Name branch `release/`# Release Notes
[Change Log](https://github.com/seanedwards/cfer/blob/master/CHANGELOG.md)