awsutils 2.2.1 → 2.2.2
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/.rubocop.yml +13 -1
- data/README.md +4 -0
- data/Rakefile +1 -1
- data/awsutils.gemspec +15 -10
- data/bin/ec2addsg +1 -1
- data/bin/ec2delsg +2 -2
- data/bin/ec2info +1 -1
- data/bin/ec2listmachines +1 -1
- data/lib/awsutils/awslogs.rb +15 -7
- data/lib/awsutils/ec2addsg.rb +9 -9
- data/lib/awsutils/ec2delsg.rb +41 -55
- data/lib/awsutils/ec2info.rb +19 -29
- data/lib/awsutils/ec2latestimage.rb +13 -16
- data/lib/awsutils/ec2listmachines.rb +153 -355
- data/lib/awsutils/ec2lsgrp.rb +1 -0
- data/lib/awsutils/ec2sg.rb +3 -1
- data/lib/awsutils/r53addrr.rb +11 -15
- data/lib/awsutils/r53ls.rb +5 -5
- data/lib/awsutils/version.rb +1 -1
- data/spec/lib/awsutils/ec2addsg_spec.rb +3 -3
- data/spec/lib/awsutils/ec2lsgrp_spec.rb +3 -2
- metadata +103 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6f564f3cde800c7bfba2e62dc78787b57f668dc03645ea7ff011f96012c96a4
|
4
|
+
data.tar.gz: f217eb9001d9b6e95c9d13b5bb30b1119451c73791926b2631beb0171d2b28bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 570c344850a9a697e6cae3ad60f8e7d80cb0c03250dca2c308dd2690b18f5e58e49339a94ec29b8caf918e4ebca2416bc3e0849919aeac2ffdb6f4902ca666db
|
7
|
+
data.tar.gz: c5de2f469b296d8ced025a93897a47043ab68d01e5bc659ce5f6ccfb3f9afe4de6b5e533bb75f24699ac7c2d0973cd19b27d7394124bfd75fb86a25c95adb5ae
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -24,6 +24,10 @@ awslogs
|
|
24
24
|
-------
|
25
25
|
Dumps logs from CloudWatch Logs for easy grepping (see `awslogs --help` for details).
|
26
26
|
|
27
|
+
ec2latestimage
|
28
|
+
--------------
|
29
|
+
Show a list of Ubuntu AMIs owned by your account.
|
30
|
+
|
27
31
|
ec2listmachines
|
28
32
|
---------------
|
29
33
|
Show a list of all EC2 instances in your account.
|
data/Rakefile
CHANGED
data/awsutils.gemspec
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require 'awsutils/version'
|
5
4
|
|
@@ -8,33 +7,39 @@ Gem::Specification.new do |spec|
|
|
8
7
|
spec.version = AwsUtils::VERSION
|
9
8
|
spec.authors = ['Eric Herot']
|
10
9
|
spec.email = ['eric.rubygems@herot.com']
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
10
|
+
spec.description = 'A set of tools for interacting with AWS'
|
11
|
+
spec.summary = 'A set of tools for interacting with AWS (summary)'
|
13
12
|
spec.homepage = 'http://github.com/evertrue/awsutils'
|
14
13
|
spec.license = 'MIT'
|
15
14
|
spec.metadata = {
|
16
15
|
'bug_tracker_uri' => 'https://github.com/evertrue/awsutils/issues',
|
17
|
-
'changelog_uri'
|
16
|
+
'changelog_uri' => 'https://github.com/evertrue/awsutils/releases',
|
18
17
|
'source_code_uri' => 'https://github.com/evertrue/awsutils'
|
19
18
|
}
|
20
19
|
|
21
20
|
spec.files = `git ls-files`.split($RS)
|
22
|
-
spec.executables
|
23
|
-
spec.test_files = spec.files.grep(
|
21
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
22
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
24
23
|
spec.require_paths = ['lib']
|
25
24
|
|
26
25
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
26
|
+
spec.add_development_dependency 'byebug'
|
27
27
|
spec.add_development_dependency 'pry'
|
28
28
|
spec.add_development_dependency 'rake'
|
29
29
|
spec.add_development_dependency 'rspec'
|
30
30
|
spec.add_development_dependency 'rubocop'
|
31
31
|
spec.add_development_dependency 'simplecov'
|
32
|
-
spec.add_development_dependency 'byebug'
|
33
32
|
|
34
33
|
spec.add_dependency 'awesome_print', '~> 1'
|
34
|
+
spec.add_dependency 'aws-sdk-cloudwatchlogs', '~> 1'
|
35
|
+
spec.add_dependency 'aws-sdk-ec2', '~> 1'
|
36
|
+
spec.add_dependency 'aws-sdk-elasticloadbalancing', '~> 1'
|
37
|
+
spec.add_dependency 'aws-sdk-elasticloadbalancingv2', '~> 1'
|
38
|
+
spec.add_dependency 'aws-sdk-route53', '~> 1'
|
39
|
+
spec.add_dependency 'colorize', '~> 0.8.1'
|
35
40
|
spec.add_dependency 'facets', '~> 2.9'
|
36
|
-
spec.add_dependency 'rainbow', '~> 2.0'
|
37
41
|
spec.add_dependency 'fog-aws', '~> 0.11.0'
|
42
|
+
spec.add_dependency 'highline', '~> 2.0'
|
38
43
|
spec.add_dependency 'optimist', '~> 3.0'
|
39
|
-
spec.add_dependency '
|
44
|
+
spec.add_dependency 'rainbow', '~> 2.0'
|
40
45
|
end
|
data/bin/ec2addsg
CHANGED
data/bin/ec2delsg
CHANGED
data/bin/ec2info
CHANGED
data/bin/ec2listmachines
CHANGED
data/lib/awsutils/awslogs.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'optimist'
|
2
|
-
require 'aws-sdk'
|
2
|
+
require 'aws-sdk-cloudwatchlogs'
|
3
3
|
require 'time'
|
4
4
|
|
5
5
|
class LogGroupNotFoundError < StandardError; end
|
@@ -10,9 +10,9 @@ class NoStreamsError < StandardError; end
|
|
10
10
|
|
11
11
|
module AwsUtils
|
12
12
|
class AwsLogs
|
13
|
-
LOG_LEVELS = %w
|
14
|
-
MAX_EVENTS =
|
15
|
-
MAX_STREAMS = 100
|
13
|
+
LOG_LEVELS = %w[TRACE DEBUG INFO NOTICE WARNING ERROR FATAL].freeze
|
14
|
+
MAX_EVENTS = 100_000
|
15
|
+
MAX_STREAMS = 100
|
16
16
|
|
17
17
|
def run
|
18
18
|
print_events
|
@@ -83,6 +83,7 @@ module AwsUtils
|
|
83
83
|
r = cloudwatchlogs.describe_log_groups log_group_name_prefix: opts[:group]
|
84
84
|
return r.log_groups.first.log_group_name if r.log_groups.count == 1
|
85
85
|
raise LogGroupNotFoundError if r.log_groups.empty?
|
86
|
+
|
86
87
|
err_msg = "Group filter #{opts[:group]} found multiple groups:\n\n"
|
87
88
|
err_msg += r.log_groups.map(&:log_group_name).join("\n")
|
88
89
|
err_msg += "\nMore than 50 log groups returned. Only showed the first 50." if r.next_token
|
@@ -102,6 +103,7 @@ module AwsUtils
|
|
102
103
|
collector = response.events
|
103
104
|
collector += chunk_events(streams_chunk, response.next_token) if response.next_token
|
104
105
|
raise TooManyEventsError if collector.count > MAX_EVENTS
|
106
|
+
|
105
107
|
collector
|
106
108
|
end
|
107
109
|
|
@@ -117,12 +119,14 @@ module AwsUtils
|
|
117
119
|
|
118
120
|
def filtered_log_events
|
119
121
|
return log_events unless opts[:request_id]
|
122
|
+
|
120
123
|
log_events.select { |event| event.message =~ /\b#{opts[:request_id]}\b/ }
|
121
124
|
end
|
122
125
|
|
123
126
|
def print_events
|
124
127
|
filtered_log_events.each do |ev|
|
125
|
-
|
128
|
+
# Check if the message is in the standard format
|
129
|
+
if ev.message !~ /^\[(INFO|DEBUG|WARNING|ERROR|NOTICE)\]/
|
126
130
|
print "#{ev.log_stream_name}: " if opts[:show_stream_name]
|
127
131
|
print Time.at(ev.timestamp / 1e3).iso8601(3) + ' ' if opts[:timestamp]
|
128
132
|
print ev.message
|
@@ -148,6 +152,7 @@ module AwsUtils
|
|
148
152
|
|
149
153
|
def show_logentry?(level)
|
150
154
|
return true unless LOG_LEVELS.include? level
|
155
|
+
|
151
156
|
LOG_LEVELS.index(level.upcase) >= LOG_LEVELS.index(opts[:log_level].upcase)
|
152
157
|
end
|
153
158
|
|
@@ -163,14 +168,17 @@ module AwsUtils
|
|
163
168
|
.log_streams
|
164
169
|
.select { |s| s.last_event_timestamp && s.last_event_timestamp > max_age_ts }
|
165
170
|
.map(&:log_stream_name)
|
166
|
-
|
171
|
+
raise NoStreamsError if token.nil? && collector.count.zero?
|
172
|
+
|
167
173
|
collector += streams(response.next_token) if response.next_token
|
168
|
-
|
174
|
+
raise TooManyStreamsError if collector.count > MAX_STREAMS
|
175
|
+
|
169
176
|
collector
|
170
177
|
end
|
171
178
|
|
172
179
|
def max_age_ts
|
173
180
|
return 0 unless opts[:age]
|
181
|
+
|
174
182
|
(Time.at(Time.now - opts[:age]).to_f * 1_000).to_i
|
175
183
|
end
|
176
184
|
|
data/lib/awsutils/ec2addsg.rb
CHANGED
@@ -9,7 +9,7 @@ module AwsUtils
|
|
9
9
|
@g_obj ||= begin
|
10
10
|
connection.security_groups.new(
|
11
11
|
name: @opts[:security_group],
|
12
|
-
description:
|
12
|
+
description: @opts[:description].to_s,
|
13
13
|
vpc_id: @opts[:vpc_id]
|
14
14
|
)
|
15
15
|
end
|
@@ -18,12 +18,12 @@ module AwsUtils
|
|
18
18
|
def generate_rule_hash(rule)
|
19
19
|
if rule['source']
|
20
20
|
if rule['dest']
|
21
|
-
|
21
|
+
raise 'One of the predefined rules has both a source ' \
|
22
22
|
'and a destination already defined: ' + rule.inspect
|
23
23
|
end
|
24
24
|
if rule['source'] !~ /\./ &&
|
25
25
|
!current_groups.include?(rule['source'])
|
26
|
-
|
26
|
+
raise "Group #{rule['source']} specified as part of rule: " \
|
27
27
|
"#{rule.inspect} does not exist"
|
28
28
|
end
|
29
29
|
end
|
@@ -31,7 +31,7 @@ module AwsUtils
|
|
31
31
|
if !rule['dest']
|
32
32
|
rule['dest'] = @new_group_id
|
33
33
|
elsif !current_groups.include?(rule['dest'])
|
34
|
-
|
34
|
+
raise "Group #{rule['dest']} specified as part of rule: " \
|
35
35
|
"#{rule.inspect} does not exist"
|
36
36
|
end
|
37
37
|
|
@@ -46,7 +46,7 @@ module AwsUtils
|
|
46
46
|
|
47
47
|
if rule['source'] =~ /\./
|
48
48
|
ip_permissions['Groups'] = []
|
49
|
-
ip_permissions['IpRanges'] = [
|
49
|
+
ip_permissions['IpRanges'] = ['CidrIp' => rule['source']]
|
50
50
|
elsif rule['source']
|
51
51
|
ip_permissions['Groups'] = [
|
52
52
|
{
|
@@ -114,7 +114,7 @@ module AwsUtils
|
|
114
114
|
rules.select { |rule| rule['dest'] }.each do |rule|
|
115
115
|
add_rule_to_other_group(rule)
|
116
116
|
end
|
117
|
-
rescue => e
|
117
|
+
rescue StandardError => e
|
118
118
|
connection.delete_security_group(nil, g_obj.group_id)
|
119
119
|
raise e
|
120
120
|
end
|
@@ -133,13 +133,13 @@ module AwsUtils
|
|
133
133
|
|
134
134
|
if @opts[:environment]
|
135
135
|
if !rules_data['env']
|
136
|
-
|
136
|
+
raise "Environment #{@opts[:environment]} not present in rules file" \
|
137
137
|
" (#{@opts[:base_rules_file]})."
|
138
138
|
else
|
139
139
|
rules_env_data = rules_data['env'][@opts[:environment]]
|
140
140
|
end
|
141
141
|
elsif rules_data.class != Array
|
142
|
-
|
142
|
+
raise 'base_rules_file is an environment-keyed file but you did ' \
|
143
143
|
'not specify an environment.'
|
144
144
|
else
|
145
145
|
rules_env_data = rules_data
|
@@ -165,7 +165,7 @@ module AwsUtils
|
|
165
165
|
end
|
166
166
|
|
167
167
|
def parse_opts
|
168
|
-
|
168
|
+
raise 'AWS_OWNER_ID is not set!' unless ENV['AWS_OWNER_ID']
|
169
169
|
|
170
170
|
@opts = Optimist.options do
|
171
171
|
opt :security_group,
|
data/lib/awsutils/ec2delsg.rb
CHANGED
@@ -3,68 +3,58 @@
|
|
3
3
|
require 'awsutils/ec2sg'
|
4
4
|
|
5
5
|
module AwsUtils
|
6
|
-
|
7
6
|
class Ec2DeleteSecurityGroup < Ec2SecurityGroup
|
8
|
-
|
9
7
|
def references
|
10
|
-
|
11
8
|
@references ||= begin
|
12
|
-
|
13
9
|
references = []
|
14
10
|
|
15
11
|
connection.security_groups.each do |group|
|
16
12
|
group.ip_permissions.each do |ip_perm|
|
17
|
-
ip_perm[
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end # group.ip_permissions.each do |ip_perm|
|
45
|
-
end # connection.security_groups.each do |group|
|
13
|
+
ip_perm['groups'].each do |src_grp|
|
14
|
+
next unless src_grp['groupName'] == @opts[:security_group]
|
15
|
+
|
16
|
+
options = {
|
17
|
+
'IpPermissions' => [
|
18
|
+
{
|
19
|
+
'FromPort' => ip_perm['fromPort'],
|
20
|
+
'Groups' => [
|
21
|
+
{
|
22
|
+
'GroupName' => @opts[:security_group],
|
23
|
+
'UserId' => @opts[:owner_group_id]
|
24
|
+
}
|
25
|
+
],
|
26
|
+
'IpProtocol' => ip_perm['ipProtocol'],
|
27
|
+
'IpRanges' => [],
|
28
|
+
'ToPort' => ip_perm['toPort']
|
29
|
+
}
|
30
|
+
]
|
31
|
+
}
|
32
|
+
|
33
|
+
references << {
|
34
|
+
'group_name' => group.name,
|
35
|
+
'options' => options
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
46
40
|
|
47
41
|
references
|
48
|
-
end
|
49
|
-
end
|
42
|
+
end
|
43
|
+
end
|
50
44
|
|
51
45
|
def delete_group_refs
|
52
|
-
|
53
46
|
references.each do |ref|
|
47
|
+
puts 'Removing rule: ' + ref.inspect
|
54
48
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
ref["options"]
|
60
|
-
)
|
61
|
-
|
49
|
+
connection.revoke_security_group_ingress(
|
50
|
+
ref['group_name'],
|
51
|
+
ref['options']
|
52
|
+
)
|
62
53
|
end
|
63
|
-
|
64
54
|
end
|
65
55
|
|
66
|
-
def initialize(
|
67
|
-
@opts = Ec2SecurityGroup.parse_opts(
|
56
|
+
def initialize(args)
|
57
|
+
@opts = Ec2SecurityGroup.parse_opts(args)
|
68
58
|
end
|
69
59
|
|
70
60
|
def name
|
@@ -72,25 +62,21 @@ module AwsUtils
|
|
72
62
|
end
|
73
63
|
|
74
64
|
def run
|
75
|
-
|
76
|
-
|
77
|
-
puts "Specified group does not exist."
|
65
|
+
unless exist?
|
66
|
+
puts 'Specified group does not exist.'
|
78
67
|
exit 1
|
79
68
|
end
|
80
69
|
|
81
70
|
if assigned?
|
82
|
-
puts
|
71
|
+
puts 'Group is still assigned to one or more instances.'
|
83
72
|
exit 1
|
84
73
|
end
|
85
74
|
|
86
75
|
delete_group_refs
|
87
76
|
|
88
77
|
puts "Deleting group #{@opts[:security_group]}."
|
89
|
-
connection.delete_security_group(
|
90
|
-
connection.security_groups.get(@opts[:security_group]).group_id
|
91
|
-
|
78
|
+
connection.delete_security_group(nil,
|
79
|
+
connection.security_groups.get(@opts[:security_group]).group_id)
|
92
80
|
end
|
93
|
-
|
94
81
|
end
|
95
|
-
|
96
82
|
end
|
data/lib/awsutils/ec2info.rb
CHANGED
@@ -14,7 +14,7 @@ class String
|
|
14
14
|
def title_case
|
15
15
|
underscore.split('_').map do |word|
|
16
16
|
# Recognize certain special cases (e.g. acronyms)
|
17
|
-
if %w
|
17
|
+
if %w[iam ebs id dns vpc].include? word.downcase
|
18
18
|
word.upcase
|
19
19
|
elsif word.casecmp('ids').zero?
|
20
20
|
'IDs'
|
@@ -51,7 +51,7 @@ module AwsUtils
|
|
51
51
|
# TODO: Naming/MemoizedInstanceVariableName: Memoized variable @instance_ids does
|
52
52
|
# not match method name instances.
|
53
53
|
def instances
|
54
|
-
@
|
54
|
+
@instances ||= begin
|
55
55
|
if $DEBUG
|
56
56
|
puts 'Entering instance_ids'
|
57
57
|
puts "Search Term: #{search_terms.inspect}"
|
@@ -65,6 +65,7 @@ module AwsUtils
|
|
65
65
|
next unless server.tags.key?('Name') \
|
66
66
|
&& (server.tags['Name'] != '') \
|
67
67
|
&& (/#{search_term}/i =~ server.tags['Name'])
|
68
|
+
|
68
69
|
m << server.id
|
69
70
|
end
|
70
71
|
end
|
@@ -75,7 +76,7 @@ module AwsUtils
|
|
75
76
|
exit 1
|
76
77
|
end
|
77
78
|
|
78
|
-
puts "Found instances: #{
|
79
|
+
puts "Found instances: #{instance_ids.inspect}" if $DEBUG
|
79
80
|
|
80
81
|
ec2.servers.all 'instance-id' => instance_ids
|
81
82
|
end
|
@@ -131,17 +132,14 @@ module AwsUtils
|
|
131
132
|
'ID',
|
132
133
|
'Group',
|
133
134
|
'Flavor',
|
134
|
-
'State'
|
135
|
-
)
|
136
|
-
|
137
|
-
instance_ids.each do |instance_id|
|
138
|
-
inst = ec2.servers.get(instance_id)
|
135
|
+
'State')
|
139
136
|
|
137
|
+
instances.each do |inst|
|
140
138
|
s_color = get_state_color(inst.state)
|
141
139
|
f_color = get_flavor_color(inst.flavor_id)
|
142
140
|
|
143
141
|
printf(
|
144
|
-
"%-50s %-11s %-12s %-13s #{f_color}%-10s#{reset_color} #{s_color}%s#{reset_color}",
|
142
|
+
"%-50s %-11s %-12s %-13s #{f_color}%-10s#{reset_color} #{s_color}%s#{reset_color}\n",
|
145
143
|
inst.tags['Name'],
|
146
144
|
inst.availability_zone,
|
147
145
|
inst.id,
|
@@ -157,16 +155,15 @@ module AwsUtils
|
|
157
155
|
reset_color = "\033[0m"
|
158
156
|
|
159
157
|
print "#{key_color}#{key.to_s.title_case}:#{reset_color} "
|
160
|
-
|
161
|
-
when value.respond_to?(:to_sym)
|
158
|
+
if value.respond_to?(:to_sym)
|
162
159
|
puts value
|
163
|
-
|
160
|
+
elsif value.respond_to?(:key?)
|
164
161
|
puts
|
165
162
|
value.each { |k, v| printkv " #{k}", v }
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
163
|
+
# If value only contains strings, do this
|
164
|
+
elsif value.respond_to?(:join) &&
|
165
|
+
value.reject { |item| item.respond_to?(:to_sym) }.empty?
|
166
|
+
|
170
167
|
value.join(', ')
|
171
168
|
else
|
172
169
|
puts value.inspect
|
@@ -246,9 +243,7 @@ module AwsUtils
|
|
246
243
|
|
247
244
|
end
|
248
245
|
|
249
|
-
if vol != instance.block_device_mapping.last
|
250
|
-
puts "\t---------------------------------------"
|
251
|
-
end
|
246
|
+
puts "\t---------------------------------------" if vol != instance.block_device_mapping.last
|
252
247
|
end
|
253
248
|
|
254
249
|
when :client_token
|
@@ -262,6 +257,7 @@ module AwsUtils
|
|
262
257
|
group = ec2.security_groups.get(group_id)
|
263
258
|
|
264
259
|
next unless group
|
260
|
+
|
265
261
|
puts "#{key_color}Security Group:#{reset_color} #{group.name}"
|
266
262
|
puts "\t#{key_color}Description:#{reset_color} #{group.description}"
|
267
263
|
puts "\t#{key_color}ID:#{reset_color} #{group.group_id}"
|
@@ -285,17 +281,11 @@ module AwsUtils
|
|
285
281
|
|
286
282
|
puts "\t#{key_color}Name:#{reset_color} #{image_obj.name}" if defined?(image_obj.name)
|
287
283
|
|
288
|
-
if defined?(image_obj.description)
|
289
|
-
puts "\t#{key_color}Description:#{reset_color} #{image_obj.description}"
|
290
|
-
end
|
284
|
+
puts "\t#{key_color}Description:#{reset_color} #{image_obj.description}" if defined?(image_obj.description)
|
291
285
|
|
292
|
-
if defined?(image_obj.location)
|
293
|
-
puts "\t#{key_color}Location:#{reset_color} #{image_obj.location}"
|
294
|
-
end
|
286
|
+
puts "\t#{key_color}Location:#{reset_color} #{image_obj.location}" if defined?(image_obj.location)
|
295
287
|
|
296
|
-
if defined?(image_obj.architecture)
|
297
|
-
puts "\t#{key_color}Arch:#{reset_color} #{image_obj.architecture}"
|
298
|
-
end
|
288
|
+
puts "\t#{key_color}Arch:#{reset_color} #{image_obj.architecture}" if defined?(image_obj.architecture)
|
299
289
|
|
300
290
|
if defined?(image_obj.tags) && (image_obj.tags != {})
|
301
291
|
puts "\t#{key_color}Tags:#{reset_color}"
|
@@ -323,7 +313,7 @@ module AwsUtils
|
|
323
313
|
puts "#{key_color}State:#{reset_color} #{state_color}#{instance.state}#{reset_color}"
|
324
314
|
when :state_reason
|
325
315
|
if instance.state_reason.any?
|
326
|
-
puts "#{key_color}State Reason Code:#{reset_color} #{instance.state_reason[
|
316
|
+
puts "#{key_color}State Reason Code:#{reset_color} #{instance.state_reason['Code']}"
|
327
317
|
elsif $DEBUG
|
328
318
|
puts "#{key_color}State Reason Code:#{reset_color} N/A"
|
329
319
|
end
|