higehikiのブログ

iPhoneアプリ「ログ雀」の中の人です。

CloudWatchでhttpdプロセスを監視する

EC2 ( CentOS ) をCloudWatchで監視する で紹介したカスタムメトリクスの手法では、Amazon CloudWatch Monitoring Scripts for Linux という追加モジュールで簡易的に対応できました。

今回の「httpdプロセスを監視する」要件の場合は、上記のスクリプトでは対応できません(中身書き換えればできるんだろうけどw)ので、おとなしく CloudWatch Command Line Tools を使い、カスタムメトリクス (CustomMetrics)を送信します。

ダウンロード
http://ec2-downloads.s3.amazonaws.com/CloudWatch-2010-08-01.zip

リファレンス http://awsdocs.s3.amazonaws.com/AmazonCloudWatch/latest/acw-qrc.pdf

適宜、都合のいい場所にダウンロード、展開するだけで基本的に利用可能ですが、yumでインストールしていない場合、PATHを通す必要があります。ココで結構僕はハマりました。
あとは JAVAのインストールが必要です。

# cd /usr/local/
# wget http://ec2-downloads.s3.amazonaws.com/CloudWatch-2010-08-01.zip
# unzip CloudWatch-2010-08-01.zip

# vi /home/ec2-user/bin/custom_metrics_httpd_report.sh
#!/bin/bash

export AWS_CLOUDWATCH_HOME=/usr/local/CloudWatch-1.0.20.0
export AWS_CREDENTIAL_FILE=/etc/aws/aws-credential-file
export AWS_CLOUDWATCH_URL=https://monitoring.amazonaws.com
export PATH=$AWS_CLOUDWATCH_HOME/bin:$PATH
export JAVA_HOME=/usr

InstanceId=i-xxxxxxx

apachecnt=`ps cax | grep httpd | wc -l`

let "allcnt=apachecnt"

if [ "$allcnt" -gt "0" ]; then
 Processes=1
else
 Processes=0
fi

mon-put-data --metric-name "HttpdProcesses" --namespace "System/Linux" --dimensions "InstanceId=$InstanceId" --value "$Processes" --unit "Count" --region ap-northeast-1
# chmod 755 /home/ec2-user/bin/custom_metrics_httpd_report.sh

sh内で PATHを通すことで対応していますが、bashrc何かで通しちゃってもいいと思います。
また、namespaceは自由に定義できますが、System/Linux としておくことで、CloudWatch上では幾分か見やすいかもしれません。

こんな感じで、httpd以外のプロセスも shスクリプトをごにょごにょして監視させられますし、監視条件も自由です。
ちょっと便利かもしれません。

EC2 ( CentOS ) をCloudWatchで監視する

デフォルトのCloudWatchで監視できる項目は以下。

  • CPU Utilization(CPU使用率)
  • Disk Reads(ディスク読み込み状況)
  • Disk Writes(ディスク書き込み状況)
  • Network In,Out(ネットワーク状況)
  • Status Check Failed(インスタンスのステータスチェック失敗)

http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/ec2-metricscollected.html#ec2-metrics

上記項目であれば何の苦労もなく、CLIからでもGUIからでも設定するだけで監視が開始できます。

面倒なのは、CustomMetricsを使用する場合です。
Custom Metrics を使用すると、好きな項目を自由に設定して、結果をCloudWatchに送信できます。
cronで一定時間置きにCloudWatchに送信することで、カスタムメトリクスを監視対象とすることができます!
f:id:higehiki:20140421171749p:plain

でも1個1個手で書くのは大変…そこで。
Amazonさんの優しさ100%スクリプト Amazon CloudWatch Monitoring Scripts for Linux ってのが公式で公開されています。
http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/mon-scripts-perl.html
こいつは、32bitだろうが64bitだろうが、AmazonLinuxはもちろん、Redhat, Ubuntu, SUSE Linuxまで動く perlスクリプトです。
すげーひゃっほーひゃっほー。

このスクリプトで提供される項目は以下。

  • MemoryUtilization
  • MemoryUsed
  • MemoryAvailable
  • SwapUtilization
  • SwapUsed
  • DiskSpaceUtilization
  • DiskSpaceUsed
  • DiskSpaceAvailable


Amazon CloudWatch Monitoring Scripts for LinuxCentOS で動かすまでの手順は続きから。

続きを読む

cloudwatchのあれやこれ

結論から言うと、CloudWatchに頼るのは必ずしもベストなソリューションであるとは限りません。
Amazon SNSとの連携や、監視対象となるAmazon独自サービス各種に対応していることから、便利ではありますが、とても大変な想いをしたので苦労ログを残しておきます。

[ CloudWatchが光る場面 ]
・アラート先が複数あったり、メールサーバを自前で立てていなかったりする場合にAmazon SNSでカンタンにアラートメールの設定が可能
Amazon EC2(AmazonLinux), RDS, DynamoDBなどAmazonが提供するサービスの監視

[ CloudWatchが影を落とす場面 ]
Amazon EC2Amazon Linux以外のOSを入れて使う場合

上記のような考えに至りました。
影の理由としては、何と言っても環境構築の煩わしさ。
PATHを通したり、yumではいらない Amazon Tool群に吐き気がします。
終いには Custom Metricsという後から追加パッケージ的なCloudwatch用の追加Metricsを動かすまでの戦いに疲弊しました。

ということで、EC2にCentOSなんて入れた場合には、おとなしくZabbixで監視しとけばいいんではないでしょうか。

それでもEC2にCentOS入れて、なおかつCloudWatchでバリバリ監視したい!なんて我儘な方は構築ログを参考にしていただければ幸いです。

EC2 ( CentOS ) をCloudWatchで監視する

任意のタイミングでAMIを生成して、それをベースにインスタンスを作って、ELBにぶらさげるスクリプト

立て続けにAWSネタ。
オートスケールがどうしても使えない案件で、直前にAMIをコピーしてインスタンスを作る手動作業から解放されるため、スクリプトを組んでみました。

f:id:higehiki:20140416213942p:plain

SDKで何でも出来て本当に便利です。

ただ、作ったインスタンスを任意のタイミングで落としたいんですが、そのスクリプトを組む気力が残ってない…。

サンプルスクリプトは続きから。

続きを読む

AWS SDK for PHP を使って動的にオートスケールインスタンスのプライベートIPを抽出する

f:id:higehiki:20140416125608p:plain

オートスケールを設定して動的にインスタンスが増減する仕組みに対して、管理インスタンスからリクエストを動的に送るための方法を検討していました。

特定のAvailabilityZoneのみが対象だったので、正規表現でPrivateIPを取ってくるとかいうやっつけの方法で対応しておいたんですが、あまりにもイケてないので、インスタンスに付随するタグ情報を基にスクリプトを再実装しました。

続きを読む

ELBがつながらないわ、設定でエラーでるわ

VPCで環境構築する案件で、OnDemand NATパターンっぽい箇所の構築ではまりました。

つくろうとしてるのはこんな感じ
f:id:higehiki:20140327142123p:plain
引用: http://dev.classmethod.jp/cloud/amazon-vpc-elb-nat/

事象としては、PrivateSubnetと定義した中に、Webインスタンスを置いて、ELBでアクセスするってだけたったんですが、ブラウザから繋がらずタイムアウトしてしまう…。

ACLやSecGroup、ルーティング、NATのiptablesなど色々見回りましたが、解決できず3日ぐらいハマってました。
apacheアクセスログはELBからの死活監視だけ流れている状態。

最終的に他の案件で上手くいっているものと見比べて発見したのが、ELBのAvailability Zoneの設定でした。

ELBもPrivateSubnetになってるし…

げんなりしながら、PublicSubnetに切り替えようとしたところ
f:id:higehiki:20140327142128p:plain
You are not able to change all the subnets on a load balancer at the same time
こんなエラー。

なんなんですかw

原因はよくわかりません。

が、問題に対する解決方法は以下。

[ 問題 ]
ELBの Availability Zone に ap-northeast-1a (PrivateSubnet) が設定されている

[ 目的 ]
ELBの Availability Zone に ap-northeast-1a (PublicSubnet) が設定されている

[ 解決 ]
1. ELBの Availability Zone に ap-northeast-1b (PrivateSubnet) を追加
2. Save
3. ELBの Availability Zone に ap-northeast-1a (PrivateSubnet) を削除
4. Save
5. ELBの Availability Zone に ap-northeast-1a (PublicSubnet) を追加
6. Save
7. ELBの Availability Zone に ap-northeast-1b (PublicSubnet) を削除
8. Save

なんだこれ…w

とりあえず直った!

いつの間にか色々変わってるAWS

しばらく触らない間に色々変わりすぎててしんどい…。
VPC内のインスタンスでもmicroが使えるようになってるし、ELB単体でログ出力が可能になってるし、Connection Drainingってオプションも増えててコレがまたイケてる奴の様子。

http://aws.typepad.com/aws_japan/2014/03/elb-connection-draining-remove-instances-from-service-with-care.html

うん、イケてる。


VPC NAT構成でPublicとPrivateのサブネットを用意してみたんだけど、内→外への通信が上手くいってない。iptablesの設定もひと通りやったんだけどなぁ。
ポート周りもっかい見なおすかな。