Skip to content

Instantly share code, notes, and snippets.

@okochang
Created May 11, 2012 06:40
Show Gist options
  • Save okochang/2657949 to your computer and use it in GitHub Desktop.
Save okochang/2657949 to your computer and use it in GitHub Desktop.
monthly charge report using cloudwath
# -*- coding: utf-8 -*-
# AWSのアカウント料金からグラフを生成して、メールでレポートするスクリプトです
# $ sudo yum install ImageMagick ImageMagick-devel
# $ gem install rmagick
# $ gem install gruff
# $ gem install right_aws
# $ gem install aws-sdk
require 'right_aws'
require 'gruff'
require 'aws-sdk'
# 引数が正しく設定されているかチェックします
unless ARGV.size == 2
puts "Usage: #{$0} <from_address> <to_address>"
exit 0
end
# ACCESS_KEYとSECRET_KEYを設定し、AWSにログインします
ACCESS_KEY = 'YOUR_ACCESS_KEY'
SECRET_KEY = 'YOUR_SECRET_KEY'
ACCOUNT_NUMBER = 'YOUR_ACCOUNT_NUMBER'
acw = RightAws::AcwInterface.new(ACCESS_KEY, SECRET_KEY)
# 料金データを取得する期間を設定します
starttime = (Time.now.utc - 5*24*60*60)
endtime = Time.now.utc
# Cloudwatchで料金データを取得します
data = acw.get_metric_statistics(options={:dimentions => {"LinkedAccount"=>ACCOUNT_NUMBER, "Currency"=>"USD"},
:measure_name => "EstimatedCharges",
:namespace => "AWS/Billing",
:start_time => starttime,
:end_time => endtime,
:period => 86400})
# 取得出来た値をtimestampでソートします
sort_data = data[:datapoints].sort! {|a,b| a[:timestamp] <=> b[:timestamp]}
charge_list = []
sort_data.each do |r|
charge_list << r[:average]
end
# グラフ生成を行います
graph_file = "#{Time.now.strftime('%Y-%m-%d')}-charge_graph.png"
g = Gruff::Line.new
g.title = "Save your money!!"
g.marker_font_size = 15
g.data("your account charge", charge_list)
g.labels = {0 => '5days ago', 1 => '4days ago', 2 => '3days ago', 3 => '2days ago', 4 => 'yesterday'}
g.write(graph_file)
# 送信メールのメッセージを指定します
body = 'Sends a report of billing information.'
# ファイルを読み込みbase64フォーマットにエンコードします
filecontent = File.read(graph_file)
encodedcontent = [filecontent].pack("m")
# 生成したグラフをSESで送信します
from = ARGV[0]
to = ARGV[1]
marker = "EMCRSESSENDING"
mailtext =<<EOF
From: #{from}
To: #{to}
Subject: Estimated Monthly Charge Report
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=#{marker}
--#{marker}
Content-Type: text/plain
Content-Transfer-Encoding:8bit
#{body}
--#{marker}
Content-Type: image/png; name=\"#{graph_file}\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename="#{graph_file}"
#{encodedcontent}
--#{marker}--
EOF
ses = AWS::SimpleEmailService.new(:access_key_id => ACCESS_KEY,:secret_access_key => SECRET_KEY)
ses.send_raw_email(mailtext)
# 送信したグラフを削除します
File.delete(graph_file)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment