· 7 years ago · Feb 18, 2018, 05:48 PM
1require 'rubygems'
2require 'right_aws'
3require 'nkf'
4require 'net/smtp'
5
6# ã“ã®ã‚¹ã‚¯ãƒªãƒ—トã§ã‚¸ãƒ§ãƒ–ã®çµæžœã‚’メールã§é€šçŸ¥ã™ã‚‹å ´åˆã¯ãƒãƒ¼ã‚«ãƒ«ç’°å¢ƒã«smtpサーãƒãŒå¿…è¦ã§ã™
7# 動作確èªã«ä½¿ç”¨ã—ãŸç’°å¢ƒã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™
8# * ruby 1.8.7
9# * postfix 2.3.3
10# スクリプトを使用ã™ã‚‹å ´åˆã¯ä»¥ä¸‹ã®é †ç•ªã§å¼•数を指定ã—ã¦ä¸‹ã•ã„
11# 1. AWSリージョン
12# 2. ä¿å˜ä¸–代
13# 3. スナップショットをå–å¾—ã™ã‚‹volume-id
14# 4. スナップショットã®descriptionã«ä½¿ç”¨ã™ã‚‹åå‰(英語)
15# 5. 転é€å…ˆe-mailアドレス
16# スクリプトを使用ã™ã‚‹å ´åˆã¯ä»¥ä¸‹ã®æ–‡å—列を指定ã—ã¦ä¸‹ã•ã„
17# * ACCESS_KEY
18# * SECRET_KEY
19# * from_mail_addr
20
21# 定数è¨å®š
22ACCESS_KEY = 'SET UP YOUR ACCESS KEY'
23SECRET_KEY = 'SET UP YOUR SECRET KEY'
24
25# 引数ãƒã‚§ãƒƒã‚¯
26unless ARGV.size == 5 then
27 puts 'ä½¿ã„æ–¹: create_snapshot.rb <aws_region> <num> <volume_id> <snapshot_memo> <email_address>'
28 exit 0
29end
30
31# 引数ã‹ã‚‰ã‚¹ãƒŠãƒƒãƒ—ショットä¿å˜ã®è¨å®šã‚’ã™ã‚‹
32aws_region = ARGV[0]
33history = ARGV[1].to_i # EBSスナップショットを何世代残ã—ã¦ãŠãã‹
34vol_id = ARGV[2] # EBSスナップショットをå–å¾—ã™ã‚‹EBSボリュームID
35snap_name = ARGV[3] # EBSスナップショットã®descriptionã«ã¤ã‘ã‚‹åå‰
36to_mail_addr = ARGV[4] # ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—完了通知先アドレス
37from_mail_addr = 'noreply@from_addr.com' # ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—完了通知元アドレス
38subject = NKF.nkf("-wjm0", 'スナップショット通知メール') # スナップショット通知メールタイトル
39failure_message = NKF.nkf("-wjm0", 'スナップショットã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚') # ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—å¤±æ•—é€šçŸ¥ãƒ¡ãƒ¼ãƒ«ã®æœ¬æ–‡
40success_message = NKF.nkf("-wjm0", '完了ã—ã¾ã—ãŸã€‚スナップショットã®ãƒªã‚¹ãƒˆã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚') # ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—æˆåŠŸé€šçŸ¥ãƒ¡ãƒ¼ãƒ«ã®æœ¬æ–‡
41
42# スナップショットã®descriptionを作æˆ
43t = Time.now
44snapshot_description = "#{snap_name} #{t.strftime('%Y/%m/%d %H:%M')}"
45
46# EC2ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースを作æˆã™ã‚‹ãŸã‚ã®èªè¨¼ã‚’ã—ã¾ã™
47ec2 = RightAws::Ec2.new(ACCESS_KEY, SECRET_KEY, :region => "#{aws_region}")
48
49# スナップショットãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®å‡¦ç†
50begin
51 # 対象ã®EBSボリュームã‹ã‚‰ã‚¹ãƒŠãƒƒãƒ—ショットを作æˆã—ã¾ã™
52 ec2.create_snapshot(vol_id, snapshot_description)
53# スナップショット処ç†ã«å¤±æ•—ãŒç™ºç”Ÿã—ãŸå ´åˆã®å‡¦ç†
54rescue => ex
55# 失敗時ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹
56data = <<EOF
57Subject: #{subject}
58
59#{failure_message}
60EOF
61 # ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—失敗通知メールをé€ä¿¡ã™ã‚‹
62 Net::SMTP.start('localhost', 25){ |smtp| smtp.sendmail data, from_mail_addr, to_mail_addr }
63 exit
64end
65# ä¿å˜ã—ã¦ã„るスナップショットã§ã€ç›®çš„ã®IDã‚’æŒã¤ã‚‚ã®ã‚’リスト化ã™ã‚‹
66snapshots_list = []
67ec2.describe_snapshots.each do |snapshot|
68 if vol_id == snapshot[:aws_volume_id]
69 snapshots_list << snapshot
70 end
71end
72
73# å±¥æ´åˆ†ã‚’残ã—ã¦å¤ã„スナップショットを削除
74snapshots_list = snapshots_list.sort_by {|snapshot| snapshot[:aws_started_at] }.reverse
75snapshots_list.each_with_index do |snapshot, i|
76 unless i < history
77 ec2.delete_snapshot(snapshot[:aws_id])
78 end
79end
80
81# ジョブ完了後ã€ä¿å˜ã—ã¦ã„るスナップショットã§ã€ç›®çš„ã®IDã‚’æŒã¤ã‚‚ã®ã‚’リスト化ã™ã‚‹
82new_snapshots_list = []
83ec2.describe_snapshots.each do |snapshot|
84 if vol_id == snapshot[:aws_volume_id]
85 new_snapshots_list << snapshot[:aws_description]
86 new_snapshots_list << snapshot[:aws_id]
87 new_snapshots_list << snapshot[:aws_status]
88 new_snapshots_list << "\n"
89 end
90end
91
92# ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—å®Œäº†é€šçŸ¥ãƒ¡ãƒ¼ãƒ«ã®æœ¬æ–‡ã‚’作æˆ
93data = <<EOF
94Subject: #{subject}
95
96#{success_message}
97#{new_snapshots_list}
98EOF
99# ç¾åœ¨ã®ã‚¹ãƒŠãƒƒãƒ—ショットリストを本文ã«ã—ãŸå®Œäº†é€šçŸ¥ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã™ã‚‹
100Net::SMTP.start('localhost', 25){|smtp| smtp .sendmail data, from_mail_addr, to_mail_addr }
101exit