Archive for 11月 10th, 2013

【AWS】AutoScaleの設定について

最近業務でAWSのAutoScale機能を利用してサービスの運用をしています。
そこで培ったノウハウや設定内容を記載していこうと思います。

まず、AWSで利用できるAutoScaleの設定では主に2通りの方法がある。
・負荷によるサーバの増減
・指定時間によるサーバの増減

どちらの増減方法においても、AutoScalingGroupを作成し、そのグループに対してアクションを設定することになります。

AutoScaleで設定する内容

1: LaunchConfigの設定
- オートスケールで起動させるインスタンスのAMIを指定
2: AutoScalingGroupの設定
- オートスケールさせるサーバグループの設定
3: ScaleOutPolicy or ScaleInPolicyの設定
- スケールアウト or スケールインの設定
4: ScaleOutAlerm or ScaleInAlermの設定
- スケールアウト or スケールインの発動をさせる条件の設定
5: Scheduleの設定
- 時間毎にサーバ台数を変化させる設定

以下が、AWS AutoScaleの設定において簡単にまとめた概要図です。

AWS AutoScale設定内容

では、実際に設定手順を書いていきます。
前提条件として、AWS コマンドラインツールもしくはコマンドラインインタフェースがインストールされているものとします。

1: LaunchConfigの設定

LaunchConfigNameの設定

~概要~
 この後設定するAutoScalingGroupの設定において利用する、LaunchConfigを特定する識別子
~オプション~
 launch-configuration-name
~設定値~
 LaunchConfigNameを文字列で設定
※ 命名について
  Launch Configの内容について現状は上書きが出来ない
 そのため、例えばAMI IDを新しいものにしたい場合やインスタンスタイプの変更、スポットの入札価格を変えたい場合には、新しくLaunch Configを作りなおさなければいけない
  そこで、AMI (例:ami-12345678)の[ami-]を除いた上位4桁1234を Launch Config名の後ろにつけて管理している
  また、インスタンス名やスポットの仕様の有無、入札価格もわかるようにLaunch Config名で識別している
  例:M3_2XLARGE_1234

———————————————-

起動AMI IDの設定

~概要~
 AutoScaleで起動させるAMIの設定
~オプション~
 image-id
~設定値~
 作成したAMIのIDを指定
———————————————-

Key pair nameの設定

~概要~
 ログインする際に使用する鍵の名前(秘密鍵ファイル名ではなくKey pair name)
~オプション~
 key-name
~設定値~
 作成したKey pair nameを指定する

———————————————-

セキュリティーグループの設定

~概要~
 起動インスタンスに設定するセキュリティグループIDを指定する
~オプション~
 security-groups
~設定値~
 作成したセキュリティグループ名を指定する

———————————————-

インスタンスタイプの設定

~概要~
 起動するインスタンスのインスタンスタイプ名を指定する
~オプション~
 instance-type
~設定値~
 インスタンスタイプ名を指定する
 参考:http://aws.amazon.com/jp/ec2/instance-types/#selecting-instance-types

———————————————-

スポットインスタンス利用有無の設定

~概要~
 スポットインスタンスを使用する場合、スポット入札価格を指定する
~オプション~
 spot-price
~設定値~
 例)$3で入札する場合
 –spot-price “3.0″

実行コマンド

AWS コマンドラインインタフェースの場合

 [通常インスタンス]

 aws autoscaling create-launch-configuration --launch-configuration-name ${CONFIG_NAME} --image-id ${AMI_ID} --key-name ${KEY_NAME} --security-groups ${SECURITY_GROUP} --instance-type ${INSTANCE_TYPE}

 [スポットインスタンス]

 aws autoscaling create-launch-configuration --launch-configuration-name ${CONFIG_NAME} --image-id ${AMI_ID} --key-name ${KEY_NAME} --security-groups ${SECURITY_GROUP} --instance-type ${INSTANCE_TYPE} --spot-price "${WEB_SPOT_PRICE}" 

AWS コマンドラインツールの場合

 [通常インスタンス]

 as-create-launch-config ${CONFIG_NAME} --image-id ${AMI_ID} --key ${KEY_NAME} --group ${SECURITY_GROUP} --instance-type ${INSTANCE_TYPE}


 [スポットインスタンス]

 as-create-launch-config ${CONFIG_NAME} --image-id ${AMI_ID} --key ${KEY_NAME} --group ${SECURITY_GROUP} --instance-type ${INSTANCE_TYPE} --spot-price "${WEB_SPOT_PRICE}" 

リファレンス

AWS: create-launch-configuration

その他コマンド

設定確認コマンド

CLI(コマンドラインインタフェース) aws autoscaling describe-launch-configurations
CLT(コマンドラインツール) as-describe-launch-configs

設定削除コマンド

CLI(コマンドラインインタフェース) aws autoscaling elete-launch-configuration –launch-configuration-name ${CONFIG_NAME}
CLT(コマンドラインツール) as-delete-launch-config ${CONFIG_NAME}

※ 補足 -f オプションをつけると削除確認を聞かれることなく強制的に削除が出来る。

その他注意事項

削除する際に、Auto Scaling Groupで削除対象のLaunch Configが使われている場合は、削除できない

2: AutoScalingGroupの設定

AutoScalingGroup名

~概要~
 負荷に合わせたサーバの増減やスケジュール機能を利用する際に、Auto Scaling Groupを特定する識別子
~オプション~
 auto-scaling-group-name
~設定値~
 グループ名の設定

———————————————-

LaunchConfig名の設定

~概要~
起動するAMIやインスタンスタイプを指定したLaunchConfig名を指定する
~オプション~
 launch-configuration-name
~設定値~
 LaunchConfigで作成したLaunchConfig名

———————————————-

アベイラビリティゾーンの設定

~概要~
オートスケールによって起動させるインスタンスのアベイラビリティゾーンを指定する
~オプション~
 availability-zones
~設定値~
 A ゾーン : ap-northeast-1a
 C ゾーン : ap-northeast-1c
 均  等 : ap-northeast-1a,ap-northeast-1c
  ※ 東京リージョンの場合

———————————————-

サーバの最小起動台数の設定

~概要~
 最低何台サーバを起動させるかを指定する。0以上の場合、設定したタイミングでサーバが指定台数起動する
~オプション~
 min-size
~設定値~
 最小起動台数の整数値

———————————————-

サーバの最大起動台数の設定

~概要~
 最大何台までサーバを起動させるかを指定する。現在の起動台数が指定台数よりも多い場合、指定した台数までサーバ台数が減少する
~オプション~
 max-size
~設定値~
 最大起動数の整数値

———————————————-

登録するロードバランサの設定(必要があれば)

~概要~
 起動したインスタンスがぶらさがるロードバランサ名を指定する
~オプション~
 load-balancer-names
~設定値~
 Load Balancer Nameを指定する

———————————————-

タグの設定(必要があれば)

~概要~
 起動したインスタンスに設定するタグを指定する
~オプション~
 tags
~設定値~
 ”k=key名, v=値”
 例)
  –tag “k=site, v=${SITE_NAME}” –tag “k=platform, v=${PLATFORM}” –tag=”k=server, v=img”

———————————————-

terminatする順序の設定(必要があれば)

~概要~
 オートスケールによって削除されるサーバの対象を選択するポリシーを指定する
 AWSでは、起動したタイミングで1時間の課金が発生するため、デフォルトでは、次に課金されるまでに一番近いインスタンスから削除される
 例)
  2時間58分起動している Aインスタンス あと2分で次の1時間分の課金が発生する
  3時間40分起動している Bインスタンス あと20分で次の1時間分の課金が発生する
  ⇒ 次に課金が発生するまでに一番近いのはAインスタンスのため先にAインスタンスが削除される
~オプション~
 termination-policies
~設定値~
 調査中

実行コマンド

AWS コマンドラインインタフェースの場合


 aws autoscaling create-auto-scaling-group -auto-scaling-group-name ${AUTO_SCALING_GROUP_NAME} --launch-configuration-name ${LAUNCH_CONFIG_NAME} --min-size ${MIN_SIZE} --max-size ${MAX_SIZE} --availability-zones ap-northeast-1a,ap-northeast-1c --load-balancer-names ${ELB_NAME} --tag "k=site, v=${SITE_NAME}" --tag "k=platform, v=${PLATFORM}" --tag="k=server, v=img" 

AWS コマンドラインツールの場合


   as-create-auto-scaling-group ${AUTO_SCALING_GROUP_NAME} --launch-configuration ${LAUNCH_CONFIG_NAME} --availability-zones ap-northeast-1a,ap-northeast-1c --min-size ${MIN_SIZE} --max-size ${MAX_SIZE} --load-balancers ${ELB_NAME} --tag "k=site, v=${SITE_NAME}" --tag "k=platform, v=${PLATFORM}" --tag="k=server, v=img" 

リファレンス

AWS: create-auto-scaling-group

その他コマンド

設定確認コマンド

CLI(コマンドラインインタフェース) aws autoscaling describe-auto-scaling-groups
CLT(コマンドラインツール) as-describe-auto-scaling-groups

設定削除コマンド

CLI(コマンドラインインタフェース) aws autoscaling delete-auto-scaling-group –auto-scaling-group-name ${AUTO_SCALING_GROUP_NAME}
CLT(コマンドラインツール) as-delete-auto-scaling-group ${AUTO_SCALING_GROUP_NAME}

※ 補足 -f オプションをつけると削除確認を聞かれることなく強制的に削除が出来る。

3: ScakeOutPolicy or ScakeInPolicyの設定

オートスケールでスケールアウトもしくはスケールインの設定を行う
スケールインもスケールアウトもこちらの手順で行うことが出来る

スケールポリシー名の設定

~概要~
 設定するスケールポリシー名を指定する
~オプション~
 policy-name
~設定値~
 スケールアウトかスケールインかをこの値で識別出来るようにしておくのが望ましい
 例:
  ~~_OUT_POLICY、~~~_IN_POLICY

———————————————-

スケールポリシーを適用させるAutoScalingGroupの設定

~概要~
 スケールポリシーを適用させるAutoScalingGroup名を指定する
~オプション~
 auto-scaling-group-name
設定値
 AutoScalingGroupで作成した、AutoScalingGroup名を指定する

———————————————-

スケール時に増減させる数のタイプを指定する

~概要~
 増減させるサーバの「台数指定」や「全体の何割の台数を指定」などの変化タイプを指定する
~オプション~
 adjustment-type
~設定値~
 台数指定:ChangeInCapacity
 調査中 :ExactCapacity
 調査中 :PercentChangeInCapacity

———————————————-

adjustment-typeで指定した、スケール時にサーバの変化値を設定する

~概要~
 サーバ台数の変化値を指定する
~オプション~
 scaling-adjustment
~設定値~
 台数の場合は、整数値を指定する

———————————————-

クールダウンの設定

~概要~
 トリガーを発動させてから次のトリガー発動までの時間を設定する
 例えばトリガーを発動してから10分間は何もせず様子見を行うなどの設定が出来る
 トリガー発動後からサービスとして稼働するまでには多少時間がかかるため、サービス稼働時間から数分くらいの間隔を設定しておくほうが良い
~オプション~
 cooldown
~設定値~
 秒数で指定
 例)15分で指定する場合
  –cooldown 900

実行コマンド

AWS コマンドラインインタフェースの場合


 aws autoscaling put-scaling-policy --policy-name ${POLICY_NAME} --auto-scaling-group-name ${AUTO_SCALING_GROUP} --adjustment-type ChangeInCapacity --scaling-adjustment 2 --cooldown 900

AWS コマンドラインツールの場合


 as-put-scaling-policy ${POLICY_NAME} --auto-scaling-group ${AUTO_SCALING_GROUP} --adjustment=2 --type ChangeInCapacity --cooldown 900 --region ap-northeast-1

実行結果

 「arn:aws:…」から始まる表示は、次のアラーム設定時に必要となるのでメモしておく

リファレンス

AWS put-scaling-policy

その他コマンド

設定確認コマンド

CLI(コマンドラインインタフェース) aws autoscaling describe-policies
CLT(コマンドラインツール) as-describe-policies

設定削除コマンド

CLI(コマンドラインインタフェース) aws autoscaling delete-policy –policy-name ${POLICY_NAME}
CLT(コマンドラインツール) as-delete-policy ${POLICY_NAME}

※ 補足 -f オプションをつけると削除確認を聞かれることなく強制的に削除が出来る。

4: ScaleOutAlerm or ScaleInAlermの設定

スケールアウト及びスケールインの発動をさせる条件の指定を行う

スケールポリシー名の設定

ScaleAlermの設定
~概要~
~オプション~
~設定値~

———————————————-

CloudWatchで管理するnamespaceの設定

~概要~
 CloudWatchのCustom Metricsで表示するグループ名の指定
~オプション~
 namespace
~設定値~
 例)–namespace “EC2/AutoScalingGroup”

———————————————-

CloudWatchの表示設定

~概要~
 CloudWatchで表示する際のカラム名と値の設定を行う
~オプション~
 dimensions
~設定値~
 例)–dimensions “AutoScalingGroupName=${AUTO_SCALING_GROUP}”

———————————————-

監視する項目の設定

~概要~
 CloudWatchで監視している監視項目(metric)の指定
~オプション~
 metric-name
~設定値~
 EC2のデフォルトだと以下の10項目を使用できる
 - CPUUtilization
 - DiskReadBytes
 - DiskReadOps
 - DiskWriteBytes
 - DiskWriteBytes
 - NetworkIn
 - NetworkOut
 - StatusCheckFailed
 - StatusCheckFailed_Instance
 - StatusCheckFailed_System

 ・CustomMetricsの設定
  デフォルトではロードアベレージを監視できないためCustomMetricsを登録する必要がある。

  CustomMetricsの設定については別記事にて
  参考ページ:CloudWatchのカスタムメトリクス
———————————————-

監視する項目の設定

~概要~
 監視項目の「測定値」の算出方法
 アラートを出す際の測定が複数サーバの合計値や平均値といった指定を行うことが出来る
~オプション~
 statistic
~設定値~

対象台数 SampleCount
平均値 Average
合計値 Sum
最小値 Minimum
最大値 Maximum

———————————————-

CloudWatchによる監視間隔の指定

~概要~
 CloudWatchによる監視間隔を指定する
~オプション~
 period
~設定値~
 秒数で指定する。
 60秒間隔で指定、最低60秒

———————————————-

閾値オーバー時のトリガー発動までの間隔の設定

~概要~
 閾値オーバーが観測された場合のトリガー発動回数を指定する
 計測値の閾値オーバーが何回連続で検知されたらトリガーを発動するという指定を行う
~オプション~
 evaluation-periods
~設定値~
 3回連続で閾値オーバーの時トリガーを発動するという指定の場合
  –evaluation-periods 3

———————————————-

閾値を検知するための測定値との不等号の設定

~概要~
 測定された結果と閾値を比べる際の不等号の設定を行う
~オプション~
 comparison-operator
~設定値~

< = GreaterThanOrEqualToThreshold
< GreaterThanThreshold
> LessThanThreshold
>= LessThanOrEqualToThreshold

 例)
  閾値の指定が測定値が5以上のとき
  –comparison-operator GreaterThanThreshold 閾値の設定

———————————————-

トリガー発動のに対する閾値の設定

~概要~
トリガー発動に対する閾値の設定を行う
単位はmetric-nameで指定した監視項目の値に関連する
~オプション~
threshold
~設定値~
 ロードアベレージが5以上としていするとき
  –threshold 5 –comparison-operator GreaterThanThreshold

———————————————-

トリガー発動時のポリシーの設定

~概要~
 トリガー発動時にどのScalePolicyを適用するかの指定を行う
~オプション~
 alarm-actions
~設定値~
 ScalePolicyで作成した際に出力されたarm:aws…の値を指定する
 –alarm-actions arn:aws:…….

実行コマンド

 条件:1分間隔で計測し、ロードアベレージが3回連続5以上を検知した場合にアラームを発動させる

AWS コマンドラインインタフェースの場合


 aws cloudwatch put-metric-alarm --alarm-name ${ALARM_NAME} --namespace  "EC2/AutoScalingGroup" --dimensions "AutoScalingGroupName=${AUTO_SCALING_GROUP}" --metric-name ${METRIC_NAME} --statistic Average --period 60 --evaluation-periods 3 --comparison-operator GreaterThanThreshold --threshold 5 -alarm-actions ${ALARM_ACTIONS}

AWS コマンドラインツールの場合


 mon-put-metric-alarm ${ALARM_NAME} --namespace "EC2/AutoScalingGroup" --dimensions "AutoScalingGroupName=${AUTO_SCALING_GROUP}" --metric-name ${METRIC_NAME} --statistic Average --period 60 --evaluation-periods 3 --comparison-operator GreaterThanThreshold --threshold 5 -alarm-actions ${ALARM_ACTIONS}

リファレンス

AWS put-metric-alarm

Scheduleの設定

時間帯によってサーバ台数を変化させる設定を行う

スケジュール名の設定

~概要~
 スケジュール名を指定する
 何時に実行するかをスケジュール名からわかる命名にしている
~オプション~
 scheduled-action-name
~設定値~
 2時に実行する場合の命名
  0200_ACTION

———————————————-

スケジュールで変化させるAutoScalingGropの設定

~概要~
 スケジュールによって増減させるAutoScalingGropを指定する
~オプション~
 auto-scaling-group-name
~設定値~
 AutoScalingGropで作成したAutoScalingGrop名を指定する

———————————————-

スケジュール実行時間の指定

~概要~
cronと同じ指定で行える
 グリニッジ標準で指定する必要があるため、日本時間より9時間の設定する必要がある
~オプション~
 recurrence
~設定値~
 2時に指定する場合
  –recurrence “0 17 * * *”

———————————————-

サーバ台数の指定

~概要~
 指定時間に起動させておくサーバ台数の指定する
~オプション~
 desired-capacity
~設定値~
 2台にする
  –desired-capacity 2

実行コマンド

 条件:深夜2時に2台までサーバ台数を減らす

AWS コマンドラインインタフェースの場合


 aws autoscaling put-scheduled-update-group-action --scheduled-action-name ${ACTION_NAME} --auto-scaling-group-name ${GROUP_NAME}  --recurrence "0 17 * * *" --desired-capacity 2

AWS コマンドラインツールの場合


 as-put-scheduled-update-group-action ${ACTION_NAME} -g ${GROUP_NAME} --recurrence "0 17 * * *" --desired-capacity 2

リファレンス

AWS put-scheduled-update-group-action

その他コマンド

設定確認コマンド

CLI(コマンドラインインタフェース) aws autoscaling describe-scheduled-actions
CLT(コマンドラインツール) as-describe-scheduled-actions

設定削除コマンド

CLI(コマンドラインインタフェース) aws autoscaling delete-scheduled-action –scheduled-action-name ${ACTION_NAME} –auto-scaling-group-name ${GROUP_NAME}
CLT(コマンドラインツール) as-delete-scheduled-action ${ACTION_NAME} –auto-scaling-group ${GROUP_NAME}

※ 補足 -f オプションをつけると削除確認を聞かれることなく強制的に削除が出来る。

その他

スケジュールの登録については、デフォルトでは20個までしか登録できないようだ。。。

まとめ

現在は、基本的にはスケジュール機能を利用したサーバ台数の変化のみをメインで利用しております。
また、Jenkinsでこのへんの設定を簡単に出来るように設定しているため、それは別途記事にて紹介させて頂きます。

AutoScaleを利用して、急激な負荷増加に備え、またスケジュール機能などを利用して負荷に合わせたサービス運用の自動化を行うのはいかがでしょうか。

参考

AmazonAutoScaling機能について

AWS コマンドラインインターフェイス