aws-graph 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/aws-graph.rb +226 -142
- data/lib/aws-graph/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34764f061c1a14cd60b9bad3e1d518b94f94ef2e
|
4
|
+
data.tar.gz: 937bad8f4c61305a6942f1bec4a9263bbcb91e87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 760ef1a2d7ed9745a184d2b5e4af9e823cf1d1d0eae90c74ab365de3901f4a0188351c313cf8d6911184028818d17a096825e2f646611a067064d912bd9d7001
|
7
|
+
data.tar.gz: df0b653a9918730670b02710c362c408c7e4af050a716597ca25d7c4cb7780693ec9e809776cbd10150a3d3e33865b32e04315bbce0b6885e196538a3d0b1dd4
|
data/lib/aws-graph.rb
CHANGED
@@ -19,8 +19,6 @@ module AwsGraph
|
|
19
19
|
|
20
20
|
protected
|
21
21
|
def sg()
|
22
|
-
gv = Gviz.new(:AWS, :digraph)
|
23
|
-
|
24
22
|
ec2_instances = @ec2.instances # EC2 instances
|
25
23
|
vpcs = @ec2.vpcs # VPC Collection
|
26
24
|
security_groups = @ec2.security_groups # EC2 security groups
|
@@ -31,179 +29,198 @@ module AwsGraph
|
|
31
29
|
|
32
30
|
secret = options[:secret]
|
33
31
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
nodes shape: 'box'
|
32
|
+
@formated = {}
|
33
|
+
sg_hash = {}
|
34
|
+
lb_sg = nil
|
38
35
|
|
39
|
-
|
36
|
+
# Create EC2 security group cluster
|
37
|
+
@formated[:security_groups] = {}
|
38
|
+
security_groups.each do | sg |
|
39
|
+
cluster_id = 'cluster' + sg.id.gsub(/[-\/]/,'')
|
40
|
+
sg_hash[sg.id] = cluster_id
|
41
|
+
|
42
|
+
if sg.vpc_id
|
43
|
+
print "v"
|
44
|
+
label = sg.name + '[' + sg.id + ']' + '[vpc]'
|
45
|
+
else
|
46
|
+
print "."
|
47
|
+
label = sg.name + '[' + sg.id + ']'
|
48
|
+
end
|
49
|
+
|
50
|
+
@formated[:security_groups][sg.id.to_sym] = {
|
51
|
+
label: label,
|
52
|
+
vpc_id: sg.vpc_id,
|
53
|
+
instances: {},
|
54
|
+
inbounds: {},
|
55
|
+
}
|
56
|
+
end
|
40
57
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
style = 'rounded,bold'
|
51
|
-
else
|
52
|
-
print "."
|
53
|
-
color = '#333333'
|
54
|
-
label = Util.new.label(sg.name + '[' + sg.id + ']', secret)
|
55
|
-
style = 'rounded,bold'
|
56
|
-
end
|
57
|
-
|
58
|
-
subgraph(cluster_id.to_sym) do
|
59
|
-
global label: label, style: style, color: color
|
60
|
-
end
|
58
|
+
# Create RDS security group cluster
|
59
|
+
db_security_groups[:db_security_groups].each do | db_sg |
|
60
|
+
print "."
|
61
|
+
if db_sg[:vpc_id]
|
62
|
+
print "v"
|
63
|
+
label = db_sg[:db_security_group_name] + '[vpc]'
|
64
|
+
else
|
65
|
+
print "."
|
66
|
+
label = db_sg[:db_security_group_name]
|
61
67
|
end
|
68
|
+
@formated[:security_groups][db_sg[:db_security_group_name].to_sym] = {
|
69
|
+
label: label,
|
70
|
+
vpc_id: db_sg[:vpc_id],
|
71
|
+
instances: {},
|
72
|
+
inbounds: {},
|
73
|
+
}
|
74
|
+
end
|
62
75
|
|
63
|
-
|
64
|
-
|
76
|
+
# Append EC2 to EC2 security group
|
77
|
+
ec2_instances.each do | e |
|
78
|
+
e.security_groups.each do | sg |
|
65
79
|
print "."
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
color = '#4B75B9'
|
70
|
-
label = Util.new.label(db_sg[:db_security_group_name], secret) + '[vpc]'
|
71
|
-
style = 'rounded,bold'
|
72
|
-
else
|
73
|
-
print "."
|
74
|
-
color = '#333333'
|
75
|
-
label = Util.new.label(db_sg[:db_security_group_name], secret)
|
76
|
-
style = 'rounded,bold'
|
77
|
-
end
|
78
|
-
subgraph(cluster_id.to_sym) do
|
79
|
-
global label: label, style: style, color: color
|
80
|
+
label = '[' + e.id + ']'
|
81
|
+
e.tags.each do | t |
|
82
|
+
label = t[1] + '[' + e.id + ']' if t[0] == 'Name'
|
80
83
|
end
|
84
|
+
@formated[:security_groups][sg.id.to_sym][:instances][e.id.to_sym] = {
|
85
|
+
label: label,
|
86
|
+
type: :ec2,
|
87
|
+
status: e.status,
|
88
|
+
}
|
81
89
|
end
|
90
|
+
end
|
82
91
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
image_path = File.dirname(__FILE__) + '/ec2.png'
|
87
|
-
else
|
88
|
-
image_path = File.dirname(__FILE__) + '/ec2_disactive.png'
|
89
|
-
end
|
92
|
+
# Append VPC EC2 to EC2 security group
|
93
|
+
vpcs.each do | vpc |
|
94
|
+
vpc.instances.each do | e |
|
90
95
|
e.security_groups.each do | sg |
|
91
|
-
print "
|
92
|
-
|
93
|
-
|
94
|
-
|
96
|
+
print "v"
|
97
|
+
label = '[' + e.id + ']'
|
98
|
+
e.tags.each do | t |
|
99
|
+
label = t[1] + '[' + e.id + ']' if t[0] == 'Name'
|
95
100
|
end
|
101
|
+
@formated[:security_groups][sg.id.to_sym][:instances][e.id.to_sym] = {
|
102
|
+
label: label,
|
103
|
+
type: :ec2,
|
104
|
+
status: e.status,
|
105
|
+
}
|
96
106
|
end
|
97
107
|
end
|
108
|
+
end
|
98
109
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
print "v"
|
109
|
-
cluster_id = 'cluster' + sg.id.gsub(/[-\/]/,'')
|
110
|
-
subgraph(cluster_id.to_sym) do
|
111
|
-
node (sg.id + e.id).gsub(/[-\/]/, '').to_sym, label: Util.new.label(e.id, secret), shape: :none, image: image_path
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
110
|
+
# Append RDS to RDS security group
|
111
|
+
db_instances[:db_instances].each do | r |
|
112
|
+
r[:db_security_groups].each do | db_sg |
|
113
|
+
print "."
|
114
|
+
@formated[:security_groups][db_sg[:db_security_group_name].to_sym][:instances][r[:db_instance_identifier].to_sym] = {
|
115
|
+
label: Util.new.label(r[:db_instance_identifier], secret),
|
116
|
+
type: :rds,
|
117
|
+
status: r[:db_instance_status],
|
118
|
+
}
|
115
119
|
end
|
120
|
+
r[:vpc_security_groups].each do | sg |
|
121
|
+
print "v"
|
122
|
+
@formated[:security_groups][sg[:vpc_security_group_id].to_sym][:instances][r[:db_instance_identifier].to_sym] = {
|
123
|
+
label: Util.new.label(r[:db_instance_identifier], secret),
|
124
|
+
type: :rds,
|
125
|
+
status: r[:db_instance_status],
|
126
|
+
}
|
127
|
+
end
|
128
|
+
end
|
116
129
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
end
|
126
|
-
end
|
127
|
-
r[:vpc_security_groups].each do | sg |
|
128
|
-
print "v"
|
129
|
-
cluster_id = 'cluster' + sg[:vpc_security_group_id].gsub(/[-\/]/,'')
|
130
|
-
image_path = File.dirname(__FILE__) + '/rds.png'
|
131
|
-
subgraph(cluster_id.to_sym) do
|
132
|
-
node (r[:db_instance_identifier]).gsub(/[-\/]/, '').to_sym, label: Util.new.label(r[:db_instance_identifier], secret), shape: :none, image: image_path
|
130
|
+
# Add edges EC2 security group
|
131
|
+
security_groups.each do | sg |
|
132
|
+
ips = sg.ingress_ip_permissions # inbound permissions
|
133
|
+
ips.each do | ip |
|
134
|
+
# CDIR
|
135
|
+
ip.ip_ranges.each do | r |
|
136
|
+
unless @formated[:security_groups][sg.id.to_sym][:inbounds].has_key?(r.to_sym)
|
137
|
+
@formated[:security_groups][sg.id.to_sym][:inbounds][r.to_sym] = []
|
133
138
|
end
|
139
|
+
@formated[:security_groups][sg.id.to_sym][:inbounds][r.to_sym].push({
|
140
|
+
port_range: ip.port_range,
|
141
|
+
protocol: ip.protocol,
|
142
|
+
})
|
134
143
|
end
|
135
|
-
end
|
136
144
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
sg_hash['amazon-elb/amazon-elb-sg'] = cluster_id
|
150
|
-
subgraph(cluster_id.to_sym) do
|
151
|
-
global label: Util.new.label('amazon-elb/amazon-elb-sg', false), style: 'rounded'
|
152
|
-
end
|
153
|
-
end
|
154
|
-
from_cluster_id = 'cluster' + fromsg.id.gsub(/[-\/]/,'')
|
155
|
-
to_cluster_id = 'cluster' + sg.id.gsub(/[-\/]/,'')
|
156
|
-
route from_cluster_id.to_sym => to_cluster_id.to_sym
|
157
|
-
edge (from_cluster_id + '_' + to_cluster_id).to_sym, label: Util.new.label(ip.port_range.to_s + '[' + ip.protocol.to_s + ']', secret)
|
145
|
+
# EC2 security group -> EC2 security group instances
|
146
|
+
ip.groups.each do | fromsg |
|
147
|
+
next if fromsg.id == sg.id
|
148
|
+
print "-"
|
149
|
+
unless sg_hash[fromsg.id]
|
150
|
+
# Unknown security group is amazon-elb/amazon-elb-sg
|
151
|
+
lb_sg = fromsg.id.to_sym
|
152
|
+
@formated[:security_groups][fromsg.id.to_sym] = {
|
153
|
+
label: 'amazon-elb/amazon-elb-sg',
|
154
|
+
instances: {},
|
155
|
+
inbounds: {},
|
156
|
+
}
|
158
157
|
end
|
158
|
+
unless @formated[:security_groups][sg.id.to_sym][:inbounds].has_key?(fromsg.id.to_sym)
|
159
|
+
@formated[:security_groups][sg.id.to_sym][:inbounds][fromsg.id.to_sym] = []
|
160
|
+
end
|
161
|
+
@formated[:security_groups][sg.id.to_sym][:inbounds][fromsg.id.to_sym].push({
|
162
|
+
port_range: ip.port_range,
|
163
|
+
protocol: ip.protocol,
|
164
|
+
})
|
165
|
+
# route from_cluster_id.to_sym => to_cluster_id.to_sym
|
166
|
+
# edge (from_cluster_id + '_' + to_cluster_id).to_sym, color: '#005580', headlabel: Util.new.label(Util.new.ip_range(ip.port_range.to_s) + '[' + ip.protocol.to_s + ']', secret), fontcolor: '#005580'
|
159
167
|
end
|
160
168
|
end
|
169
|
+
end
|
161
170
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
171
|
+
# EC2 security group -> RDS security group
|
172
|
+
db_security_groups[:db_security_groups].each do | db_sg |
|
173
|
+
print "-"
|
174
|
+
db_sg[:ec2_security_groups].each do | sg |
|
175
|
+
if sg[:ec2_security_group_id]
|
176
|
+
unless @formated[:security_groups][db_sg[:db_security_group_name].to_sym][:inbounds].has_key?(sg[:ec2_security_group_id].to_sym)
|
177
|
+
@formated[:security_groups][db_sg[:db_security_group_name].to_sym][:inbounds][sg[:ec2_security_group_id].to_sym] = []
|
178
|
+
end
|
179
|
+
@formated[:security_groups][db_sg[:db_security_group_name].to_sym][:inbounds][sg[:ec2_security_group_id].to_sym].push({
|
180
|
+
port_range: 'RDS',
|
181
|
+
protocol: nil,
|
182
|
+
})
|
183
|
+
else
|
184
|
+
# なぜかdb_security_group_idが存在しないものがある
|
185
|
+
security_groups.each do | s |
|
186
|
+
if s.name == sg[:ec2_security_group_name]
|
187
|
+
unless @formated[:security_groups][db_sg[:db_security_group_name].to_sym][:inbounds].has_key?(s.id.to_sym)
|
188
|
+
@formated[:security_groups][db_sg[:db_security_group_name].to_sym][:inbounds][s.id.to_sym] = []
|
179
189
|
end
|
190
|
+
@formated[:security_groups][db_sg[:db_security_group_name].to_sym][:inbounds][s.id.to_sym].push({
|
191
|
+
port_range: 'RDS',
|
192
|
+
protocol: nil,
|
193
|
+
})
|
180
194
|
end
|
181
195
|
end
|
182
196
|
end
|
183
197
|
end
|
198
|
+
end
|
184
199
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
end
|
194
|
-
|
195
|
-
puts ''
|
200
|
+
# Append ELB to ELB security group
|
201
|
+
lbs.each do | lb |
|
202
|
+
break unless lb_sg
|
203
|
+
@formated[:security_groups][lb_sg][:instances][lb.name.to_sym] = {
|
204
|
+
label: lb.name,
|
205
|
+
type: :elb,
|
206
|
+
status: nil,
|
207
|
+
}
|
196
208
|
end
|
209
|
+
|
210
|
+
puts ''
|
197
211
|
filename = File.basename options[:output], ".*"
|
198
|
-
|
212
|
+
dirpath = File.dirname options[:output]
|
199
213
|
fileextname = File.extname options[:output]
|
200
214
|
fileformat = fileextname.sub('.', '').to_sym
|
201
|
-
|
202
|
-
|
203
|
-
|
215
|
+
case fileformat
|
216
|
+
when :dot
|
217
|
+
self.save_png File.join(dirpath, filename)
|
218
|
+
File.delete(File.join(dirpath, filename + '.png'))
|
219
|
+
when :png
|
220
|
+
self.save_png File.join(dirpath, filename)
|
221
|
+
File.delete(File.join(dirpath, filename + '.dot'))
|
204
222
|
else
|
205
|
-
|
206
|
-
File.delete(File.join(filepath, "#{filename}.png"))
|
223
|
+
|
207
224
|
end
|
208
225
|
end
|
209
226
|
|
@@ -226,6 +243,66 @@ module AwsGraph
|
|
226
243
|
:region => @config['aws_region'],
|
227
244
|
)
|
228
245
|
end
|
246
|
+
|
247
|
+
protected
|
248
|
+
def save_png(filepath)
|
249
|
+
secret = options[:secret]
|
250
|
+
f = @formated
|
251
|
+
|
252
|
+
gv = Gviz.new(:AWS, :digraph)
|
253
|
+
gv.graph do
|
254
|
+
global layout:'fdp', overlap:false, compound:true, rankdir:'LR'
|
255
|
+
edges lhead: '', ltail: ''
|
256
|
+
nodes shape: 'box'
|
257
|
+
f[:security_groups].each do | sg_id, sg |
|
258
|
+
cluster_id = 'cluster' + sg_id.to_s.gsub(/[-\/]/,'')
|
259
|
+
if sg[:vpc_id]
|
260
|
+
color = '#4B75B9'
|
261
|
+
label = Util.new.label(sg[:label], secret)
|
262
|
+
style = 'rounded,bold'
|
263
|
+
else
|
264
|
+
color = '#333333'
|
265
|
+
label = Util.new.label(sg[:label], secret)
|
266
|
+
style = 'rounded,bold'
|
267
|
+
end
|
268
|
+
subgraph(cluster_id.to_sym) do
|
269
|
+
global label: label, style: style, color: color
|
270
|
+
sg[:instances].each do | i_id, i |
|
271
|
+
case i[:type]
|
272
|
+
when :ec2
|
273
|
+
if i[:status] == :running
|
274
|
+
image_path = File.dirname(__FILE__) + '/ec2.png'
|
275
|
+
else
|
276
|
+
image_path = File.dirname(__FILE__) + '/ec2_disactive.png'
|
277
|
+
end
|
278
|
+
when :rds
|
279
|
+
image_path = File.dirname(__FILE__) + '/rds.png'
|
280
|
+
when :elb
|
281
|
+
image_path = File.dirname(__FILE__) + '/elb.png'
|
282
|
+
else
|
283
|
+
image_path = File.dirname(__FILE__) + '/ec2_disactive.png'
|
284
|
+
end
|
285
|
+
node (sg_id.to_s + i_id.to_s).gsub(/[-\/]/, '').to_sym, label: i[:label], shape: :none, image: image_path
|
286
|
+
end
|
287
|
+
|
288
|
+
sg[:inbounds].each do | ip, inbounds |
|
289
|
+
|
290
|
+
# Security Group -> Security Group
|
291
|
+
if /\Asg\-/.match(ip.to_s)
|
292
|
+
from_cluster_id = 'cluster' + ip.to_s.gsub(/[-\/]/,'')
|
293
|
+
route from_cluster_id.to_sym => cluster_id.to_sym
|
294
|
+
label = []
|
295
|
+
inbounds.each do | inbound |
|
296
|
+
label.push(Util.new.format_range(inbound[:port_range].to_s) + '(' + inbound[:protocol].to_s + ')')
|
297
|
+
end
|
298
|
+
edge (from_cluster_id + '_' + cluster_id).to_sym, color: '#005580', headlabel: label.join(','), fontcolor: '#005580'
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
gv.save(filepath, :png)
|
305
|
+
end
|
229
306
|
end
|
230
307
|
|
231
308
|
class Util
|
@@ -236,5 +313,12 @@ module AwsGraph
|
|
236
313
|
return text
|
237
314
|
end
|
238
315
|
end
|
316
|
+
def format_range(ip_range)
|
317
|
+
if ip_range.sub(/\A[0-9]+\.\./,'') == ip_range.sub(/\.\.[0-9]+\z/,'')
|
318
|
+
return ip_range.sub(/\A[0-9]+\.\./,'')
|
319
|
+
else
|
320
|
+
return ip_range
|
321
|
+
end
|
322
|
+
end
|
239
323
|
end
|
240
324
|
end
|
data/lib/aws-graph/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-graph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- k1LoW
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|