EBSボリュームをS3へ定期的バックアップする(AWS)でright_awsを使ったEBSボリュームのバックアップ方法を書いたんですが、AWS SDK for Rubyがリリースされて、ServerWorksさんがこのsdkを使って簡単にバックアップを実行するスクリプトを書いてくれています。
サーバーワークスさんのブログ
right_awsを使ったバージョンに比べると凄くシンプルなコードになってますね。※gitはこちら。
# -*- coding: utf-8 -*-
require 'rubygems'
require 'aws-sdk'
## アクセスIDとシークレットアクセスキーを指定します
ACCESS_KEY = 'SET UP YOUR ACCESS KEY'
SECRET_KEY = 'SET UP YOUR SECRET KEY'
## 引数チェック
unless ARGV.size == 4
puts 'Usage: awssdk_create_snapshot.rb <aws_region_url> <num> <volume_id> <snapshot_description>'
exit 0
end
## 引数からスナップショット保存設定を行います
aws_region = ARGV[0]
history = ARGV[1].to_i
vol_id = ARGV[2]
snapshot_memo = ARGV[3]
## スナップショットのdescriptionを作成します
snapshot_description = "#{snapshot_memo} #{Time.now.strftime('%Y/%m/%d %H:%M')}"
## EC2インスターフェースを作成するために認証を行います
AWS.config(:access_key_id => ACCESS_KEY, :secret_access_key => SECRET_KEY, :ec2_endpoint => aws_region)
ec2 = AWS::EC2.new
## 対象ボリュームからスナップショットを作成します
ec2.snapshots.create(:volume => ec2.volumes[vol_id], :description => snapshot_description)
## 現在保存されている対象ボリュームから作成されたスナップショットをリスト化する
snapshots_list = []
snapshots = ec2.snapshots.filter('volume-id', vol_id)
snapshots.each { |snap| snapshots_list << snap.id }
## 指定世代分を残して古いスナップショットを削除します
snapshots_to_delete = []
snapshots_list.each { |snap| snapshots_to_delete << ec2.snapshots[snap] }
snapshots_to_delete = snapshots_to_delete.sort_by { |snap| snap.start_time }.reverse
snapshots_to_delete.each_with_index do |snap, i|
snap.delete unless i < history
end
では早速aws-sdkを入れてみる。libxml2-develとlibxslt-develが必須なのでそちらを先に。
[sohgoh@dev work]$ sudo yum install libxml2-devel.x86_64 libxslt-devel.x86_64
Loaded plugins: fastestmirror, priorities, security
Loading mirror speeds from cached hostfile
--snip--
Is this ok [y/N]: y
Downloading Packages:
(1/4): libgcrypt-devel-1.4.5-3.7.amzn1.x86_64.rpm | 116 kB 00:00
--snip--
Installed:
libxml2-devel.x86_64 0:2.7.6-1.9.amzn1 libxslt-devel.x86_64 0:1.1.26-2.6.amzn1
Dependency Installed:
libgcrypt-devel.x86_64 0:1.4.5-3.7.amzn1 libgpg-error-devel.x86_64 0:1.7-3.7.amzn1
Complete!
[sohgoh@dev work]$
で、aws-sdkを入れる。
[sohgoh@dev work]$ sudo gem install aws-sdk
Building native extensions. This could take a while...
Fetching: json-1.5.3.gem (100%)
Building native extensions. This could take a while...
Fetching: aws-sdk-1.0.2.gem (100%)
Successfully installed nokogiri-1.4.7
Successfully installed json-1.5.3
Successfully installed aws-sdk-1.0.2
3 gems installed
Installing ri documentation for nokogiri-1.4.7...
Installing ri documentation for json-1.5.3...
Installing ri documentation for aws-sdk-1.0.2...
Installing RDoc documentation for nokogiri-1.4.7...
Installing RDoc documentation for json-1.5.3...
Installing RDoc documentation for aws-sdk-1.0.2...
[sohgoh@dev work]$
そのままだと複数ボリュームのバックアップやシークレットキーの隠蔽ができないので、pit対応にしてみた。
※pitに関しては前の記事を読んでね!
pit対応したバックアップスクリプト
# -*- coding: utf-8 -*-
require 'rubygems'
require 'aws-sdk'
require 'pit'
@@pit = Pit.get('s3', :require => { 'access_key' => '', 'secret_key' => '', 'volume_id' => '', 'owner_id' => '', 'region' => '', 'app_title' => ''})
## アクセスIDとシークレットアクセスキーを指定します
ACCESS_KEY = @@pit['access_key']
SECRET_KEY = @@pit['secret_key']
## 残しておく世代数
history = 7
## スナップショット保存設定
aws_region = 'ec2.' + @@pit['region'] + '.amazonaws.com'
vol_id = @@pit['volume_id']
snapshot_memo = @@pit['app_title']
## スナップショットのdescriptionを作成します
snapshot_description = "#{snapshot_memo} #{Time.now.strftime('%Y-%m-%d')}"
## EC2インスターフェースを作成するために認証を行います
AWS.config(:access_key_id => ACCESS_KEY, :secret_access_key => SECRET_KEY, :ec2_endpoint => aws_region)
ec2 = AWS::EC2.new
## 対象ボリュームからスナップショットを作成します
ec2.snapshots.create(:volume => ec2.volumes[vol_id], :description => snapshot_description)
## 現在保存されている対象ボリュームから作成されたスナップショットをリスト化する
snapshots_list = []
snapshots = ec2.snapshots.filter('volume-id', vol_id)
snapshots.each { |snap| snapshots_list << snap.id }
## 指定世代分を残して古いスナップショットを削除します
snapshots_to_delete = []
snapshots_list.each { |snap| snapshots_to_delete << ec2.snapshots[snap] }
snapshots_to_delete = snapshots_to_delete.sort_by { |snap| snap.start_time }.reverse
snapshots_to_delete.each_with_index do |snap, i|
snap.delete unless i < history
end
黄色は主な変更箇所。
後はpit switchしながら実行するシェルスクリプトを書いて、cronに登録しておけばおk。
こんな感じ。
#!/bin/sh
TARGET_PITS="pit-profile-volume1 pit-profile-volume2"
for PIT in $TARGET_PITS ; do
cd /home/backup/script ; /usr/bin/pit switch $PIT ; /usr/bin/ruby ./awssdk_create_snapshot.rb > backup.log 2>&1
done
サーバーワークスさんのブログ
right_awsを使ったバージョンに比べると凄くシンプルなコードになってますね。※gitはこちら。
# -*- coding: utf-8 -*-
require 'rubygems'
require 'aws-sdk'
## アクセスIDとシークレットアクセスキーを指定します
ACCESS_KEY = 'SET UP YOUR ACCESS KEY'
SECRET_KEY = 'SET UP YOUR SECRET KEY'
## 引数チェック
unless ARGV.size == 4
puts 'Usage: awssdk_create_snapshot.rb <aws_region_url> <num> <volume_id> <snapshot_description>'
exit 0
end
## 引数からスナップショット保存設定を行います
aws_region = ARGV[0]
history = ARGV[1].to_i
vol_id = ARGV[2]
snapshot_memo = ARGV[3]
## スナップショットのdescriptionを作成します
snapshot_description = "#{snapshot_memo} #{Time.now.strftime('%Y/%m/%d %H:%M')}"
## EC2インスターフェースを作成するために認証を行います
AWS.config(:access_key_id => ACCESS_KEY, :secret_access_key => SECRET_KEY, :ec2_endpoint => aws_region)
ec2 = AWS::EC2.new
## 対象ボリュームからスナップショットを作成します
ec2.snapshots.create(:volume => ec2.volumes[vol_id], :description => snapshot_description)
## 現在保存されている対象ボリュームから作成されたスナップショットをリスト化する
snapshots_list = []
snapshots = ec2.snapshots.filter('volume-id', vol_id)
snapshots.each { |snap| snapshots_list << snap.id }
## 指定世代分を残して古いスナップショットを削除します
snapshots_to_delete = []
snapshots_list.each { |snap| snapshots_to_delete << ec2.snapshots[snap] }
snapshots_to_delete = snapshots_to_delete.sort_by { |snap| snap.start_time }.reverse
snapshots_to_delete.each_with_index do |snap, i|
snap.delete unless i < history
end
では早速aws-sdkを入れてみる。libxml2-develとlibxslt-develが必須なのでそちらを先に。
[sohgoh@dev work]$ sudo yum install libxml2-devel.x86_64 libxslt-devel.x86_64
Loaded plugins: fastestmirror, priorities, security
Loading mirror speeds from cached hostfile
--snip--
Is this ok [y/N]: y
Downloading Packages:
(1/4): libgcrypt-devel-1.4.5-3.7.amzn1.x86_64.rpm | 116 kB 00:00
--snip--
Installed:
libxml2-devel.x86_64 0:2.7.6-1.9.amzn1 libxslt-devel.x86_64 0:1.1.26-2.6.amzn1
Dependency Installed:
libgcrypt-devel.x86_64 0:1.4.5-3.7.amzn1 libgpg-error-devel.x86_64 0:1.7-3.7.amzn1
Complete!
[sohgoh@dev work]$
で、aws-sdkを入れる。
[sohgoh@dev work]$ sudo gem install aws-sdk
Building native extensions. This could take a while...
Fetching: json-1.5.3.gem (100%)
Building native extensions. This could take a while...
Fetching: aws-sdk-1.0.2.gem (100%)
Successfully installed nokogiri-1.4.7
Successfully installed json-1.5.3
Successfully installed aws-sdk-1.0.2
3 gems installed
Installing ri documentation for nokogiri-1.4.7...
Installing ri documentation for json-1.5.3...
Installing ri documentation for aws-sdk-1.0.2...
Installing RDoc documentation for nokogiri-1.4.7...
Installing RDoc documentation for json-1.5.3...
Installing RDoc documentation for aws-sdk-1.0.2...
[sohgoh@dev work]$
そのままだと複数ボリュームのバックアップやシークレットキーの隠蔽ができないので、pit対応にしてみた。
※pitに関しては前の記事を読んでね!
pit対応したバックアップスクリプト
# -*- coding: utf-8 -*-
require 'rubygems'
require 'aws-sdk'
require 'pit'
@@pit = Pit.get('s3', :require => { 'access_key' => '', 'secret_key' => '', 'volume_id' => '', 'owner_id' => '', 'region' => '', 'app_title' => ''})
## アクセスIDとシークレットアクセスキーを指定します
ACCESS_KEY = @@pit['access_key']
SECRET_KEY = @@pit['secret_key']
## 残しておく世代数
history = 7
## スナップショット保存設定
aws_region = 'ec2.' + @@pit['region'] + '.amazonaws.com'
vol_id = @@pit['volume_id']
snapshot_memo = @@pit['app_title']
## スナップショットのdescriptionを作成します
snapshot_description = "#{snapshot_memo} #{Time.now.strftime('%Y-%m-%d')}"
## EC2インスターフェースを作成するために認証を行います
AWS.config(:access_key_id => ACCESS_KEY, :secret_access_key => SECRET_KEY, :ec2_endpoint => aws_region)
ec2 = AWS::EC2.new
## 対象ボリュームからスナップショットを作成します
ec2.snapshots.create(:volume => ec2.volumes[vol_id], :description => snapshot_description)
## 現在保存されている対象ボリュームから作成されたスナップショットをリスト化する
snapshots_list = []
snapshots = ec2.snapshots.filter('volume-id', vol_id)
snapshots.each { |snap| snapshots_list << snap.id }
## 指定世代分を残して古いスナップショットを削除します
snapshots_to_delete = []
snapshots_list.each { |snap| snapshots_to_delete << ec2.snapshots[snap] }
snapshots_to_delete = snapshots_to_delete.sort_by { |snap| snap.start_time }.reverse
snapshots_to_delete.each_with_index do |snap, i|
snap.delete unless i < history
end
後はpit switchしながら実行するシェルスクリプトを書いて、cronに登録しておけばおk。
こんな感じ。
#!/bin/sh
TARGET_PITS="pit-profile-volume1 pit-profile-volume2"
for PIT in $TARGET_PITS ; do
cd /home/backup/script ; /usr/bin/pit switch $PIT ; /usr/bin/ruby ./awssdk_create_snapshot.rb > backup.log 2>&1
done