使っていないAWSリソースを監視して自動削除するJanitor Monkeyを使ってみた

記事タイトルとURLをコピーする

 

皆さんこんにちは。テクニカルグループの山田です。
今回は、NetFlixがオープンソースで公開しているJanitor Monkeyを紹介します。

 

Janitor Monkey とは?

NetflixがOSSで公開している、AWSで使っていないリソース (Instance, AutoScalingGroup, EBS Volume, EBS Snapshot, Launch Config) を自動的に削除するツールです。
どのリソースを削除対象にするかどうかのルールや、削除するまでの日数など細かく設定可能で
リソース削除前にはメールで管理者へ通知することもできます。
また、Netflixは Janitor Monkey の他にも運用・テストで使えるツールをオープンソースで公開しており
インスタンス障害を引き起こすChaos Monkeyや、EC2のセキュリティグループなどを監視するSecurity Monkeyなどもあります。

Netflixのgithubページ
 
使うための下準備

JanitorMonkeyの動作には以下の環境が必要となるため、各自用意してください。

Javaの実行環境
"SIMIAN_ARMY"というSimpleDBのドメイン (各AWSリソースの情報を保存するため)
Production申請済みのSES、SESへのアクセス環境 (実行レポートをSESでメール送信するため)
IAMユーザ、アクセスキーID、シークレットアクセスキー
 
※IAMユーザの権限については以下のリンクを参考に設定してください。
https://github.com/Netflix/SimianArmy/wiki/Quick-Start-Guide#setup-user-or-role-policies

  インストール作業
まず、インストールに必要なソフトウェアを用意します。

$ sudo yum -y update
$ sudo yum -y groupinstall "Development Libraries" "Development tools" 

次に、公式のgithubからソースコードをダウンロードします。

$ git clone git://github.com/Netflix/SimianArmy.git

ダウンロードしたものをビルドします。

$ cd SimianArmy
$ ./gradlew build

BUILD SUCCESSFUL と出力されればビルド成功です。
インストールすると、○○ MonkeyというNetflixのツール群 (Simian Army) がインストールされます。

 

Janitor Monkeyの設定

設定ファイルをデフォルトから書き換えます。
設定ファイルは、インストールディレクトリ以下の ( ~/SimianArmy/src/main/resources/ )にあります。

$ tree SimianArmy

SimianArmy
---省略---
└── src
    ├── main
    │   │
    │   ├── resources
    │   │   ├── chaos.properties
    │   │   ├── client.properties
    │   │   ├── conformity.properties
    │   │   ├── janitor.properties
    │   │   ├── log4j.properties
    │   │   ├── simianarmy.properties
    │   │   └── volumeTagging.properties
    │   │
---省略---

230 directories, 878 files

まず、AWSリソースを監視する際に必要となるアクセスキーとシークレットアクセスキーと監視するリージョンを設定します。
設定するファイルは client.properties です。

simianarmy.client.aws.accountKey = XXXXXXXXXXXXXXX
simianarmy.client.aws.secretKey  = XXXXXXXXXXXXXXXXXXXXXXXXX
simianarmy.client.aws.region = ap-northeast-1


次にChaos Monkey(インスタンス障害を意図的に起こすツール) と Conformity Monkey(ベストプラクティスから外れているインスタンスをシャットダウンするツールの設定をします。
今回は、Chaos Monkey と Conformity Monkey は使わないので無効にします。
まず、Chaos Monkeyを ( chaos.properties ) を無効にします。

simianarmy.chaos.enabled = false

Conformity Monkey ( conformity.properties ) を無効にします。

simianarmy.conformity.enabled = false
 
これでChaos MonkeyとConformity Monkeyは動作しなくなりました。
 
 
そして、今回の主役であるJanitor Monkey ( janitor.properties ) の設定をします。
 
・監視する時間の間隔とその時間の単位を設定
simianarmy.scheduler.frequency = 10
simianarmy.scheduler.frequencyUnit = MINUTES

監視開始時刻と終了時刻とタイムゾーンを設定

simianarmy.calendar.openHour = 10
simianarmy.calendar.closeHour = 19
simianarmy.calendar.timezone = Asia/Toyko

・dryrunモードの有効無効の設定 (今回は動作確認のみなのでtrueに設定します)

simianarmy.janitor.leashed = true

監視対象にするAWSリソースを設定  (今回はSnapshotのみを監視対象にします)

simianarmy.janitor.enabledResources = EBS_Snapshot

監視結果レポートを送信するためのメール設定

simianarmy.janitor.notification.sourceEmail = foo@bar.com # 通知する際の送信元アドレス
simianarmy.janitor.summaryEmail.to = foo@bar.com # 通知する際の送信先アドレス

リソース削除前の最後通告の日数を設定

simianarmy.janitor.notification.daysBeforeTermination = 2

※例えば6月27日に削除されるインスタンスがあるとして、この値が2に設定されていると6月25日にメールで事前に通知されます。   リソースの削除ルール設定

次にそれぞれのAWSの監視ルールです。
先ほど simianarmy.janitor.enabledResources で指定した、Snapshotの削除ルールを設定したいと思います。
Snapshotで指定するプロパティは3つです。

・Snapshotの監視を有効/無効

simianarmy.janitor.rule.noGeneratedAMIRule.enabled = true

・どのAMIにも紐付いていない、かつ作成されてからこの日数が経過すると削除候補としてマークされる

simianarmy.janitor.rule.noGeneratedAMIRule.ageThreshold=30 

・削除通知メールが届いてから削除されるまでの日付

simianarmy.janitor.rule.noGeneratedAMIRule.retentionDays = 7


Janitor Monkeyの設定は以上になります。
その他のAWSリソースの削除ルールを設定するプロパティはこちら (https://github.com/Netflix/SimianArmy/wiki/Janitor-Settings) にあります。   Janitor Monkeyの実行

さて、ひと通りの設定が完了したので早速実行しましょう。

SimianArmyディレクトリに移動して実行します。

$ cd SimianArmy
$ ./gradlew jettyRun

Janitor MonkeyによるAWSのリソース監視が開始されます。

:compileJava UP-TO-DATE
:processResources UP-TO-DATE」
:classes UP-TO-DATE
:jettyRun

------省略------

> Building > :jettyRun > Running at http://localhost:8080/simianarmy

すると、設定ファイルで指定したメールアドレスに、以下の様な形式でAWSリソースの監視レポートが送られます。

タイトル:Janitor monkey execution summary (ap-northeast-1)

Total markings for EBS_SNAPSHOT = 3 in region ap northeast 1
List: snap-xxxxxxxx,snap-xxxxxxxx,snap-xxxxxxxx
Total unmarkings for EBS_SNAPSHOT = 0 in region ap northeast 1
List: 
Total cleanups for EBS_SNAPSHOT = 0 in region ap northeast 1
List: 
Total cleanup failures for EBS_SNAPSHOT = 0 in region ap northeast 1
List:

markings for EBS_SNAPSHOT = 3  とあるので3つのSnapshotが削除候補としてマークされていることが分かります。

 

まとめ

普段から意識していても、ついつい忘れてしまうリソースの消し忘れをすべて自動で管理してくれるのは非常に魅力的ですね。
例え間違って削除条件を設定してしまってもメールで通知が来るので安心です。
個人的に使っているAWSアカウントにも使いっぱなしのリソースがあるので、これを機に大掃除しようかと思います。