hiroohiのメモ

はてななのでITやスタートアップ周りの話(ほとんどが自分への備忘録だけど)を書いています。

AWSの利用実績をグラフで可視化!NetFlixのIceをインストールしてみた

AWSの利用実績、ちゃんとみてますか?
アカウントアクティビティとか利用レポートDLとか、あるにはありますが、とにかく数字だらけで分かりにくかったり、
さらに一括決済(Consolidated Billing)なんてしているとアカウントの数だけ行が増えてますます困難。そう思いませんか?

実際私もそう思っていたところに、大規模AWSユーザーとして有名なNetFlixがICEという利用実績のモニタリングツールを公開したというニュースを見つけたので、早速インストールしてみました。
基本的にはiceのreadmeで分かると思いますが、若干はまったところを中心に私のログをご紹介します。

用意するもの

  • Amazon Linuxインスタンス
  • S3上に解析結果の保存先のbucketを作っておく
  • S3フルアクセスできるIAMのaccessId/SecretKey
  • Grails
    • IceのReadmeで指定したバージョンじゃないと動かないです。
  • Ice

手順

Grailsのインストール

http://grails.orgから、Iceが指定してるバージョンのバイナリのリンクをコピーして、インストール先のEC2インスタンスsshしてwgetします。そしてzipを展開します。どこでもいいんですが、私は/usr/localにgrailsという名前で展開しました。
そして、/etc/profileに

export GRAILS_HOME=/usr/local/grails
export PATH="$PATH:$GRAILS_HOME/bin"

を追記しました。

設定

Programmatic Billing Accessを設定

ICEの元データはAWSのProgrammatic Billing AccessでS3に吐き出されるファイルになります。なのでここで、

  • Programmatic Access
  • Detailed Billing Report
  • Detailed Billing Report (with resources and tags)

をenableにします。まあこのページの全部の設定をEnableにすればOK!

必要なプログラム類

EC2インスタンス上で以下をyumで入れときます。

  • java1.6
  • openjdk
  • tomcat6
  • git
  • apache
ICEのインストール

まず、EC2インスタンス上にICEを落としてきます。

$ git clone https://github.com/Netflix/ice

iceってディレクトリがカレントに出来ているので、その中に入って

$ grails wrapper

を叩く。yumでちゃんと入れてて、GRAILS_HOMEとかちゃんと設定してあれば正常に完了すると思います。
そして、ice.propertiesをつくります。
$GRAILS_HOME/src/javaにsample.propertiesファイルがあるのでそれをice.propertiesとしてコピーして、ice.propertiesを編集。最低限必要なのは以下の項目

#Programmatic Accessで書き出し先に指定したS3のbucket名。以下はmybillingというbucket名にした場合
ice.billing_s3bucketname=mybilling
ice.billing_s3bucketprefix=

Iceのreadmeにはprefixをつける例になっているけど、Programmatic AccessにPrefixをつけラル設定はなかった気がするので、該当bucket直下に作られるBiling Reportを見に行けるようにPrefixは空欄にしておく(私はこれに気づかず相当ハマりました)

#iceがs3からとってきたファイルやワークファイルを保存するローカルディレクトリ。読み書きできればどこでもいい
ice.processor.localDir=/mnt/ice_processor
ice.reader.localDir=/mnt/ice_reader
#iceがBillingReportを加工した結果を保存するS3のbucketの指定。以下はiceworkというbucketに書き込む場合
ice.work_s3bucketname=icework
ice.work_s3bucketprefix=

iceのwork用に専用のbucketを作っておいた方が管理が楽。だとするとprefixをつける意味はないので、prefixを空欄にしておく方がハマらない(私はハマりました)。

#S3へのアクセス情報。用意したIAMのを使う
ice.s3AccessKeyId=
ice.s3SecretKey=
#とりあえずProgrammatic Accessを設定したアカウントIDを入れ、account2以降はコメントアウトで。
ice.account.account1=123456789011
#インスタンスがもったいないのでprocessorとreaderは同居で
ice.reader=true

ここまで出来たら保存して、

$ ./grailsw -Dice.s3AccessKeyId= -Dice.s3SecretKey= run-app

を叩くと、必要なファイルをDLしたりしたあと、アプリが起動する。成功すればhttp://localhost:8080/iceを叩いてね的なログが表示される。
起動に成功したら、Webブラウザでhttp://(ec2インスタンスのPublicDNS名):8080/ice/dashboard/summaryにアクセス。グラフが出れば成功

自動起動させる

アプリの実行は

$ ./grailsw -Dice.s3AccessKeyId= -Dice.s3SecretKey= run-app

なので、あとはインスタンス起動時に自動起動する設定にしておけば便利。
/etc/init.d/にiceって名前で、以下の内容を記述したファイルを作る

#!/bin/sh
# chkconfig: 2345 99 10
# description: Netflix Ice start

. /etc/init.d/functions

#envコマンドで表示される$JAVA_HOMEと同じパスを記述
export JAVA_HOME=/usr/lib/jvm/java

#iceのディレクトリでgrailswを起動。
cd /var/www/ice ; ./grailsw -Dice.s3AccessKeyId= -Dice.s3SecretKey= run-app > /var/log/ice.log

exit 0;

このファイルにchmodで実行権限をつけ、checonfigに登録

$ sudo chkconfig --add ice
$ sudo chkconfig ice on

起動したあとの話はまた今度。