curl 명령어 옵션

# 결과를 지정한 이름으로 파일에 저장 $ curl -o response.txt https://www.example.net # 결과를 파일이름으로 저장, index.html 이 저장됨  $ curl -O https://www.example.net/index.html # SSL증명서 에러 무시 $ curl -k https://www.example.net # 진척상황을 표시 하지 않기, 에러도 표시되지 않음 $ curl -s -o response.txt http://www.example.net # 에러메시지는 보고 싶을때 $ curl -sS -o response.txt http://www.example.net # progress bar로 진척상황표시 $ curl -# -O http://www.example.net/index.html # proxy이용시 $ curl -x <proxyip>:<port> --proxy-user <username>:<password> http://www.example.net $ curl -x <username>:<password>@<proxyip>:<port> http://www.example.net # 301/302등의 redirect를 자동인식 $ curl -L http://www.example.net # http의 메소드를 지정 $ curl -X [PUT|GET|POST] http://www.example.net # parameter를 POST로 송신 $ curl -w '\n' 'http://www.example.net/posturl' -X POST --data 'name=myname&mode=create' # status code만 출력 $ curl -sS -w '%{http_code}\n' http://www.example.net  # http의 response header를 확인

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による実行間隔とあわせておかないとチェックには漏れが発生するので注意。

댓글

이 블로그의 인기 게시물

해외거주 국민을 위한 "교민폰" 사용후기

일본 취업에 대한 단상

CISCO 2960s 초기화 후 기본 설정