毎日ec2やamiを作成/削除を繰り返している環境では気付かないうちに放置されているEBSが増えてくる。考えられる原因としては色々あるけど大きくは以下の2つではないかと思っている。
- AMIからEC2を起動する場合の話だけど、AMI作成時に「EBSをインスタンス削除時に一緒に削除する」というオプションにチェックしなかった場合、そのAMIから起動したEC2を削除するときは毎回そのEBSが残ってしまう
- 不要になったらAMIを削除するとAMIに紐づいているEBSやスナップショットは削除されないらしい。定期的に不要AMIを方付ける仕組みを採用しているなら定期的に放置EBSも増えるはず。
なので以下のスクリプトを作成して定期的にチャットワークに通知するようにした。
#!/usr/bin/php
<?
$query="/usr/local/bin/aws --region ap-northeast-1 ec2 describe-volumes --filters Name=status,Values=available";
$result=json_decode(`$query`);
put_msg($result);
function put_msg($obj) {
$TOKN="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
$CWEP="https://api.chatwork.com/v2/rooms";
$RMID="XXXXXXXX";
$now=time();
$ebsinfo="";
$cntebs=count($obj->Volumes);
if ($cntebs > 0) {
for ($i=0; $i<count($obj->Volumes); $i++) {
$cy=substr($obj->Volumes[$i]->CreateTime, 0, 4);
$cm=substr($obj->Volumes[$i]->CreateTime, 5, 2);
$cd=substr($obj->Volumes[$i]->CreateTime, 8, 2);
$niglect['ctime']=mktime(0, 0, 0, $cm, $cd, $cy);
$niglect['mtime']=$now - $niglect['ctime'];
$niglect['day']=(int)($niglect['mtime']/60/60/24);
$niglect['mon']=(int)($niglect['day']/30);
$niglect['cost']=$obj->Volumes[$i]->Size * $niglect['mon']*0.12;
$ebsinfo.="[$cy/$cm/$cd] ";
$ebsinfo.=$obj->Volumes[$i]->VolumeId;
$ebsinfo.=", ".$obj->Volumes[$i]->Size."GB";
$ebsinfo.=", $niglect[day]日";
$ebsinfo.=", $niglect[cost]ドル\n";
}
$messages ="[info][title]";
$messages.=date("Y/m/d", $now)."、EBSの放置状況\n[/title]";
$messages.="[code]※[作成日] ボリュームID, サイズ,放置日数,消費料金\n${ebsinfo}[/code]\n";
$messages.="上記「".count($obj->Volumes)."個」のEBSが「availabe」の状態で放置されています。\n";
$messages.="確認後、不要なEBSは削除しましょう。(1GB 0.12ドル/Month)\n";
$messages.="[/info]";
exec ("/usr/bin/curl -X POST -H \"X-ChatWorkToken: $TOKN\" -d \"body=$messages\" \"$CWEP/$RMID/messages\"");
}
}
?>
chatworkには以下のようなメッセージが表示される。
[2016/12/26] vol-09f2facbdefff1f0, 20GB, 239日, 16.8ドル
[2017/05/10] vol-067cdefgaf5c789d, 15GB, 104日, 5.4ドル
[2017/05/10] vol-09b8ededcfgj6dbf03, 15GB, 104日, 5.4ドル
この次は抽出した放置EBSをAWS CLIを使ってそのまま削除してしまうことかな。EBSにもタグをつけられるので残しておく必要があるEBSはタグをつけておいて、そのタグがついてないEBSは定期的に削除してその結果を通知する仕組みがいいかも。
でも、削除を全自動でやるのはやはり怖いから1週間前に通知して1週間後削除するか、削除は手動でやるかなどの半自動化した方がいいと思う。
댓글
댓글 쓰기