Blossom Logo Deploy your apps with Heroku-like simplicity using Blossom See Your Savings
BoltOps Logo
Lono CloudFormation Framework Introduction Part 7: Variables and Loops header image

Lono CloudFormation Framework Introduction Part 7: Variables and Loops

Tung Nguyen Tung Nguyen · February 11, 2020
4 min read

The Lono DSL is powerful because it allows you to use the Ruby programming language to generate CloudFormation templates. You can use conditional logic constructs that you’re used to: loops, variables, if statements, methods, etc. However, the Lono DSL tries not to impose itself and take over CloudFormation’s declarative nature. Instead, Lono’s approach is to add programming “sprinkles” on top of CloudFormation. Ultimately, you get the best of both worlds.

Loop Example

Continuing with our demo example and what we’ve learned from previous posts, we’ll create a simple loop to show the power of the Lono DSL. The loop creates multiple EC2 instances instead of just one.

Let’s add a variable call @instance_count and update the template to use it.

app/templates/demo.rb

@instance_count ||= 1 # default to 1
@instance_count.times do |i|
  n = i + 1
  resource("Instance#{n}", "AWS::EC2::Instance",
    InstanceType: ref("InstanceType"),
    ImageId: find_in_map("AmiMap", ref("AWS::Region"), "Ami"),
    SecurityGroupIds: [get_att("SecurityGroup#{n}.GroupId")],
    UserData: base64(sub(user_data("bootstrap.sh")))
  )
  resource("SecurityGroup#{n}", "AWS::EC2::SecurityGroup",
    GroupDescription: "demo security group",
  )
  output("Instance#{n}")
  output("SecurityGroup#{n}", get_att("SecurityGroup#{n}.GroupId"))
end

The @instance_count variable controls the number of instances and security groups that will be created.

Lono seed/configs.rb

Let’s also create a seed/configs.rb file to help users using the blueprint set up starter configs.

class Lono::Seed::Configs < Lono::Seed::Base
  def variables
    <<~EOL
      @instance_count = 1
    EOL
  end
end

Configure and Deploy

We can now use lono seed to configure and deploy the blueprint.

lono seed demo

configs/demo/variables/development.rb:

@instance_count = 1

Let’s adjust the variables config to use @instance_count = 2. You can see how variables affect the template with lono summary.

$ lono summary demo
=> CloudFormation Template Summary for template demo:
# Parameters Total (1)
# InstanceType=t3.micro #
# Resources:
  2 AWS::EC2::Instance
  2 AWS::EC2::SecurityGroup
  4 Total
$

Let’s go ahead and deploy:

lono cfn deploy demo

Check the CloudFormation console, and we’ll see something like this:

And the ec2 console:

Summary

In this post, we went through simple variables and loop example. It’s just the tip of the iceberg in terms of power with the Lono DSL. The rest of the iceburg is the full Ruby programming language.

Matz created Ruby to make programmers happy. The Lono DSL is built on top of Ruby. The more I’ve developed Lono and used it, the more I’ve come to appreciated Matz, Ruby’s power, and it’s beauty.

Lono Introduction Series

Blossom Logo
Deploy Your Apps with Ease

Blossom lets you deploy to your own servers with Heroku-like simplicity. Connect any cloud provider and we'll handle the rest. Save time and money with Blossom.

BoltOps Blog
Join a group of good-looking folks who get free email updates from BoltOps.