Skip to content

Instantly share code, notes, and snippets.

@apsoto
Created June 4, 2012 18:00
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save apsoto/2869888 to your computer and use it in GitHub Desktop.
Save apsoto/2869888 to your computer and use it in GitHub Desktop.
Diagram Showing EC2 Security Group Data Flows
require 'rubygems'
require 'activesupport'
require 'aws'
require 'graphviz'
ec2 = Aws::Ec2.new(ENV["AMAZON_ACCESS_KEY_ID"], ENV["AMAZON_SECRET_ACCESS_KEY"])
g = ec2.describe_security_groups
gv = GraphViz::new( "structs", "type" => "graph" )
# add node for each group
g.each{|group| gv.add_node(group[:aws_group_name], :shape => "box", :color => "lightblue") }
# add edges between nodes
#g.each{|group| group[:aws_perms].each{|perm| gv.add_edge(group[:aws_group_name], perm[:group]) unless perm[:group].nil? || perm[:group] == group[:aws_group_name]} } ; nil
g.each do |group|
group[:aws_perms].each do |perm|
if !perm[:group].nil?
gv.add_edge(group[:aws_group_name], perm[:group]) unless perm[:group] == group[:aws_group_name]
elsif !perm[:cidr_ips].nil?
node_name = "#{perm[:protocol]}:#{perm[:cidr_ips]}:#{perm[:from_port]}-#{perm[:to_port]}"
gv.add_node(node_name)
gv.add_edge(group[:aws_group_name], node_name)
end
end
end; nil
gv.output( "output" => "png", :file => "output.png")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment