Class: Cucloud::Ec2Utils
- Inherits:
-
Object
- Object
- Cucloud::Ec2Utils
- Defined in:
- lib/cucloud/ec2_utils.rb
Overview
EC2Utils class - anything ec2 related goes here!
Constant Summary collapse
- UBUNTU_PATCH_COMMAND =
This is the command sent to ubuntu for patching
'apt-get update; apt-get -y upgrade; reboot'.freeze
- AMAZON_PATCH_COMMAND =
This is the command sent to amazon linux machines for patching
'yum update -y; reboot & disown '.freeze
- SECONDS_IN_A_DAY =
Used in time calculations
86_400
- WAITER_MAX_ATTEMPS =
Max attemps for a waiter to try
240
- WAITER_DELAY =
Delay between calls used by waiter to check status
15
Instance Method Summary collapse
-
#associate_eip(instance, allocation_id) ⇒ Object
Assoications an Elastic IP adress with a specific instance number.
-
#backup_volumes_unless_recent_backup(days = 5) ⇒ Array<Hash>
Preforms a backup on volumes that do not have a recent snapshot_info.
-
#create_ebs_snapshot(volume_id, snapshot_desc, tags = []) ⇒ Object
Create a snapshot of an EBS volume and apply supplied tags will wait 20 minutes for the process to completed http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Client.html#create_tags-instance_method.
-
#create_instance(options) ⇒ Object
Create ec2 instance based on parameters provided.
-
#deregister_image(image) ⇒ Object
Remove private AMI.
-
#find_ami(name) ⇒ Object
Find ami based on a search of Name.
-
#find_ebs_snapshots(options = {}) ⇒ Array
Find snapshots with supplied properties, currently only supports days_old.
-
#get_instance(instance_id) ⇒ Aws::EC2::Instance
Get instance object http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Instance.html.
-
#get_instance_information(instance) ⇒ array
Get instance information for a specific instance.
-
#get_instance_name(instance_id) ⇒ String
Get the nice name of the ec2 intsance from the 'Name" tag'.
-
#get_instances_by_tag(tag_name, tag_value) ⇒ array
Based on tag name and value, return instances.
-
#initialize(ec2_client = Aws::EC2::Client.new, ssm_utils = Cucloud::SSMUtils.new) ⇒ Ec2Utils
constructor
A new instance of Ec2Utils.
-
#instances_to_patch_by_tag(tag_name = 'auto_patch', tag_value = ['1']) ⇒ Object
patch instances based on a tag name and value.
-
#reboot_instance(instance) ⇒ Object
reboot instance.
-
#rename_instance(instance, name) ⇒ Object
Set the name of the instance that will be displayed in the ec2 console.
-
#start_instance(instance) ⇒ Object
Start ec2 instance for a specific instance number.
-
#start_instances_by_tag(tag_name, tag_value) ⇒ Object
start instances based on a tag name and value.
-
#stop_instance(instance) ⇒ Object
Stop ec2 instance for a specific instance number.
-
#stop_instances_by_tag(tag_name, tag_value) ⇒ Object
stop instances based on a tag name and value.
-
#terminate_instance(instance) ⇒ Object
Terminate ec2 instance for a specific instance number.
-
#volumes_with_snapshot_within_last_days(days = 5) ⇒ Array
Find volumes that have a recent snapshot.
Constructor Details
#initialize(ec2_client = Aws::EC2::Client.new, ssm_utils = Cucloud::SSMUtils.new) ⇒ Ec2Utils
Returns a new instance of Ec2Utils.
15 16 17 18 |
# File 'lib/cucloud/ec2_utils.rb', line 15 def initialize(ec2_client = Aws::EC2::Client.new, ssm_utils = Cucloud::SSMUtils.new) @ec2 = ec2_client @ssm_utils = ssm_utils end |
Instance Method Details
#associate_eip(instance, allocation_id) ⇒ Object
Assoications an Elastic IP adress with a specific instance number.
70 71 |
# File 'lib/cucloud/ec2_utils.rb', line 70 def associate_eip(instance, allocation_id) end |
#backup_volumes_unless_recent_backup(days = 5) ⇒ Array<Hash>
Preforms a backup on volumes that do not have a recent snapshot_info
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/cucloud/ec2_utils.rb', line 185 def backup_volumes_unless_recent_backup(days = 5) volumes_backed_up_recently = volumes_with_snapshot_within_last_days(days) snapshots_created = [] volumes = @ec2.describe_volumes(filters: [{ name: 'attachment.status', values: ['attached'] }]) volumes.volumes.each do |volume| next if volumes_backed_up_recently[volume.volume_id.to_s] instance_name = get_instance_name(volume.[0].instance_id) = instance_name ? [{ key: 'Instance Name', value: instance_name }] : [] snapshot_info = create_ebs_snapshot(volume.volume_id, 'auto-ebs-snap-' + Time.now.strftime('%Y-%m-%d-%H:%M:%S'), ) snapshots_created.push(snapshot_id: snapshot_info.snapshot_id, instance_name: instance_name, volume: volume.volume_id) end snapshots_created end |
#create_ebs_snapshot(volume_id, snapshot_desc, tags = []) ⇒ Object
Create a snapshot of an EBS volume and apply supplied tags will wait 20 minutes for the process to completed http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Client.html#create_tags-instance_method
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/cucloud/ec2_utils.rb', line 166 def create_ebs_snapshot(volume_id, snapshot_desc, = []) snapshot_info = @ec2.create_snapshot( volume_id: volume_id, description: snapshot_desc ) @ec2.wait_until(:snapshot_completed, snapshot_ids: [snapshot_info.snapshot_id]) do |w| w.max_attempts = WAITER_MAX_ATTEMPS w.delay = WAITER_DELAY end @ec2.(resources: [snapshot_info.snapshot_id], tags: ) unless .empty? snapshot_info end |
#create_instance(options) ⇒ Object
Create ec2 instance based on parameters provided. The function will pull in default information from ?????.
76 77 |
# File 'lib/cucloud/ec2_utils.rb', line 76 def create_instance() end |
#deregister_image(image) ⇒ Object
Remove private AMI
80 81 |
# File 'lib/cucloud/ec2_utils.rb', line 80 def deregister_image(image) end |
#find_ami(name) ⇒ Object
Find ami based on a search of Name
84 85 |
# File 'lib/cucloud/ec2_utils.rb', line 84 def find_ami(name) end |
#find_ebs_snapshots(options = {}) ⇒ Array
Find snapshots with supplied properties, currently only supports days_old
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 |
# File 'lib/cucloud/ec2_utils.rb', line 225 def find_ebs_snapshots( = {}) days_old = [:days_old] found_snapshots = [] snapshots = @ec2.describe_snapshots(owner_ids: ['self'], filters: [{ name: 'status', values: ['completed'] }]) snapshots.snapshots.each do |snapshot| if !days_old.nil? snapshot_days_old = (Time.now.to_i - snapshot.start_time.to_i) / SECONDS_IN_A_DAY if snapshot_days_old > days_old found_snapshots.push(snapshot.snapshot_id) end else found_snapshots.push(snapshot.snapshot_id) end end found_snapshots end |
#get_instance(instance_id) ⇒ Aws::EC2::Instance
Get instance object http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Instance.html
24 25 26 |
# File 'lib/cucloud/ec2_utils.rb', line 24 def get_instance(instance_id) Aws::EC2::Instance.new(id: instance_id, client: @ec2) end |
#get_instance_information(instance) ⇒ array
Get instance information for a specific instance
32 33 34 |
# File 'lib/cucloud/ec2_utils.rb', line 32 def get_instance_information(instance) @ec2.describe_instances(instance_ids: [instance]) end |
#get_instance_name(instance_id) ⇒ String
Get the nice name of the ec2 intsance from the 'Name" tag'
153 154 155 156 157 |
# File 'lib/cucloud/ec2_utils.rb', line 153 def get_instance_name(instance_id) instance = get_instance(instance_id) tag_name = instance..find { |tag| tag.key.eql?('Name') } tag_name ? tag_name.value : nil end |
#get_instances_by_tag(tag_name, tag_value) ⇒ array
Based on tag name and value, return instances
92 93 94 95 96 97 98 99 |
# File 'lib/cucloud/ec2_utils.rb', line 92 def get_instances_by_tag(tag_name, tag_value) @ec2.describe_instances(filters: [ { name: "tag:#{tag_name}", values: tag_value } ]) end |
#instances_to_patch_by_tag(tag_name = 'auto_patch', tag_value = ['1']) ⇒ Object
patch instances based on a tag name and value
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/cucloud/ec2_utils.rb', line 122 def instances_to_patch_by_tag(tag_name = 'auto_patch', tag_value = ['1']) resp = get_instances_by_tag(tag_name, tag_value) ubuntu_patch_instances = [] amazon_patch_instances = [] all_instances = [] resp.reservations.each do |res| res.instances.each do |instance| instance..each do |tag| next unless tag.key.eql?('os') if tag.value.eql?('ubuntu') ubuntu_patch_instances.push(instance.instance_id) all_instances.push(instance.instance_id) elsif tag.value.eql?('ecs') || tag.value.eql?('amazon') amazon_patch_instances.push(instance.instance_id) all_instances.push(instance.instance_id) end end end end @ssm_utils.send_patch_command(ubuntu_patch_instances, UBUNTU_PATCH_COMMAND) if ubuntu_patch_instances.any? @ssm_utils.send_patch_command(amazon_patch_instances, AMAZON_PATCH_COMMAND) if amazon_patch_instances.any? all_instances end |
#reboot_instance(instance) ⇒ Object
reboot instance
55 56 57 58 |
# File 'lib/cucloud/ec2_utils.rb', line 55 def reboot_instance(instance) i = get_instance(instance) i.reboot end |
#rename_instance(instance, name) ⇒ Object
Set the name of the instance that will be displayed in the ec2 console
51 52 |
# File 'lib/cucloud/ec2_utils.rb', line 51 def rename_instance(instance, name) end |
#start_instance(instance) ⇒ Object
Start ec2 instance for a specific instance number. The function will wait until the instance has entered the running state.
46 47 48 |
# File 'lib/cucloud/ec2_utils.rb', line 46 def start_instance(instance) @ec2.start_instances(instance_ids: [instance]) end |
#start_instances_by_tag(tag_name, tag_value) ⇒ Object
start instances based on a tag name and value
113 114 115 116 117 |
# File 'lib/cucloud/ec2_utils.rb', line 113 def start_instances_by_tag(tag_name, tag_value) get_instances_by_tag(tag_name, tag_value).reservations[0].instances.each do |i| @ec2.start_instances(instance_ids: [i.instance_id]) end end |
#stop_instance(instance) ⇒ Object
Stop ec2 instance for a specific instance number. The function will wait until the instance has entered the stopped state.
39 40 41 |
# File 'lib/cucloud/ec2_utils.rb', line 39 def stop_instance(instance) @ec2.stop_instances(instance_ids: [instance]) end |
#stop_instances_by_tag(tag_name, tag_value) ⇒ Object
stop instances based on a tag name and value
104 105 106 107 108 |
# File 'lib/cucloud/ec2_utils.rb', line 104 def stop_instances_by_tag(tag_name, tag_value) get_instances_by_tag(tag_name, tag_value).reservations[0].instances.each do |i| @ec2.stop_instances(instance_ids: [i.instance_id]) end end |
#terminate_instance(instance) ⇒ Object
Terminate ec2 instance for a specific instance number.
61 62 63 64 |
# File 'lib/cucloud/ec2_utils.rb', line 61 def terminate_instance(instance) i = get_instance(instance) i.terminate end |
#volumes_with_snapshot_within_last_days(days = 5) ⇒ Array
Find volumes that have a recent snapshot
210 211 212 213 214 215 216 217 218 219 220 |
# File 'lib/cucloud/ec2_utils.rb', line 210 def volumes_with_snapshot_within_last_days(days = 5) volumes_backed_up_recently = {} snapshots = @ec2.describe_snapshots(owner_ids: ['self'], filters: [{ name: 'status', values: ['completed'] }]) snapshots.snapshots.each do |snapshot| if snapshot.start_time > Time.now - (SECONDS_IN_A_DAY * days) volumes_backed_up_recently[snapshot.volume_id.to_s] = true end end volumes_backed_up_recently end |