haproxy 로 DDoS 방어하기

이전에 봤던 내용인데 급히 보고 싶을때 링크를 못찾아서 메모용 으로 작성.  https://www.haproxy.com/blog/application-layer-ddos-attack-protection-with-haproxy/ 모든 상황에 100% 대응 할 수 있는 방법은 아니지만 WAF나 ALB, Route53의 GeoLocation Routing등과 같이 다른 서비스와 병용 함으로서 어느 정도의 효과를 얻을 수 있을 듯 하다.

AWSの放置されたEBSをchatworkへ定期的に通知

 

毎日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週間後削除するか、削除は手動でやるかなどの半自動化した方がいいと思う。

댓글

이 블로그의 인기 게시물

curl 명령어 옵션

CISCO 2960s 초기화 후 기본 설정

AWS에서 zabbix를 이용한 autoscaling ec2 자동등록/자동삭제