読者です 読者をやめる 読者になる 読者になる

WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

EC2のAutoScaling設定

サーバ担当の中村です。
今日はAWS(Amazon Web Services)のEC2(Elastic Compute Cloud)をオートスケールする設定について書いてみようと思います。

オートスケールとは

AWSを利用するメリットとしてよくあげられるのが「スケールしやすい」という点です。
「利用者が多く負荷が高くなったらサーバ台数を増やし、利用者が少なくなったらサーバ台数を減らす」
自前でサーバを所持しているとなかなかこういうことはできません。

EC2ではサーバの負荷を監視して負荷状況に応じてサーバの台数を自動で変更する機能が提供されています。
これがオートスケールです。

※オートスケール設定はCUIからしかできないので注意してください。


PATHを通す

AutoScalingCLIはAWSのサイトからダウンロードしてローカルで解凍し、パスを通す必要があります。

他のサイト、ブログ等でも掲載されていますが、.bash_profileに以下のような設定をします。

#JAVAで動くのでJAVAのPATHを通す  
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home  
#APIへのPATHを通す  
APIPATH=/Users/[UserName]/Documents  
export AWS_AUTO_SCALING_HOME=${APIPATH}/autoscaling  
export AWS_CREDENTIAL_FILE=${AWS_AUTO_SCALING_HOME}/credential-file-path  
export PATH=$PATH:$JAVA_HOME/bin:$AWS_AUTO_SCALING_HOME/bin:  

credential-file-pathの内容はこんな感じです。

aws_access_key_id=[awsのaccess_key]  
aws_secret_access_key=[awsのsecret_key]  

設定が終わったらsource .bash_profileで反映させます。

ターミナル上で「as-」と入力して補完してみてこのようになれば設定は完了です。
screenshot_n


設定の概要

オートスケーリングの設定は大きく分けて4つの構成で成り立っています。
①launch-config設定
→オートスケールで自動生成されるインスタンスを定義します。
②auto-scaling-group設定
→ロードバランサを指定して、最小構成と最大構成を設定します。
③scaling-policy設定
→何台ずつスケールするかを設定します。
④metric-alarm設定
→この設定をすることでCloudWatchのアラーム設定に登録され、イベントと同時にオートスケールされます。
※metric-alarm設定だけは一度設定すればCloudWatchからGUIで変更することができます。


オートスケールで生成するインスタンスを設定する

まず、オートスケールで生成されるインスタンスの設定を行います。
・設定名は[wp-launch-config]で、インスタンス生成に使うAMIは[ami-8*40**ee]
インスタンスタイプは[m1.small]で、リージョンは[ap-northeast-1]
・適用するセキュリティグループは[default]で、SSHキーは[wonderkey]を使用する

// オートスケールで生成するインスタンスを定義する  
as-create-launch-config wp-launch-config  
 --image-id ami-8*40**ee  
 --instance-type m1.small  
 --region ap-northeast-1  
 --group default  
 --key wonderkey  

オートスケールするグループを設定する

次に、先程設定したインスタンス設定を使ってオートスケールするグループを設定します。
・グループ名は[wp-auto-scale-group]
・生成するインスタンスは[先程設定したwp-launch-config]
・availability-zoneは[ap-northeast-1aとap-northeast-1c]
・最小構成は[2台]、最大構成は[10台]、
・設定は[wonder-balancer]というロードバランサに紐づける

// オートスケーリンググループを作成する  
as-create-auto-scaling-group wp-auto-scale-group  
 --launch-configuration wp-launch-config  
 --availability-zones ap-northeast-1a ap-northeast-1c  
 --min-size 2  
 --max-size 10  
 --load-balancer-names wonder-balancer  

オートスケールの際のポリシーを設定する

次に、オートスケールの際のポリシー(インスタンスの増え方と減り方)を設定します。
※スケールアウトのポリシーとスケールインのポリシーの2つを作る必要があります。
※この設定を行った際に表示される[arn]は次の設定で使用するのでコピーしておいてください。
-----スケールアウト設定-----
・ポリシー名は[wp-scale-OUT-on-CPU]で、対象のグループは[wp-auto-scale-group]
・[2台ずつ]インスタンスを増やす
-----スケールイン設定-----
・ポリシー名は[wp-scale-IN-on-CPU]で、対象のグループは[wp-auto-scale-group]
・[2台ずつ]インスタンスを減らす

//スケールアウトのポリシーを設定  
as-put-scaling-policy wp-scale-OUT-on-CPU  
 --auto-scaling-group wp-auto-scale-group  
 --type ChangeInCapacity  
 --adjustment=2  
//スケールインのポリシーを設定  
as-put-scaling-policy wp-scale-IN-on-CPU  
 --auto-scaling-group wp-auto-scale-group  
 --type ChangeInCapacity  
 --adjustment=-2  

実行すると以下のような表示がされます。
arn:aws:autoscaling:ap-northeast-1:79226114:scalingPolicy:b45647e****21e-a61a90679c4d:autoScalingGroupName/wp-auto-scale-group:policyName/wp-scale-OUT-on-CPU


オートスケールの条件を設定する

最後にオートスケールの詳細な条件を設定して全設定が完了します。
※スケールアウトの条件とスケールインの条件の2つを作る必要があります。
-----スケールアウト設定-----
・アラーム名は[alarm-wp-scale-OUT]
・アラームによって起こされる動作は[先程ポリシーを設定した際に出力されたコード]
・メトリックはEC2のCPU平均使用率を基準に
・50%を超える状態が2分以上続いたらオートスケールアウトを実行する
-----スケールイン設定-----
・アラーム名は[alarm-wp-scale-IN]
・アラームによって起こされる動作は[先程ポリシーを設定した際に出力されたコード]
・メトリックはEC2のCPU平均使用率を基準に
・20%を下回る状態が5分以上続いたらオートスケールインを実行する

// オートスケールアウト条件を設定する(アラーム設定)  
mon-put-metric-alarm alarm-wp-scale-OUT  
 --alarm-actions <ins datetime="2013-12-05T10:29:10+00:00">arn:aws:autoscaling:ap-northeast-1:7922****6114:scalingPolicy:b45647e********21e-a61a90679c4d:autoScalingGroupName/wp-auto-scale-group:policyName/wp-scale-OUT-on-CPU</ins>  
 --metric-name CPUUtilization  
 --unit Percent  
 --namespace AWS/EC2  
 --statistic Average  
 --dimensions="AutoScalingGroupName=wp-auto-scale-group"  
 --period 60  
 --evaluation-periods 2  
 --threshold 50  
 --comparison-operator GreaterThanThreshold  
// オートスケールイン条件を設定する(アラーム設定)  
mon-put-metric-alarm alarm-wp-scale-OUT  
 --alarm-actions arn:aws:autoscaling:ap-northeast-1:8822****1214:scalingPolicy:a45347e********11f-a61a22649d4d:autoScalingGroupName/wp-auto-scale-group:policyName/wp-scale-IN-on-CPU  
 --metric-name CPUUtilization  
 --unit Percent  
 --namespace AWS/EC2  
 --statistic Average  
 --dimensions="AutoScalingGroupName=wp-auto-scale-group"  
 --period 60  
 --evaluation-periods 5  
 --threshold 20  
 --comparison-operator LessThanThreshold  

これで「要約すると」
指定したロードバランサ配下にあるEC2インスタンスの平均CPU使用率を監視する
負荷状況に応じてサーバ台数が2台〜10台の範囲でオートスケールする
というオートスケール設定が完了しました。
topコマンドなどでサーバに負荷をかけてみてオートスケールされるかどうかを確認してみてください。

設定してみた感想は、「手順が多くて分かりにくい」(笑)
早くGUIで設定できるようにしてもらいたいですね。

ちなみにワンダープラネットでは[オンデマンドインスタンス][スポットインスタンス]をオートスケール設定してあります。
[スポットインスタンス]は急に負荷が上昇した場合に、[オンデマンドインスタンス]は負荷が高止まりしている場合にといった具合に特性に合った運用を考えるといいと思います。