aws-graph 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|