オンプレミス(自社、自宅サーバ)の時代から、 公開Webサービスをやるものにとって、アクセス負荷分散は避けて通れないところです。 こういった負荷分散は、通常ロードバランサで行います。apache2でもnginxでも設定すればできますね。 さらに冗長化も考えるとVRRPを吐くKeepalivedあたりが定番でしょうか。poundなんかも設定が簡単で良いですね。
しかし、オンプレミスで Webサーバの方を負荷に応じて台数を増減するとなると相当敷居の高い 話になります。 サーバの台数をおいそれと増やす訳にはいかず、上限は決まっているわけですから。
でもクラウドなら、サーバの台数もスペックもある程度自由にできます。ポチッとすると5分くらいでサーバは用意されますよね。 いっそ アクセスに応じてサーバの台数を可変してくんないかなー と思いますね。 AWSでこれを実現する仕組みがEC2 AutoScaling & Elastic Load Balancerです。
......ここまでは前置きですが、ネットを調べた感じ、日本語で具体的な手順を記した資料があまりなく、 見つけた講演会かなんかのPPTに書いてあるコマンドラインを打ってもエラーが出てすごい苦労したので、 チートシートにまとめることにしました。
方針は「Web(AWS Console)でできることはそこでする」です(笑)
あと、これ動的サイトの話です。静的なHTMLと画像のみのサイトは、 こんな面倒なことをしなくてもS3とCloudFrontでできます。
ここはさらっと。
* インスタンスをセーブしてAMIを作成しておく。 * ami-id(ami-XXXXXX、など)をひかえておく。 * ヘルスチェック(正常時必ず200,異常時5xxを返す)ファイルを用意してからセーブすること。 * 起動時にWebサーバが自動起動するようにしておくこと。 * AMIのリージョン(us-west-2、など)を確認しておく。
ロードバランサー(ELB)の設定をしておく。
* Load Balancer Nameをつける(www2、など) * Create an internal load balancerのチェックをしない * Load blaancer Protocolはデフォルト(HTTP:80)のまま * Security GroupsはAMIのデフォルトで良いでしょう * Response Timeoutは、該当するCGIがかかる最大秒数を設定(60秒以上は工夫が必要) * Manually Add Instances to Load Balancerはスキップ
出来上がったらDNS Name(www2-4444444.us-west-2.elb.amazonaws.com、など)と、 Availability Zones(us-west-2a,us-west-2b,us-west-2c、など)を確認しておく。 これらは後々使う。
自分の持っているドメインにELBのDNS Nameを別名(CNAME)で書き込んでおく。 ELBはホストやゾーンを渡り歩くので、AレコードやIPアドレスで指定してはいけない。 私は*.papa.toをもっているので、
IN CNAME www2 www2-4444444.us-west-2.elb.amazonaws.com. (末尾のピリオド.を忘れないこと)
こうしておくと、www2.papa.toは別名でAWSのELBサーバのIPアドレスになるというわけ。 DNSが更新されるまでサイトによっては時間がかかるので、AutoScaling設定前にやっておいた方がよい。
Webでやる方針なのだが、オートスケーリングだけはツールでしか設定できないので EC2 API Tools(ec2-api-tools.zip)と、Auto Scaling Command Line Tool(AutoScaling-2011-01-01.zip)を 落としてきて、ホームなどで展開し環境変数を整える。私のようにMacOS Xを使っている人はJAVA_HOMEも参考に。
---------.profile-------- export JAVA_HOME=/Library/Java/Home export AWS_AUTO_SCALING_HOME=/Users/papanda/AutoScaling-1.0.61.3 export EC2_HOME=/Users/papanda/ec2-api-tools-1.6.10.1 export AWS_ACCESS_KEY=AAAAAAAAAAAAAAAA export AWS_SECRET_KEY=BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB export AWS_CREDENTIAL_FILE=/Users/papanda/.autoscaling export PATH=$PATH:$AWS_AUTO_SCALING_HOME/bin -------------------------
オートスケーリングツールは環境変数ではなく設定ファイルが必要。これもホームに。
-------.autoscaling---- WSAccessKeyId=AAAAAAAAAAAAAAAA AWSSecretKey=BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB -----------------------
オートスケーリングの設定を開始する。名前はMyLC。
$ as-create-launch-config MyLC --image-id ami-xxxxx --instance-type t1.micro --region us-west-2 OK-Created launch config
image-idに起動したいWebサーバのimage-idを設定する。instance-typeはお金次第だが負荷テストを考えるとmicroが良い。
Malformed input-AMI ami-xxxxx is invalid: The image id '[ami-xxxxxx]' does not exist
というエラーが出た場合、先ほどAMIをセーブしたリージョンを設定すること。
オートスケーリンググループを設定する。名前はMyASG。サーバ台数を調整したい場合はmin-size,max-sizeを調整する。
$ as-create-auto-scaling-group MyASG --launch-configuration MyLC \ --availability-zones=us-west-2a,us-west-2b,us-west-2c \ --min-size 1 --max-size 10 --load-balancers www2 --region us-west-2 OK-Created AutoScalingGroup
この時点でインスタンスが起動し始める。起動しなかったらAMI(VPC)の設定などを確認すること。 また、上記のコマンドラインで以下のようなエラーが出た場合はavailability-zonesとload-balancersに間違いがないか確認すること。
as-create-auto-scaling-group: Malformed input-Launch configuration name not found - null
スケールアップ&ダウンポリシーを設定する。名前はScaleUpとScaleDown(そのまんま)。 どかんと増やしたり減らしたりしたい場合はadjustmentを調整する。
$ as-put-scaling-policy ScaleUp --auto-scaling-group MyASG --adjustment=1 --type ChangeInCapacity --region us-west-2 arn:aws:autoscaling:us-west-2:.......
$ as-execute-policy ScaleUp --auto-scaling-group MyASG --region us-west-2 OK-Executed Policy
$ as-put-scaling-policy ScaleDown --auto-scaling-group MyASG --adjustment=-1 --type ChangeInCapacity --region us-west-2 arn:aws:autoscaling:us-west-2:.......
$ as-execute-policy ScaleDown --auto-scaling-group MyASG --region us-west-2 OK-Executed Policy
コマンドライン作業はここまでで終わり。
オートスケーリングはCloudWatchのアラームと密接に関連している。 CloundWatch(異常検出) --> AutoScalingが受信 --> ポリシーに従いEC2インスタンスを増減、という手順。
Create Alarm Wizardにはいり、メトリクスビューイングで「EC2: Aggregated Auto Scaling Group」を選択し、 該当のオートスケーリンググループ(MyASG)群から、CPUUtilizationなどのメトリクスを選択して作成する。 Define Your Actionsで、Take actionに 「Auto Scaling Policy」を選択し、Auto Scaling Groupに「MyASG」、 Policyに「ScaleUp(またはDown)」を選択 して登録する。これらは当然ポリシーが作成されていなければ選択できないので、 選択肢に現れなければ設定を見直す。
![]() |
あと、当然しきい値などの条件が異なるので、ScaleUpとScaleDownは別々のアラームで作成すること。
![]() |
忘れちゃいけないオートスケーリングの消し方。無限に金を取られる。
$ as-delete-auto-scaling-group MyASG --region us-west-2 --force-delete Are you sure you want to delete this AutoScalingGroup? [Ny]y OK-Deleted AutoScalingGroup
$ as-delete-launch-config MyLC --region us-west-2
Are you sure you want to delete this launch configuration? [Ny]y OK-Deleted launch configuration
多少強引ですが以上です。
次回があれば実際の変動具合を見てみましょう。
![]() |