ebs_tagger 1.0.0

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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/bin/ebs_tagger +171 -0
  3. metadata +61 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ad08ec14733feab6a60b83530fe7f63c225b3530
4
+ data.tar.gz: 07dc2941799220c263dd5135898cab40998e8647
5
+ SHA512:
6
+ metadata.gz: c968621dc9c1f5a9cdab921d894286b994cc3f5fbbdb5a97fbdb9edbb75f336fef15be81a0a151ab33f7b775fce6d01102074d771c6b5f16dba6906793dcf312
7
+ data.tar.gz: 4b94ffc73e87e5199279727f574a3dc9c7b197e9a807a224ab10c78a4df77cc7591a2eea4a888206c03905f7d4791565e6c82c5e6d005b9f36ddb0fac7ebe41d
data/bin/ebs_tagger ADDED
@@ -0,0 +1,171 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This script is designed to go through all AWS instances
4
+ # and add their tags to each associated ebs volume.
5
+
6
+ require 'aws-sdk'
7
+ require 'optparse'
8
+
9
+ options = {}
10
+ creds = {}
11
+ OptionParser.new do |parser|
12
+ parser.on("-i", "--id ACCESS_ID", "The AWS access ID") do |access_id|
13
+ creds['access_id'] = access_id
14
+ end
15
+ parser.on("-k", "--key SECRET_KEY", "The AWS access key") do |secret_key|
16
+ creds['secret_key'] = secret_key
17
+ end
18
+ parser.on("-r", "--regions REGIONS", "Comma-separated list of AWS regions to sync tags for") do |regions|
19
+ options[:regions] = regions.split(",")
20
+ end
21
+ parser.on("--add-id", "Tag each volume with the Instance ID of the instance it is attached to") do |add_id|
22
+ options[:add_id] = add_id
23
+ end
24
+ parser.on("--only ONLY", "Comma-separated list of specific tags to sync from instances to volumes") do |only_tags|
25
+ options[:only] = only_tags.split(",")
26
+ end
27
+ parser.on("--ignore IGNORE", "Comma-separated list of tags to NOT sync, overrides --only") do |ignored_tags|
28
+ options[:ignore] = ignored_tags.split(",")
29
+ end
30
+ end.parse!
31
+
32
+ if !creds['access_id']
33
+ raise Exception.new 'You must provide an AWS access ID (--id)'
34
+ elsif !creds['secret_key']
35
+ raise Exception.new 'You must provide an AWS access key (--key)'
36
+ elsif !options[:regions]
37
+ raise Exception.new 'You must provide an at least one AWS Region (--regions)'
38
+ end
39
+
40
+ @too_many_tags_errors = 0
41
+
42
+ def tag_volume volume, instance_tags, instance_id, volume_tags, ignored_tags
43
+ begin
44
+ if instance_id
45
+ instance_tags["Instance ID"] = instance_id
46
+ end
47
+ if instance_tags.empty?
48
+ puts "No tags to sync to this volume"
49
+ end
50
+ instance_tags.each do |tag_key, tag_value|
51
+ if ignored_tags && (ignored_tags.include? tag_key)
52
+ puts "Ignoring \"#{tag_key}\""
53
+ else
54
+ if tag_key[0 .. 3] == 'aws:'
55
+ puts "\"#{tag_key}\" is reserved for internal use"
56
+ else
57
+ if (volume_tags[tag_key] == tag_value)
58
+ puts "\"#{tag_key} => #{tag_value}\" unchanged"
59
+ else
60
+ volume.create_tags({tags: [{key: tag_key, value: tag_value}]})
61
+ if volume_tags[tag_key]
62
+ puts "\"#{tag_key} => #{tag_value}\" updated on volume"
63
+ else
64
+ puts "\"#{tag_key} => #{tag_value}\" added to volume"
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ rescue Aws::EC2::Errors::TagLimitExceeded
71
+ puts "WARNING: TOO MANY TAGS"
72
+ @too_many_tags_errors += 1
73
+ end
74
+ end
75
+
76
+ def get_tags thing
77
+ tags = {}
78
+ thing.tags.each do |tag|
79
+ tags[tag.key] = tag.value
80
+ end
81
+ tags
82
+ end
83
+
84
+ def create_resource credentials, region
85
+ Aws.config[:credentials] = credentials
86
+ Aws.config[:region] = region
87
+ begin
88
+ ec2_resource = Aws::EC2::Resource.new
89
+
90
+ # check if credentials passed
91
+ ec2_resource.security_groups.count
92
+ puts "Your credentials have passed"
93
+ rescue Aws::EC2::Errors::AuthFailure
94
+ puts "UNAUTHORIZED: Your credentials have failed"
95
+ exit 2
96
+ end
97
+ ec2_resource
98
+ end
99
+
100
+
101
+ begin
102
+ # Establish AWS EC2 credentials
103
+ aws_credentials = Aws::Credentials.new(creds['access_id'], creds['secret_key'])
104
+
105
+ options[:regions].each do |region|
106
+ ec2_resource = create_resource aws_credentials, region
107
+ puts "Syncing tags on #{region} instances..."
108
+
109
+ instance_tracker = 0
110
+ instance_count = ec2_resource.instances.count
111
+
112
+ ec2_resource.instances.each do |instance|
113
+ puts Time.now
114
+ instance_id = instance.id
115
+ instance_tags = get_tags instance
116
+ puts "#{instance_id} - #{instance_tags['Name']}"
117
+ puts "----------"
118
+ puts "#{instance.volumes.count} volume(s)"
119
+
120
+
121
+ if options[:only]
122
+ only_tags = {}
123
+ options[:only].each do |tag|
124
+ if instance_tags[tag]
125
+ only_tags[tag] = instance_tags[tag]
126
+ end
127
+ end
128
+ instance_tags = only_tags
129
+ end
130
+
131
+
132
+ instance.volumes.each do |volume|
133
+ retries = 1
134
+ begin
135
+ puts volume.id
136
+ volume_tags = get_tags volume
137
+ instance_id = false if !options[:add_id]
138
+ tag_volume volume, instance_tags, instance_id, volume_tags, options[:ignore]
139
+ rescue Aws::EC2::Errors::RequestLimitExceeded
140
+ if retries <= 5
141
+ puts "AWS Request Limit Exceeded. Waiting #{5 * retries} seconds to retry..."
142
+ sleep (5 * retries)
143
+ retry
144
+ else
145
+ puts "Too many retries on this volume, exiting"
146
+ exit
147
+ end
148
+ end
149
+ end
150
+ instance_tracker += 1
151
+ puts "#{region}: Instance #{instance_tracker} of #{instance_count} done\n\n"
152
+ sleep 3
153
+ end
154
+ puts "#{region}: EBS Volume tagging complete"
155
+ if too_many_tags_errors > 0
156
+ puts "# of TOO MANY TAGS errors: #{too_many_tags_errors}"
157
+ end
158
+ end
159
+
160
+
161
+
162
+ rescue Aws::EC2::Errors::RequestLimitExceeded
163
+ if retries <= 5
164
+ puts "AWS Request Limit Exceeded. Waiting #{10 * retries} seconds to retry..."
165
+ sleep (10 * retries)
166
+ retry
167
+ else
168
+ puts "Too many retries on this instance, exiting"
169
+ exit
170
+ end
171
+ end
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ebs_tagger
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Hunter Wong
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-03-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2'
27
+ description: Goes through all AWS instances in a region and tags their attached volumes
28
+ with their own tags
29
+ email: quishee@gmail.com
30
+ executables:
31
+ - ebs_tagger
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - bin/ebs_tagger
36
+ homepage: https://bitbucket.org/oryhara/ebs_tagger/src
37
+ licenses:
38
+ - MIT
39
+ metadata: {}
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubyforge_project:
56
+ rubygems_version: 2.5.1
57
+ signing_key:
58
+ specification_version: 4
59
+ summary: Tags EBS volumes
60
+ test_files: []
61
+ has_rdoc: