Skip to content

Instantly share code, notes, and snippets.

@mechamogera
Last active October 13, 2015 20:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save mechamogera/4248981 to your computer and use it in GitHub Desktop.
Save mechamogera/4248981 to your computer and use it in GitHub Desktop.
EBSボリュームのスナップショットを作成するrubyスクリプト

スクリプト概要

  • 指定されたEBSボリュームのスナップショットを作成する。
  • 指定があった場合は指定された世代数を残して過去のスナップショットを削除する

使用方法

  • 以下のようにしてスクリプトを取得する。もしくは、downloadして解凍。
 $ git clone https://gist.github.com/4248981.git
  • 実行
 $ ruby create_ebs_snapshot.rb --help
Usage: create_ebs_snapshot [options]
    -a, --access-key-id
    -s, --secret-access-key=VAL
    -v, --volume-id=VAL
    -e, --endpoint=VAL               Default:ap-northeast-1
    -d, --snapshot-description=VAL   Default:2012/12/11 00:06:04 backuped by create_ebs_snapshot.rb
    -n, --snapshot-name=VAL          Default:[volume_id]-2012/12/11_00:06:04
    -g=VAL                           Default:all snapshot is not removed
        --snapshot-genaration-number

EC2での使用方法

$ sudo yum update -y
$ sudo yum install rubygem-aws-sdk git -y

$ git clone git://gist.github.com/4248981.git
$ cd 4248981
$ ruby create_ebs_snapshot.rb -a [access-key-id] -s [secret-access-key] -v vol-123abc -g 5
require 'rubygems'
require 'aws-sdk'
require 'optparse'
access_key_id = nil
secret_access_key = nil
endpoint = 'ap-northeast-1'
volume_id = nil
now_time = Time.now
description = "#{now_time.strftime("%Y/%m/%d %H:%M:%S backuped by #{$0}")}"
name = nil
generation_number = nil
opt = OptionParser.new
opt.on('-a', '--access-key-id=VAL') { |v| acccess_key_id = v }
opt.on('-s', '--secret-access-key=VAL') { |v| secret_access_key = v }
opt.on('-v', '--volume-id=VAL') { |v| volume_id = v }
opt.on('-e', '--endpoint=VAL', "Default:#{endpoint}") { |v| endpoint = v }
opt.on('-d', '--snapshot-description=VAL', "Default:#{description}") { |v| description = v }
opt.on('-n',
'--snapshot-name=VAL',
"Default:#{now_time.strftime("[volume_id]-%Y/%m/%d_%H:%M:%S")}") { |v| name = v }
opt.on('-g',
'--snapshot-genaration-number=VAL',
"Default:all snapshot is not removed") { |v| generation_number = v.to_i }
opt.parse!
name = now_time.strftime("#{volume_id}-%Y/%m/%d_%H:%M:%S") unless name
raise "volume-id is necessary,-h or --help option" unless volume_id
AWS.config(:access_key_id => access_key_id,
:secret_access_key => secret_access_key,
:proxy_uri => ENV['HTTP_PROXY'] || ENV['http_proxy'])
ec2 = AWS::EC2.new
reg = ec2.regions[endpoint]
snapshot = reg.volumes[volume_id].create_snapshot(description)
snapshot.add_tag('Name', :value => name)
if generation_number
snapshots = reg.snapshots.filter('volume-id', volume_id).sort_by { |x| x.start_time }.reverse
ss = snapshots[generation_number..-1]
ss.each { |x| x.delete } unless ss.nil? end
end
@kmats
Copy link

kmats commented Jan 24, 2013

-gオプションを使用する際、作成済みのスナップショットが指定する値よりも少ない場合にL43でエラーが発生します。

以下のような変更で回避できるのではないでしょうか

diff --git a/create_ebs_snapshot.rb b/create_ebs_snapshot.rb
index b1bbc84..db01cda 100644
--- a/create_ebs_snapshot.rb
+++ b/create_ebs_snapshot.rb
@@ -40,7 +40,6 @@ snapshot.add_tag('Name', :value => name)

if generation_number
snapshots = reg.snapshots.filter('volume-id', volume_id).sort_by { |x| x.start_time }.reverse

  • snapshots[generation_number..-1].each do |x|
  • x.delete
  • end
    -end
    \ No newline at end of file
  • ss = snapshots[generation_number..-1]
  • ss.each { |x| x.delete } unless ss.nil?
    +end

@mechamogera
Copy link
Author

ありがとうございます、取り込んでみました

@torut
Copy link

torut commented Sep 5, 2014

実用にあたって幾つか変更してみました。
https://gist.github.com/torut/f403abd454468ed05420

name を指定した場合でもタイムスタンプを追加するようにしてみました。

@@ -25,6 +25,7 @@
"Default:all snapshot is not removed") { |v| generation_number = v.to_i }
opt.parse!

+name = now_time.strftime("#{name}-%Y/%m/%d_%H:%M:%S") if name
name = now_time.strftime("#{volume_id}-%Y/%m/%d_%H:%M:%S") unless name

raise "volume-id is necessary,-h or --help option" unless volume_id 

修飾子 としての unless には end はいらない。

@@ -41,5 +42,5 @@
if generation_number
snapshots = reg.snapshots.filter('volume-id', volume_id).sort_by { |x| x.start_time }.reverse
ss = snapshots[generation_number..-1]
- ss.each { |x| x.delete } unless ss.nil? end
-end
\ No newline at end of file
+ ss.each { |x| x.delete } unless ss.nil?
+end 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment