やってみたこと
WEBサーバのレスポンスが遅くなったときに、EC2インスタンスが自動で追加されたらいいなーという事でやってみました!
ELB配下にWEBサーバを配置します。
監視サーバでは、curlでELBに接続しレスポンスタイムをCloudWatchにPUTします。※カスタムメトリクスを使います。
レスポンスが遅くなったら、AutoScalingを発動しELB配下にWEBサーバを追加します。
監視サーバスクリプト
cronにて定期実行します。
#!/bin/bash
### 変数
# ELBのURL
URL="http://***"
### 処理部
# ELBにアクセスした際にかかった時間を取得する
gettime=`curl -kL ${URL} -o /dev/null -w "%{time_total}" 2> /dev/null`
# メトリックデータをPUTする
aws cloudwatch put-metric-data \
--metric-name "***" \
--namespace "***" \
--dimensions "***=***" \
--value ${gettime} \
--unit "Seconds"
AutoScaling
AutoScalingでは、ELBを指定する事ができます。
AutoScaling発動時に、指定したELB配下にアタッチされるようになります。
CloudWatch(アラーム)
アラームを作成し、遅延が発生した際にサーバ台数を増やします。
アラームでは、ActionとしてAutoScalingPolicyを指定できます。
試験スクリプト
PHPで指定した時間スリープするようにしました。
CloudWatchのカスタムメトリクス画面にて、3秒間のレスポンスタイムになった事を確認しました。
sleep(3);
echo "hello";
?>
試験
CloudWatchアラームと試験スクリプトのsleep時間を調整します。
AutoSalingが発動し、ELB配下に組み込まれたら成功です。
課題
コンテンツ同期が大変かも?
AMIを最新化するか、AutoSaling発動時にGitからコンテンツを取得するような仕組みが必要そうです。
サーバを減らす処理のトリガーが迷いどころです。今回は、AutoScalingPolicyを手動実行する想定にしました。