간만의 휴식에 한일들

 3월 1일부터 새로운 회사에 입사하게 되어서 2월은 약 한달 정도 쉬게 되었다. 쉬기 전 까지는 이것도 하고 저것도 하고 계획도 많았지만 막상 쉬게 되면 이런 저런 제약 때문에 생각대로 되지 않는다. 특히 꼬맹이 학교에서 돌아오는 시간이 있으니 그에 맞춰 집에 있으려면 할 수 있는 것도 그렇게 많지 않은 것 같다. 그나마 한 것 들이라고는 영화본 것 밖에 없는 듯. 슬램덩크, 아바타2, 앤트맨&와스프 퀀텀 매니아. 요렇게 3개의 영화를 보고 왔다. 슬램덩크 추억의 만화책을 애니화 한 만화 영화. 뭐 나쁘지 않은 영화 였다. 전체적으로는 약간 루즈한 느낌이 들지만 마지막 클라이막스 부분에서는 음악과 함께 좋은 연출을 본 듯 한 느낌이다. 두번 본 사람도 있다고 하는데 그 정도 까지는 아닌 듯. 아바타2 볼까 말까 고민한 영화. 이미 뒷편 들까지 어느정도 촬영이 끝났다는 이야기를 듣고 보기로 결정. 처음으로 4dx 영화관에서 보았는데 의자의 흔들림 등 그 외 효과들이 그렇게 효과가 있다고는 생각을 못하겠다. 가~끔씩 타이밍이 딱 맞을 때도 있지만 오히려 신경이 쓰여서 영화에 집중 못하는 경우도 꽤 있었던 듯 하다.  화면에 집중하고 싶어서 더빙판으로 관람 했는데 더빙 판은 4dx밖에 없드라.. 내용도 괜찮고 그래픽도 괜찮고 눈도 즐거웠다. 다음 편이 나오면 또 보러 가고 싶다. 앤트맨&와스프 퀀텀 매니아 인터넷의 평가는 좋은편이 아닌 듯 하다. 이것도 4dx로 관람 하고 왔는데 나쁘지는 않은 듯 하다. 딱 거기까지. 양자 세계에 또하나의 우주가 존재한다는 가설은 이전부터 있었던 이야기. 결국 우리가 살고 있는 지구도 누군가의 양자 세계 일 수도 있다는 것.  하지만 양자 세계의 묘사가 뭐랄까 스타워즈 짝퉁이라는 느낌이 강하게 든다. 스타워즈를 본 적 없는 사람에게는 신선한 충격으로 다가 올지도 모르겠다. 영화를 볼때는 개연성같은걸 신경 쓰면 지는 거다. 그냥 무지성으로 생각하지 말고 시간 때우기로만 본다면 나쁘진 않은 듯 하지만 하나씩 따지기 시작

phpでAWSのstatusページから異常を検知してchatworkへ通知する

 Amazonは「http://status.aws.amazon.com」からAWSのサービス状況を確認できるページを提供している。ブラウザでアクセスすると各リージョンのサービス簡単に確認できる。そして、RSSにも対応しているのでRSSフィーダーを使ってサービスに異常が発生した場合、通知してくれる。

 

今回はphpを使ってRSSフィーダーを定期的にチェックし、新しいアイテムがフィーダーされたらそれを確認する仕組みを作ってみた。たまにしか起きないけど1回起きたら大きい影響を与えるので定期的に確認した方が絶対いい。

 

確認対象サービスはリージョンと関係ないグローバルサービスとリージョンに装束されるサービので2つに分けた。別に1つにしてもいいけど、RSSフィーダーのURLが微妙に違うので分けただけ。

 

$awspub = array (
  "cloudfront", "route53", "route53domainregistration", \
  "import-export", "management-console", "marketplace", \
  "awswaf"
);
 
$awsreg = array (
  "apigateway", "cloudwatch", "dynamodb", "ecr", "ecs", "ec2", \
  "elb", "emr", "elasticache", "glacier","kinesis", "rds", \
  "route53", "sns", "sqs", "s3", "vpc", "autoscaling", \
  "certificatemanager","cloudformation", "cloudtrail", "codedeploy", \
  "directconnect", "elasticbeanstalk", "iam","internetconnectivity", \
  "kms", "lambda", "opsworks", "state", "storagegateway"
);

その後は時間を変換してくれる関数を作った。status.aws.amazon.comのページはPSTかPDTで表示されている。通知してくれるならやさしくちゃんとJSTへ変換しよう。変換した日付をそのまま出力することもありだけどこの後時間の演算が必要いになったので結局 timestampへ変換してその値を返すことにした。


function dateToJST($date) {
 
  $newdate=DateTime::createFromFormat("D, d M Y H:i:s T", $date);
  $timezone=date_format($newdate, "T");
  if      ($timezone == "PST") { $adjuster="+17 hour"; }
  else if ($timezone == "PDT") { $adjuster="+16 hour"; }
 
  return strtotime($adjuster, strtotime(date_format($newdate, "Y-m-d H:i:s")));
}

 

後は関数かした取得コードを実行するだけ。引数としてグローバル(glb)か、リージョン(reg)なのかを教えてあげる必要がある。ここでは通知先をchatworkの板にしてある。chatworkのAPIを利用して指定の板へメッセージを書き出すことにした。以下にフールコードを残す。


#!/usr/bin/php
<?php
$workdir="/tmp/awsstatus";
$flgfile="$workdir/chk_aws_status.flg";
$interval=60*15; #15m with crontab
$now=time();
$TOKN="xxxxxxxxxxxxxxxxx"; ⇒ chatworkのapi token key
$CWEP="https://api.chatwork.com/v2/rooms";
$RMID="xxxxxxxx"; # chatworkの通知先板番号
 
if (file_get_contents($flgfile) == 1) {
  echo "stop script excute by flag file '$flgfile'\n\n";
  exit;
}
 
$awspub = array (
  "cloudfront", "route53", "route53domainregistration", \
  "import-export", "management-console", "marketplace", \
  "awswaf"
);
 
$awsreg = array (
  "apigateway", "cloudwatch", "dynamodb", "ecr", "ecs", "ec2", \
  "elb", "emr", "elasticache", "glacier","kinesis", "rds", \
  "route53", "sns", "sqs", "s3", "vpc", "autoscaling", \
  "certificatemanager","cloudformation", "cloudtrail", "codedeploy", \
  "directconnect", "elasticbeanstalk", "iam","internetconnectivity", \
  "kms", "lambda", "opsworks", "state", "storagegateway"
);
 
chk_status($awsreg, "reg");
chk_status($awspub, "glb");
 
function chk_status($arrsrv, $div) {
  global $interval;
  global $now;
  global $TOKN;
  global $CWEP;
  global $RMID;
 
  $cntarr=count($arrsrv);
  for ($i=0; $i<$cntarr; $i++) {
    $key=$arrsrv[$i];
    $rssurl="http://status.aws.amazon.com/rss/${key}";
    if ($div=="reg") { $rssurl.="-ap-northeast-1"; }
    $rssurl.=".rss";
    $xml=simplexml_load_string(file_get_contents($rssurl));
    $servicename=$xml->channel->title[0];
    $lastupdated=dateToJST($xml->channel->updated);
 
    echo "Service Name: $servicename\n";
    echo "Last Updated: ".date("Y/m/d H:i:s", $lastupdated)." JST\n";
 
    $cntticket=count($xml->channel->item);
    echo "Count of Feeder's Ticket: $cntticket\n";
    if ($cntticket > 0) {
      for ($j=0; $j<$cntticket; $j++) {
        $ticket['title']=$xml->channel->item[$j]->title;
        $ticket['date']=dateToJST($xml->channel->item[$j]->pubDate);
        $ticket['desc']=$xml->channel->item[$j]->description;
        echo "Ticket Number: $j\n";
        echo "Ticket Title: $ticket[title]\n";
        echo "Ticket Date: ".date("Y/m/d H:i:s", $ticket['date'])." JST\n";
 
        if (($now - $ticket['date']) < $interval) {
          $message ="[info][title]AWSのサービス状況に変更が発生しました。[/title]";
          $message.="◆[".date("Y/m/d H:i:s", $ticket['date'])."] $servicename\n";
          $message.="◆Title : $ticket[title]\n";
          $message.="◆Description\n$ticket[desc]\n";
          $message.="http://status.aws.amazon.com\n";
          $message.="[/info]";
          exec ("/usr/bin/curl -X POST -H \"X-ChatWorkToken: $TOKN\" -d \"body=$message\" \"$CWEP/$RMID/messages\"");
          echo "$message\n";;
          $message="";
        }
      }
    }
  }
}
 
function dateToJST($date) {
  $newdate=DateTime::createFromFormat("D, d M Y H:i:s T", $date);
  $timezone=date_format($newdate, "T");
  if      ($timezone == "PST") { $adjuster="+17 hour"; }
  else if ($timezone == "PDT") { $adjuster="+16 hour"; }
 
  return strtotime($adjuster, strtotime(date_format($newdate, "Y-m-d H:i:s")));
}
?>
  • 途中にはコマンドラインで実行した際のdebug用としてechoで情報を出力するコードも入っている。
  • Intervalは適当に。しかし、cronによる実行間隔とあわせておかないとチェックには漏れが発生するので注意。

댓글

이 블로그의 인기 게시물

curl 명령어 옵션

CISCO 2960s 초기화 후 기본 설정

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