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(インスタンスのステータスチェック失敗)
上記項目であれば何の苦労もなく、CLIからでもGUIからでも設定するだけで監視が開始できます。
面倒なのは、CustomMetricsを使用する場合です。
Custom Metrics を使用すると、好きな項目を自由に設定して、結果をCloudWatchに送信できます。
cronで一定時間置きにCloudWatchに送信することで、カスタムメトリクスを監視対象とすることができます!
でも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 Linux を CentOS で動かすまでの手順は続きから。
cloudwatchのあれやこれ
結論から言うと、CloudWatchに頼るのは必ずしもベストなソリューションであるとは限りません。
Amazon SNSとの連携や、監視対象となるAmazon独自サービス各種に対応していることから、便利ではありますが、とても大変な想いをしたので苦労ログを残しておきます。
[ CloudWatchが光る場面 ]
・アラート先が複数あったり、メールサーバを自前で立てていなかったりする場合にAmazon SNSでカンタンにアラートメールの設定が可能
・Amazon EC2(AmazonLinux), RDS, DynamoDBなどAmazonが提供するサービスの監視
[ CloudWatchが影を落とす場面 ]
・Amazon EC2にAmazon Linux以外のOSを入れて使う場合
上記のような考えに至りました。
影の理由としては、何と言っても環境構築の煩わしさ。
PATHを通したり、yumではいらない Amazon Tool群に吐き気がします。
終いには Custom Metricsという後から追加パッケージ的なCloudwatch用の追加Metricsを動かすまでの戦いに疲弊しました。
ということで、EC2にCentOSなんて入れた場合には、おとなしくZabbixで監視しとけばいいんではないでしょうか。
それでもEC2にCentOS入れて、なおかつCloudWatchでバリバリ監視したい!なんて我儘な方は構築ログを参考にしていただければ幸いです。
EC2 ( CentOS ) をCloudWatchで監視する
ELBがつながらないわ、設定でエラーでるわ
VPCで環境構築する案件で、OnDemand NATパターンっぽい箇所の構築ではまりました。
つくろうとしてるのはこんな感じ
引用: 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に切り替えようとしたところ
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
とりあえず直った!