Skip to content

Instantly share code, notes, and snippets.

@kei-q
Created May 2, 2016 07:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kei-q/3ab1177b0bf68c41a60e34acb06f059e to your computer and use it in GitHub Desktop.
Save kei-q/3ab1177b0bf68c41a60e34acb06f059e to your computer and use it in GitHub Desktop.
CloudFormationのtemplateからRefの依存関係を図示するやつ (要ruby, graphviz)
#!/usr/bin/env ruby
require 'json'
template_name = ARGV[0]
contents = File.read(template_name)
json = JSON.parse(contents, symbolize_names: true)
def traverse(hash, &block)
hash.each {|key, value|
if value.class == Hash
traverse value, &block
elsif value.class == Array
value.map {|e|
traverse e, &block if e.class == Hash
}
else
block.call(key, value)
end
}
end
def select_refs(resource)
ret = []
traverse(resource) {|key,value|
if key == :Ref
ret << value.to_sym
end
}
ret
end
def dependencies(resources)
ret = []
resources.each {|resource_name, resource_value|
refs = select_refs(resource_value)
ret << refs.map {|ref| [resource_name, ref]}
}
ret.flatten(1)
end
def output_dots(dependencies)
ret = 'digraph G {'
ret += dependencies.map {|child, parent|
%("#{child}" -> "#{parent}")
}.join("\n")
ret += '}'
ret
end
def reject_params(dependencies, resources)
resource_names = resources.keys
dependencies.select {|_child,parent|
resource_names.include?(parent)
}
end
resources = json[:Resources]
ret = output_dots(reject_params(dependencies(resources), resources))
File.write('deps.dot', ret)
system('dot -Tpng -o deps.png deps.dot')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment