hbstudy#41 × IDCF クラウドハンズオン



   Fabric と Monit を使って
オートスケーリングを自作してみよう




           2013 年 2 月 2 日




             @tafujish
hbstudy#41×IDCF クラウドハンズオン

目次
0. この文書について .................................................................. 3
1. IDCF クラウド上に仮想マシンを作成してみる.......................................... 4
 1)   ポータルサイトから作業用の仮想マシンを作成 .................................... 4
 2)   SSH 接続するためのネットワーク設定 ............................................. 4
2. Fabric をインストールして触ってみる................................................ 5
 1)   作業用 VM(CentOS 6.3)に SSH ログイン ............................................ 5
 2)   Fabric をインストール .......................................................... 5
 3)   秘密鍵を設置 .................................................................. 5
 4)   fabfile を作成し実行 ........................................................... 5
3. Fabric から Redis をインストールしてみる............................................ 7
 1)   EPEL リポジトリを追加し、Redis をインストール .................................. 7
4. Fabric から API 経由で仮想マシンを作成してみる ...................................... 8
 1)   リポジトリを追加し、API ツールインストール ..................................... 8
 2)   API キーとシークレットキーを設置 ............................................... 9
 3)   仮想マシン作成 ............................................................... 10
 4)   /etc/hosts に名前登録 ......................................................... 12
5. 作成した仮想マシンを Fabric からセットアップしてみる .............................. 13
 1)   ユーザー追加 ................................................................. 13
 2)   sshd 設定 ..................................................................... 13
 3)   /etc/hosts に名前登録 ......................................................... 14
 4)   Redis のクライアントをインストール ............................................ 15
 5)   コンテンツを設置 ............................................................. 15
 6)   Monit インストール ............................................................ 17
 7)   Web 公開 ...................................................................... 18
6. 自動でスケールアウトしてみる ..................................................... 18
 1)   cron スクリプト設置 ........................................................... 19
 2)   負荷をかけます ............................................................... 21
7. [Appendix]ロードバランサーに自動追加 ............................................. 22




                                       2 / 24
hbstudy#41×IDCF クラウドハンズオン


0. この文書について
この文書は、hbstudy#41 のハンズオンにて、 フロンティアのクラウドサービス セルフタイプ
                          IDC                    (以
下、IDCF クラウド)を用い、オートスケーリング構成を作成する手順です。
動作検証は行っておりますが、自己責任でどうぞご利用ください。




                         3 / 24
hbstudy#41×IDCF クラウドハンズオン


1. IDCF クラウド上に仮想マシンを作成してみる
 ※IDCF クラウドの操作方法については、エントリーガイド(pp.21-27)を参照してください

1) ポータルサイトから作業用の仮想マシンを作成
 https://noahcloud.jp/ へアクセスし、配布したユーザ名/パスワードにてログインします。
 以下の設定で仮想マシンを作成します。


    テンプレート        [LATEST] CentOS 6.3 64-bit
    VM タイプ        M4 ( Hourly ) 2CPU, 4GB RAM
    ディスク選択        必要ありません
    仮想マシン名        任意
    グループ名         任意
    SSH Keys      SSH 鍵生成
                  ※生成後、秘密鍵をローカルにコピーしてください



2) SSH 接続するためのネットワーク設定
 ポータルサイトで TCP22 番を開放するようポートフォーワーディングルールとファイアウォール
を設定します。
 ※ここでの設定は、仮想マシン作成後(ステータスが Running)になった後に実施してください
 「リソース」>「ネットワーク」>「ファイアウォール」にて、TCP22 番を開けます。
 この後、HTTP も使うので、TCP80 番も開けてください。
 「リソース」>「ネットワーク」>「ポートフォーワーディング」にて、TCP22 番を転送します。
 ※ネットワーク設定については、エントリーガイド(pp.29-31)を参照してください




                             4 / 24
hbstudy#41×IDCF クラウドハンズオン


2. Fabric をインストールして触ってみる

1) 作業用 VM(CentOS 6.3)に SSH ログイン
  ローカルの環境から、作成した仮想マシンに SSH 接続します。



2) Fabric をインストール
  以下のコマンドで、Python 他必要なパッケージをインストールします。


# yum install python python-devel gcc -y


  次に、pip(Python パッケージ管理ツール)をインストールします。


# curl http://python-distribute.org/distribute_setup.py | python
# curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python


  Fabric のインストールは超カンタン。


# pip install fabric fexpect



3) 秘密鍵を設置
  Fabric は SSH で接続します。
                     仮想マシン作成時に保管した SSH 秘密鍵を、
                                           作業用 VM に設置します。


# vi ~/.ssh/id_rsa
~保存した秘密鍵の内容をコピペ~
# chmod 600 ~/.ssh/id_rsa
※SCP 等のファイル転送でもかまいません



4) fabfile を作成し実行
  fabfile.py という名前でファイルを作成し、以下の内容を記述します。
  今後は、このファイルに追記していくことになります。
  ここでの内容は、「uname –s」コマンドでホストタイプを確認する host_type 関数を作成します。




                                           5 / 24
hbstudy#41×IDCF クラウドハンズオン

【~/fabfile.py】
from fabric.api import *


def host_type():
    run('uname -s')


  Fabric は次のように実行します。
  # fab –H [ホスト名または IP アドレス] <コマンド>


# fab -H localhost host_type
[localhost] Executing task 'host_type'
[localhost] run: uname -s
[localhost] out: Linux
[localhost] out:



Done.
Disconnecting from localhost... done.


  コマンドオプション等詳細はヘルプをどうぞ。
  # fab --help


  複数のサーバを指定して実行する場合は、「,」で繋げます。
  # fab –H localhost,host1,host2 check_hostname




                                         6 / 24
hbstudy#41×IDCF クラウドハンズオン


3. Fabric から Redis をインストールしてみる

1) EPEL リポジトリを追加し、Redis をインストール
オートスケール用のデータ格納先として Redis を使います。Redis は EPEL リポジトリからパッケー
ジインストールします。Fabric のコードは、fabfile.py に追記していきます。


【~/fabfile.py】
from fabric.contrib.files import *


def setup_repo_epel():
    sudo("""
           yum -y localinstall 
http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
    """)


def setup_redis():
    setup_repo_epel()
    sudo("""
           yum -y install redis
    """)
    comment("/etc/redis.conf",r"bind 127.0.0.1")
    sudo("""
           chkconfig redis on
           service redis restart
    """)
※epel-release-6-8.noarch.rpm がなければ最新のバージョンに置き換えてください


Fabric を実行します。Redis サービスが起動できれば成功。


# fab -H localhost setup_redis
[localhost] Executing task 'setup_redis'
[localhost] sudo:
           yum -y localinstall
http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm
~略~
[localhost] out: redis-server を起動中:                       [ OK ]
[localhost] out:

                                           7 / 24
hbstudy#41×IDCF クラウドハンズオン

[localhost] out:



Done.
Disconnecting from localhost... done.




4. Fabric から API 経由で仮想マシンを作成してみる

1) リポジトリを追加し、API ツールインストール
IDCF から提供している CloudStack API を実行するためのコマンドラインツールをインストールする
ため、IDCF のリポジトリ追加と API ツールを yum インストールします。


【~/fabfile.py】
def install_idcf_api():
    run("""
           yum -y localinstall 
http://repo.cloud.idc.jp/Linux/CentOS/6/idc/x86_64/idcf-release-8-0.0.idcf.el6.noarch.rpm
           yum -y install idcf.compute -y
           idcf-compute-api -v
    """)


Fabric を実行します。idcf-compute-api コマンドを実行してバージョンがでれば成功。


# fab -H localhost install_idcf_api
[localhost] Executing task 'install_idcf_api'
[localhost] run:
           yum -y localinstall
~略~
[localhost] out: idcf-compute-api v0.10.0
[localhost] out:



Done.
Disconnecting from localhost... done.




                                             8 / 24
hbstudy#41×IDCF クラウドハンズオン

2) API キーとシークレットキーを設置
API アクセスのための情報を、~/idcfrc に記述します。


【~/.idcfrc】
[account]
host=https://api.noahcloud.jp/portal/client/api
api_key=ここに API キーを入れる
secret_key=ここにシークレットキーを入れる
API キーおよび秘密鍵は、IDCF クラウドのポータル右上の「マイプロファイル」をクリックすると
表示されます。(最新のエンドポイントの情報は FAQ を参照します)




                                         9 / 24
hbstudy#41×IDCF クラウドハンズオン




3) 仮想マシン作成
API ツールを使ってスケールさせる WEB サーバー用仮想マシンを作成します。仮想マシン作成のジョ
ブ投入後、作成完了まで確認し続けます。ID は下記のものを利用し、keypare(SSH 秘密鍵)は、作
業用仮想マシン作成時に作成した鍵の名前を指定します。


       テンプレート:[LATEST] CentOS 6.3 64-bit                 2008
       VM タイプ:S2 ( Hourly )       1CPU, 2GB RAM          22
       ゾーン:jp-east-t1v                                   1


【~/fabfile.py】
import json
import os,sys,time
SCALE_GROUP = "sclgrp"


def setup_idcf_vm(displayname="scale"):
    resp = local("""
    idcf-compute-api deployVirtualMachine 
                           --keypair {keypair} 
                           --displayname {displayname} 
                           --group {group} 
                           --templateid {templateid} 
                           --serviceofferingid {serviceofferingid} 
                           --zoneid {zoneid}
    """.format(keypair="testkey",        #your ssh-key name
                 displayname=displayname,
                 group=SCALE_GROUP,
                 templateid="2008",         #(2008) [LATEST] CentOS 6.3 64-bit
                 serviceofferingid="22", #(22)     S2
                 zoneid="1"),capture=True)
    print resp


    retval = json.loads(resp, 'UTF-8')
    ret = retval["deployvirtualmachineresponse"]
    vm_id = ret["id"]
    jobid = ret["jobid"]
    wait_job(jobid)

                                             10 / 24
hbstudy#41×IDCF クラウドハンズオン

        print "__vmid__,%d" %vm_id


def wait_job(jobid):
        while True:
            resp = local("""
            idcf-compute-api queryAsyncJobResult --jobid {jobid}
            """.format(jobid=jobid),capture=True)


            retval = json.loads(resp, 'UTF-8')
            ret = retval["queryasyncjobresultresponse"]


            if ret["jobstatus"] == 1:
                print resp
                break
            else:
                time.sleep(30)


Fabric を実行します。仮想マシンができあがり、IP アドレス等の設定情報が返ってくれば成功。


# fab -H localhost setup_idcf_vm:displayname=scale00
[localhost] Executing task 'setup_idcf_vm'
~略~
[localhost] local:
            idcf-compute-api queryAsyncJobResult --jobid 123294


{
    "queryasyncjobresultresponse": {
        "jobid": 123294,
        "jobprocstatus": 0,
        "jobresult": {
          "virtualmachine": {
    ~略~
        "jobresultcode": 0,
        "jobresulttype": "object",
        "jobstatus": 1
    }
}


                                             11 / 24
hbstudy#41×IDCF クラウドハンズオン

Done.



4) /etc/hosts に名前登録
作業用 VM の hosts に今作成した仮想マシンの名前を「monitor」として登録します。
※以降の手順では、IP アドレスではなく「monitor」という名前を使います


【~/fabfile.py】
def setup_hosts(ip=None,host_name=None):
    print ip
    print host_name
    if ip and host_name:
        append("/etc/hosts",
               ["{0} {1}".format(ip,host_name)],
               use_sudo=True)


Fabric を実行します。 アドレスは、
              IP     今作成された仮想マシンの IP アドレスに変更してください。


# fab -H localhost setup_hosts:ip=10.1.2.124,host_name=monitor




                                           12 / 24
hbstudy#41×IDCF クラウドハンズオン


5. 作成した仮想マシンを Fabric からセットアップしてみる

1) ユーザー追加
作成した仮想マシンに、ユーザー:devops を作成し、sudo の実行権限設定をします。


【~/fabfile.py】
SUDOERS = "devops"


def setup_sudoers(user=SUDOERS):
    run("""
    useradd {user}
    usermod -a -G wheel {user}
    mkdir -p -m 700 /home/{user}/.ssh
    cp /root/.ssh/authorized_keys /home/{user}/.ssh/
    chown -R {user}:{user} /home/{user}
    chmod 600 /home/{user}/.ssh/authorized_keys
    """.format(user=user))
    uncomment("/etc/pam.d/su",r"auths+sufficients+pam_wheel.sos+trust use_uid")
    uncomment("/etc/sudoers",r"%wheelsALL=(ALL)s+NOPASSWD:sALL")


Fabric を実行します。devops ユーザーで SSH ログインできれば成功。


# fab -H monitor setup_sudoers
[monitor] Executing task 'setup_sudoers'
~略~
Done.
Disconnecting from monitor... done.
# ssh devops@monitor
~略~
[devops@ホスト名 ~]$
[devops@ホスト名 ~]$ exit
#




2) sshd 設定
作成した仮想マシンに、sshd の設定をします。root ログイン禁止、空のパスワード禁止。


                                           13 / 24
hbstudy#41×IDCF クラウドハンズオン

【~/fabfile.py】
def sshd_config(user=SUDOERS):
    comment("/etc/ssh/sshd_config",r"^PermitRootLogin yes")
    uncomment("/etc/ssh/sshd_config",r"PermitEmptyPasswords no")
    append("/etc/ssh/sshd_config",
            ["PermitRootLogin no",
             "AllowUsers {0}".format(user)])
    run("service sshd restart")


Fabric を実行します。実際にログインして確認しても OK。
失敗して二度とログインできなくなったら仮想マシンを再作成!


# fab -H monitor sshd_config
[monitor] Executing task 'sshd_config'
~略~
[monitor] out: sshd を起動中:                                 [ OK ]
[monitor] out:
[monitor] out:


Done.
Disconnecting from monitor... done.



3) /etc/hosts に名前登録
作成した仮想マシンの hosts にデータ格納先(Redis)サーバを「redis-server」として登録します。
Fabric は先ほど作ったものを利用します。
※IP アドレスは、作業用 VM の IP アドレスに変更してください。


# ifconfig eth0
~略~
# fab -u devops -H monitor setup_hosts:ip=10.1.1.94,host_name=redis-server
[monitor] Executing task 'setup_hosts'
10.1.2.23
redis-server
[monitor] sudo: echo '10.1.2.23 redis-server' >> /etc/hosts


Done.
Disconnecting from monitor... done.

                                          14 / 24
hbstudy#41×IDCF クラウドハンズオン




4) Redis のクライアントをインストール
Redis のパッケージをインストールするのみです。


【~/fabfile.py】
def setup_redis_cli():
       setup_repo_epel()
       sudo("""
              yum -y install redis
       """)


# fab -u devops -H monitor setup_redis_cli
[monitor] Executing task 'setup_hosts'
~略~


Done.
Disconnecting from monitor... done.



5) コンテンツを設置
Python CGI をコンテンツとして作成します。
今回はホスト名を表示するだけ。


【~/hello_py.cgi】※http://repo.cloud.idc.jp/Tmp/hello_py.cgi に置いてます
#!/usr/bin/python
# -*- coding: utf-8 -*-
html = '''
<HTML>
<HEAD>
<TITLE>test</TITLE>
</HEAD>
<BODY>
<HR>
<DIV ALIGN="center">
<H1>%s</H1>
<HR>
</DIV>
</BODY>
                                           15 / 24
hbstudy#41×IDCF クラウドハンズオン

</HTML>
'''
import socket
name = socket.gethostname()
print html % name


今作成したコンテンツを、サーバーにアップロードします。


【~/fabfile.py】
from fabric.operations import *


def setup_cgi():
      sudo("""
      yum -y install httpd
      chkconfig httpd on
      service httpd start
      """)
      put("~/hello_py.cgi","/var/www/cgi-bin/hello_py.cgi",use_sudo=True)
      sudo("chmod 755 /var/www/cgi-bin/hello_py.cgi")
      run("curl -s http://localhost/cgi-bin/hello_py.cgi | sed -e 's/<[^>]*>//g'")


# fab -u devops -H monitor setup_cgi
~略~
[monitor] out: i-1063-23685-VM
[monitor] out:



Done.
Disconnecting from monitor... done.




                                           16 / 24
hbstudy#41×IDCF クラウドハンズオン

6) Monit インストール
WEB サーバの負荷状況は monit から監視します。
まず、Monit の監視設定を作成します。
1 分のロードアベレージが 2 を超えたら、Redis にプッシュします。


【~/loadavg.rc】
check system loadavg
  if loadavg (1min) > 2 then exec "/usr/bin/redis-cli -h %(redis_server)s rpush
scale:%(scale_group)s:up %(host_name)s"
※2 行目の if からは 1 行で書いてください


次に Monit をインストールする Fabfile を作成します。


【~/fabfile.py】
def hostname():
    return run("hostname")


def setup_monit():
    setup_repo_epel()
    sudo("""
           yum -y install monit
    """)
    upload_template("loadavg.rc","/etc/monit.d",use_sudo=True,backup=False,
              context=dict(redis_server="redis-server",
                            host_name=hostname(),
                            scale_group=SCALE_GROUP))
    sudo("""
           chkconfig monit on
           service monit restart
    """)


Fabric を実行します。Monit のサービスが起動できれば成功。


# fab -u devops -H monitor setup_monit
~略~
[monitor] out: monit を起動中: monit: generated unique Monit id ~ and stored to
'/root/.monit.id'
[monitor] out:                                            [ OK ]
                                            17 / 24
hbstudy#41×IDCF クラウドハンズオン



Done.
Disconnecting from monitor... done.



7) Web 公開
  ポータルサイトで HTTP をロードバランシング設定し公開します。
「リソース」>「ネットワーク」>「ロードバランサー」にて、80 番のルールを作成し、作成した
サーバを分散先として登録します。
※ロードバランサー設定については、エントリーガイド(pp.32)を参照してください




http://【公開 IP アドレス】/cgi-bin/hello_py.cgi
へ接続し動作確認。




                                      18 / 24
hbstudy#41×IDCF クラウドハンズオン


6. 自動でスケールアウトしてみる

1) cron スクリプト設置
Redis の状態を見て、スケールアウトさせるスクリプトを設置します。
まず、スクリプトの中で実行する、稼働中の VM の数える Fabric を作成します。


【~/fabfile.py】
def count_idcf_vms():
      with hide('running', 'stdout', 'stderr'):
          resp = local("""
          idcf-compute-api listVirtualMachines --state Running
          """,capture=True)
          retval = json.loads(resp,'UTF-8')
          ret = retval["listvirtualmachinesresponse"]
          count = ret["count"]
          print count


動作を確認します。


# fab -u devops -H monitor count_idcf_vms
[monitor] Executing task 'count_idcf_vms'
2


Done.


スケールを制御するスクリプトを設置します。


【~/scale.sh】※http://repo.cloud.idc.jp/Tmp/scale.sh に置いてます
#!/bin/bash
queue="scale:sclgrp:up"
lock_key="scale:sclgrp:lock"
incrd_key="scale:sclgrp:incrd"


path="`dirname $0`"
log_file="scale.log"
log() {
    echo [`date`] $1 >> ${path}/${log_file}

                                              19 / 24
hbstudy#41×IDCF クラウドハンズオン

}


log "-------------------------"
queue_count=$(redis-cli llen $queue | awk '{print $1}')
log "queue_count: $queue_count"


if [ $queue_count -gt 0 ]; then
     vm_name=$(redis-cli lpop $queue | awk '{print $1}')
     log "queued by: $vm_name"


     locked=$(redis-cli get $lock_key | awk '{print $1}')
     incrd=$(redis-cli get $incrd_key | awk '{print $1}')
     if [ -z "$locked" ]; then
            locked=0
     fi
     if [ -z "$incrd" ]; then
            incrd=0
     fi
     log "locked: $locked"
     log "incrd: $incrd"
     vm_count=$(fab -f ~/fabfile.py -H localhost count_idcf_vms | awk 'NR==2 {print $0}')
     log "vm_count: $vm_count"
     if [ $locked -lt 1 ]; then
            redis-cli incr $lock_key
            redis-cli incr $incrd_key
            fab -f ~/fabfile.py -H localhost setup_idcf_vm:displayname=scale_$incrd
            redis-cli set $lock_key 0
            redis-cli del $queue
     else
            log "not deploying new vm"
     fi
fi


# cd ~
# chmod +x scale.sh
# crontab –e
*/3 * * * * /root/scale.sh


                                             20 / 24
hbstudy#41×IDCF クラウドハンズオン

2) 負荷をかけます
stress コマンドで負荷をかけます。


【~/fabfile.py】
def setup_stress():
    sudo("yum -y install stress")


def do_stress():
    run("stress --cpu 8 --timeout 10m")


stress コマンドをインストール後、実行します。


# fab -u devops -H monitor setup_stress
# fab -u devops -H monitor do_stress


以上で、負荷がかかり始め、数分で VM が作成されるはずです。ポータルサイトをご覧ください。
VM が作られるまでの過程を確認するには、monitor サーバーで Monit の動作を確認。
SSH で別セッションを張ってみてください。


[devops@ホスト名 ~]$ tail -f /var/log/monit
[JST Dec 6 16:11:33] error     : 'loadavg' loadavg(1min) of 3.5 matches resource limit
[loadavg(1min)>2.0]
[JST Dec 6 16:11:33] info      : 'loadavg' exec: /usr/bin/redis-cli


redis-server でスケールスクリプトの動作を確認。


# tail -f ~/scale.log
[Thu Dec 6 18:34:01 JST 2012] -------------------------
[Thu Dec 6 18:34:01 JST 2012] queue_count: 0
[Thu Dec 6 18:35:01 JST 2012] -------------------------
[Thu Dec 6 18:35:01 JST 2012] queue_count: 1
[Thu Dec 6 18:35:01 JST 2012] queued by: i-1063-16861-VM
[Thu Dec 6 18:35:01 JST 2012] locked: 0
[Thu Dec 6 18:35:01 JST 2012] incrd: 0
[Thu Dec 6 18:35:02 JST 2012] vm_count: 2


ポータルから scale_0 という仮想マシンができていることを確認してください。
作成されていれば成功。
                                            21 / 24
hbstudy#41×IDCF クラウドハンズオン


7. [Appendix]ロードバランサーに自動追加
時間が余ればこちらもお試しください。
自動で作成された仮想マシンが、自動でロードバランサーに組み込まれるところを作ります。


ポータルから設定したロードバランサーのルール ID を確認します。


# idcf-compute-api listLoadBalancerRules
{
    "listloadbalancerrulesresponse": {
      "count": 1,
      "loadbalancerrule": [
        {
            "account": "hbstudy1",
            "algorithm": "roundrobin",
            "cidrlist": "",
            "domain": "70000001277",
            "domainid": 1278,
            "id": 42849,
以下略


ロードバランサーに追加する Fabric を作成します。


【~/fabfile.py】
def add_balancing_server(vmid):
      resp = local("""
      idcf-compute-api assignToLoadBalancerRule
                                --id {id} 
                                --virtualmachineids {virtualmachineids}
      """.format(id="42849",         #your ID of the load balancer rule
                   virtualmachineids=vmid),capture=True)
      print resp
※ルールの ID は先に確認したものに置き換えてください。




                                                22 / 24
hbstudy#41×IDCF クラウドハンズオン

スケールスクリプトを修正します。(赤字のところを追記)


【~/scale.sh】※http://repo.cloud.idc.jp/Tmp/scale2.sh に置いてます
#!/bin/bash
queue="scale:sclgrp:up"
lock_key="scale:sclgrp:lock"
incrd_key="scale:sclgrp:incrd"


path="`dirname $0`"
log_file="scale.log"
log() {
    echo [`date`] $1 >> ${path}/${log_file}
}


log "-------------------------"
queue_count=$(redis-cli llen $queue | awk '{print $1}')
log "queue_count: $queue_count"


if [ $queue_count -gt 0 ]; then
      vm_name=$(redis-cli lpop $queue | awk '{print $1}')
      log "queued by: $vm_name"


      locked=$(redis-cli get $lock_key | awk '{print $1}')
      incrd=$(redis-cli get $incrd_key | awk '{print $1}')
      if [ -z "$locked" ]; then
           locked=0
      fi
      if [ -z "$incrd" ]; then
           incrd=0
      fi
      log "locked: $locked"
      log "incrd: $incrd"
      vm_count=$(fab -f ~/fabfile.py -H localhost count_idcf_vms | awk 'NR==2 {print $0}')
      log "vm_count: $vm_count"
      if [ $locked -lt 1 ]; then
           redis-cli incr $lock_key
           redis-cli incr $incrd_key
#          fab -f ~/fabfile.py -H localhost setup_idcf_vm:displayname=scale_$incrd

                                              23 / 24
hbstudy#41×IDCF クラウドハンズオン

            vm_id=$(fab -f ~/fabfile.py -H localhost setup_idcf_vm:displayname=scale_$incrd |
grep "__vmid__" | cut -d',' -f2)
            fab -f ~/fabfile.py -H localhost add_balancing_server:vmid=$vm_id
            redis-cli set $lock_key 0
            redis-cli del $queue
     else
            log "not deploying new vm"
     fi
fi


この後、負荷をかけて自動で作成された仮想マシンはロードバランサーに追加されます。
ポータルからロードバランサーの設定を確認してみてください。


この状態では、追加された仮想マシンでは httpd が動おらず、ヘルスチェックに失敗するので HTTP
の通信は分散されません。


httpd のインストール、コンテンツのアップロードが必要です。
まだ時間が余っている人は考えてみてはいかがでしょうか。。。。




ここまでの fabfile は以下の URL に置いています。
http://repo.cloud.idc.jp/Tmp/fabfile.py




                                             24 / 24

More Related Content

PDF
LINQ in Unity
PDF
㉞cocos2d-xの開発環境をインストールしてみよう
PDF
Nuxt.js + microCMS + netlify
PDF
C/C++プログラマのための開発ツール
PDF
Nodejuku01 ohtsu
KEY
Development app-with-elixir
PDF
VarnishではじめるESI
PDF
Openresty
LINQ in Unity
㉞cocos2d-xの開発環境をインストールしてみよう
Nuxt.js + microCMS + netlify
C/C++プログラマのための開発ツール
Nodejuku01 ohtsu
Development app-with-elixir
VarnishではじめるESI
Openresty

What's hot (20)

KEY
GPGPU deいろんな問題解いてみた
PDF
SystemV IPC
PDF
FxUG in Toyama - ASphalt2 container -
PPTX
Doom3 commentary
PDF
GoogleのSHA-1のはなし
PDF
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
PDF
Slub data structure
KEY
はじめてのCouch db
KEY
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
PPTX
実は怖くないDevOps
PDF
社内勉強会資料(Varnish Module)
PDF
Kernel fcache-bug
PDF
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
PDF
Tottoruby 20110903
PDF
1075: .NETからCUDAを使うひとつの方法
PDF
○○大学の本当にあった怖い話
PPTX
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
PDF
静的サイトどこにする?
PPT
HandlerSocket plugin for MySQL
GPGPU deいろんな問題解いてみた
SystemV IPC
FxUG in Toyama - ASphalt2 container -
Doom3 commentary
GoogleのSHA-1のはなし
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
Slub data structure
はじめてのCouch db
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
実は怖くないDevOps
社内勉強会資料(Varnish Module)
Kernel fcache-bug
開発チームもIaCやってみたい~VSOとDockerの組合せにチャレンジ~
Tottoruby 20110903
1075: .NETからCUDAを使うひとつの方法
○○大学の本当にあった怖い話
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
静的サイトどこにする?
HandlerSocket plugin for MySQL
Ad

Viewers also liked (12)

PDF
SCALR アカウント登録手順
PDF
Scalr hands on
PDF
サーバー初心者のためのWordPressサイト構築手順〜付録〜 MacターミナルやTera Termを使用したSSH接続方法など
PDF
hbstudy37 doc
PDF
SCALR OSS版のインストール手順のご紹介 20131204 01
PDF
hbstudy37 slide
PPTX
Idcfクラウドクイズ
PPTX
僕はまだ10%しかIDCFクラウドを理解していなかった
PDF
脆弱性情報はこうしてやってくる
PPTX
(Vulsで)脆弱性対策をもっと楽に!
PDF
サーバー初心者のためのWordPressサイト構築手順
PDF
Aerospike on IDCF Cloud
SCALR アカウント登録手順
Scalr hands on
サーバー初心者のためのWordPressサイト構築手順〜付録〜 MacターミナルやTera Termを使用したSSH接続方法など
hbstudy37 doc
SCALR OSS版のインストール手順のご紹介 20131204 01
hbstudy37 slide
Idcfクラウドクイズ
僕はまだ10%しかIDCFクラウドを理解していなかった
脆弱性情報はこうしてやってくる
(Vulsで)脆弱性対策をもっと楽に!
サーバー初心者のためのWordPressサイト構築手順
Aerospike on IDCF Cloud
Ad

Similar to Hbstudy41 auto scaling (20)

PPTX
microPCFを使ってみよう
PDF
node+socket.io+enchant.jsでチャットゲーを作る
PDF
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
PPTX
13016 n分で作るtype scriptでnodejs
PDF
マイクロサービス時代の生存戦略 with HashiCorp
PDF
Circle ci and docker+serverspec
PDF
Hadoop on LXC
KEY
Lxc on cloud
PDF
20140612_Docker上でCloudStackを動かしてみる!!
PDF
Dockerイメージ構築 実践テクニック
PDF
Hol012 windowsコンテナー始動
PDF
Openstack SPICE console (icehouse) verification
PDF
成長を加速する minne の技術基盤戦略
PDF
Docker Swarm モード にゅうもん
PDF
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
PDF
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
PPTX
Docker 18.09 新機能
PDF
オトナのDocker入門
PDF
仮想化した DC を PowerShell で複製する
PDF
Apache cloudstack4.0インストール
microPCFを使ってみよう
node+socket.io+enchant.jsでチャットゲーを作る
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
13016 n分で作るtype scriptでnodejs
マイクロサービス時代の生存戦略 with HashiCorp
Circle ci and docker+serverspec
Hadoop on LXC
Lxc on cloud
20140612_Docker上でCloudStackを動かしてみる!!
Dockerイメージ構築 実践テクニック
Hol012 windowsコンテナー始動
Openstack SPICE console (icehouse) verification
成長を加速する minne の技術基盤戦略
Docker Swarm モード にゅうもん
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
Docker 18.09 新機能
オトナのDocker入門
仮想化した DC を PowerShell で複製する
Apache cloudstack4.0インストール

More from Fujishiro Takuya (10)

PDF
ベアメタルサーバー/オンプレミスと実現するハイブリッドクラウド
PDF
オートスケールアップ Powered by Mackerel
PDF
実践!DBベンチマークツールの使い方
PDF
Rancher ではじめる マルチクラウドコンテナー
PDF
●●●の知らないSBCの世界
PDF
Loves Baremetal-servers, Loves POWER
PDF
おこづかいが足りないのでIDCFクラウドで自サイトを作ってみた話
PPTX
IDCFクラウド MeetUp2 LT
PDF
MaxScaleを触ってみた
PDF
Hbstudy41 slide
ベアメタルサーバー/オンプレミスと実現するハイブリッドクラウド
オートスケールアップ Powered by Mackerel
実践!DBベンチマークツールの使い方
Rancher ではじめる マルチクラウドコンテナー
●●●の知らないSBCの世界
Loves Baremetal-servers, Loves POWER
おこづかいが足りないのでIDCFクラウドで自サイトを作ってみた話
IDCFクラウド MeetUp2 LT
MaxScaleを触ってみた
Hbstudy41 slide

Hbstudy41 auto scaling

  • 1. hbstudy#41 × IDCF クラウドハンズオン Fabric と Monit を使って オートスケーリングを自作してみよう 2013 年 2 月 2 日 @tafujish
  • 2. hbstudy#41×IDCF クラウドハンズオン 目次 0. この文書について .................................................................. 3 1. IDCF クラウド上に仮想マシンを作成してみる.......................................... 4 1) ポータルサイトから作業用の仮想マシンを作成 .................................... 4 2) SSH 接続するためのネットワーク設定 ............................................. 4 2. Fabric をインストールして触ってみる................................................ 5 1) 作業用 VM(CentOS 6.3)に SSH ログイン ............................................ 5 2) Fabric をインストール .......................................................... 5 3) 秘密鍵を設置 .................................................................. 5 4) fabfile を作成し実行 ........................................................... 5 3. Fabric から Redis をインストールしてみる............................................ 7 1) EPEL リポジトリを追加し、Redis をインストール .................................. 7 4. Fabric から API 経由で仮想マシンを作成してみる ...................................... 8 1) リポジトリを追加し、API ツールインストール ..................................... 8 2) API キーとシークレットキーを設置 ............................................... 9 3) 仮想マシン作成 ............................................................... 10 4) /etc/hosts に名前登録 ......................................................... 12 5. 作成した仮想マシンを Fabric からセットアップしてみる .............................. 13 1) ユーザー追加 ................................................................. 13 2) sshd 設定 ..................................................................... 13 3) /etc/hosts に名前登録 ......................................................... 14 4) Redis のクライアントをインストール ............................................ 15 5) コンテンツを設置 ............................................................. 15 6) Monit インストール ............................................................ 17 7) Web 公開 ...................................................................... 18 6. 自動でスケールアウトしてみる ..................................................... 18 1) cron スクリプト設置 ........................................................... 19 2) 負荷をかけます ............................................................... 21 7. [Appendix]ロードバランサーに自動追加 ............................................. 22 2 / 24
  • 3. hbstudy#41×IDCF クラウドハンズオン 0. この文書について この文書は、hbstudy#41 のハンズオンにて、 フロンティアのクラウドサービス セルフタイプ IDC (以 下、IDCF クラウド)を用い、オートスケーリング構成を作成する手順です。 動作検証は行っておりますが、自己責任でどうぞご利用ください。 3 / 24
  • 4. hbstudy#41×IDCF クラウドハンズオン 1. IDCF クラウド上に仮想マシンを作成してみる ※IDCF クラウドの操作方法については、エントリーガイド(pp.21-27)を参照してください 1) ポータルサイトから作業用の仮想マシンを作成 https://noahcloud.jp/ へアクセスし、配布したユーザ名/パスワードにてログインします。 以下の設定で仮想マシンを作成します。 テンプレート [LATEST] CentOS 6.3 64-bit VM タイプ M4 ( Hourly ) 2CPU, 4GB RAM ディスク選択 必要ありません 仮想マシン名 任意 グループ名 任意 SSH Keys SSH 鍵生成 ※生成後、秘密鍵をローカルにコピーしてください 2) SSH 接続するためのネットワーク設定 ポータルサイトで TCP22 番を開放するようポートフォーワーディングルールとファイアウォール を設定します。 ※ここでの設定は、仮想マシン作成後(ステータスが Running)になった後に実施してください 「リソース」>「ネットワーク」>「ファイアウォール」にて、TCP22 番を開けます。 この後、HTTP も使うので、TCP80 番も開けてください。 「リソース」>「ネットワーク」>「ポートフォーワーディング」にて、TCP22 番を転送します。 ※ネットワーク設定については、エントリーガイド(pp.29-31)を参照してください 4 / 24
  • 5. hbstudy#41×IDCF クラウドハンズオン 2. Fabric をインストールして触ってみる 1) 作業用 VM(CentOS 6.3)に SSH ログイン ローカルの環境から、作成した仮想マシンに SSH 接続します。 2) Fabric をインストール 以下のコマンドで、Python 他必要なパッケージをインストールします。 # yum install python python-devel gcc -y 次に、pip(Python パッケージ管理ツール)をインストールします。 # curl http://python-distribute.org/distribute_setup.py | python # curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python Fabric のインストールは超カンタン。 # pip install fabric fexpect 3) 秘密鍵を設置 Fabric は SSH で接続します。 仮想マシン作成時に保管した SSH 秘密鍵を、 作業用 VM に設置します。 # vi ~/.ssh/id_rsa ~保存した秘密鍵の内容をコピペ~ # chmod 600 ~/.ssh/id_rsa ※SCP 等のファイル転送でもかまいません 4) fabfile を作成し実行 fabfile.py という名前でファイルを作成し、以下の内容を記述します。 今後は、このファイルに追記していくことになります。 ここでの内容は、「uname –s」コマンドでホストタイプを確認する host_type 関数を作成します。 5 / 24
  • 6. hbstudy#41×IDCF クラウドハンズオン 【~/fabfile.py】 from fabric.api import * def host_type(): run('uname -s') Fabric は次のように実行します。 # fab –H [ホスト名または IP アドレス] <コマンド> # fab -H localhost host_type [localhost] Executing task 'host_type' [localhost] run: uname -s [localhost] out: Linux [localhost] out: Done. Disconnecting from localhost... done. コマンドオプション等詳細はヘルプをどうぞ。 # fab --help 複数のサーバを指定して実行する場合は、「,」で繋げます。 # fab –H localhost,host1,host2 check_hostname 6 / 24
  • 7. hbstudy#41×IDCF クラウドハンズオン 3. Fabric から Redis をインストールしてみる 1) EPEL リポジトリを追加し、Redis をインストール オートスケール用のデータ格納先として Redis を使います。Redis は EPEL リポジトリからパッケー ジインストールします。Fabric のコードは、fabfile.py に追記していきます。 【~/fabfile.py】 from fabric.contrib.files import * def setup_repo_epel(): sudo(""" yum -y localinstall http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm """) def setup_redis(): setup_repo_epel() sudo(""" yum -y install redis """) comment("/etc/redis.conf",r"bind 127.0.0.1") sudo(""" chkconfig redis on service redis restart """) ※epel-release-6-8.noarch.rpm がなければ最新のバージョンに置き換えてください Fabric を実行します。Redis サービスが起動できれば成功。 # fab -H localhost setup_redis [localhost] Executing task 'setup_redis' [localhost] sudo: yum -y localinstall http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm ~略~ [localhost] out: redis-server を起動中: [ OK ] [localhost] out: 7 / 24
  • 8. hbstudy#41×IDCF クラウドハンズオン [localhost] out: Done. Disconnecting from localhost... done. 4. Fabric から API 経由で仮想マシンを作成してみる 1) リポジトリを追加し、API ツールインストール IDCF から提供している CloudStack API を実行するためのコマンドラインツールをインストールする ため、IDCF のリポジトリ追加と API ツールを yum インストールします。 【~/fabfile.py】 def install_idcf_api(): run(""" yum -y localinstall http://repo.cloud.idc.jp/Linux/CentOS/6/idc/x86_64/idcf-release-8-0.0.idcf.el6.noarch.rpm yum -y install idcf.compute -y idcf-compute-api -v """) Fabric を実行します。idcf-compute-api コマンドを実行してバージョンがでれば成功。 # fab -H localhost install_idcf_api [localhost] Executing task 'install_idcf_api' [localhost] run: yum -y localinstall ~略~ [localhost] out: idcf-compute-api v0.10.0 [localhost] out: Done. Disconnecting from localhost... done. 8 / 24
  • 9. hbstudy#41×IDCF クラウドハンズオン 2) API キーとシークレットキーを設置 API アクセスのための情報を、~/idcfrc に記述します。 【~/.idcfrc】 [account] host=https://api.noahcloud.jp/portal/client/api api_key=ここに API キーを入れる secret_key=ここにシークレットキーを入れる API キーおよび秘密鍵は、IDCF クラウドのポータル右上の「マイプロファイル」をクリックすると 表示されます。(最新のエンドポイントの情報は FAQ を参照します) 9 / 24
  • 10. hbstudy#41×IDCF クラウドハンズオン 3) 仮想マシン作成 API ツールを使ってスケールさせる WEB サーバー用仮想マシンを作成します。仮想マシン作成のジョ ブ投入後、作成完了まで確認し続けます。ID は下記のものを利用し、keypare(SSH 秘密鍵)は、作 業用仮想マシン作成時に作成した鍵の名前を指定します。 テンプレート:[LATEST] CentOS 6.3 64-bit 2008 VM タイプ:S2 ( Hourly ) 1CPU, 2GB RAM 22 ゾーン:jp-east-t1v 1 【~/fabfile.py】 import json import os,sys,time SCALE_GROUP = "sclgrp" def setup_idcf_vm(displayname="scale"): resp = local(""" idcf-compute-api deployVirtualMachine --keypair {keypair} --displayname {displayname} --group {group} --templateid {templateid} --serviceofferingid {serviceofferingid} --zoneid {zoneid} """.format(keypair="testkey", #your ssh-key name displayname=displayname, group=SCALE_GROUP, templateid="2008", #(2008) [LATEST] CentOS 6.3 64-bit serviceofferingid="22", #(22) S2 zoneid="1"),capture=True) print resp retval = json.loads(resp, 'UTF-8') ret = retval["deployvirtualmachineresponse"] vm_id = ret["id"] jobid = ret["jobid"] wait_job(jobid) 10 / 24
  • 11. hbstudy#41×IDCF クラウドハンズオン print "__vmid__,%d" %vm_id def wait_job(jobid): while True: resp = local(""" idcf-compute-api queryAsyncJobResult --jobid {jobid} """.format(jobid=jobid),capture=True) retval = json.loads(resp, 'UTF-8') ret = retval["queryasyncjobresultresponse"] if ret["jobstatus"] == 1: print resp break else: time.sleep(30) Fabric を実行します。仮想マシンができあがり、IP アドレス等の設定情報が返ってくれば成功。 # fab -H localhost setup_idcf_vm:displayname=scale00 [localhost] Executing task 'setup_idcf_vm' ~略~ [localhost] local: idcf-compute-api queryAsyncJobResult --jobid 123294 { "queryasyncjobresultresponse": { "jobid": 123294, "jobprocstatus": 0, "jobresult": { "virtualmachine": { ~略~ "jobresultcode": 0, "jobresulttype": "object", "jobstatus": 1 } } 11 / 24
  • 12. hbstudy#41×IDCF クラウドハンズオン Done. 4) /etc/hosts に名前登録 作業用 VM の hosts に今作成した仮想マシンの名前を「monitor」として登録します。 ※以降の手順では、IP アドレスではなく「monitor」という名前を使います 【~/fabfile.py】 def setup_hosts(ip=None,host_name=None): print ip print host_name if ip and host_name: append("/etc/hosts", ["{0} {1}".format(ip,host_name)], use_sudo=True) Fabric を実行します。 アドレスは、 IP 今作成された仮想マシンの IP アドレスに変更してください。 # fab -H localhost setup_hosts:ip=10.1.2.124,host_name=monitor 12 / 24
  • 13. hbstudy#41×IDCF クラウドハンズオン 5. 作成した仮想マシンを Fabric からセットアップしてみる 1) ユーザー追加 作成した仮想マシンに、ユーザー:devops を作成し、sudo の実行権限設定をします。 【~/fabfile.py】 SUDOERS = "devops" def setup_sudoers(user=SUDOERS): run(""" useradd {user} usermod -a -G wheel {user} mkdir -p -m 700 /home/{user}/.ssh cp /root/.ssh/authorized_keys /home/{user}/.ssh/ chown -R {user}:{user} /home/{user} chmod 600 /home/{user}/.ssh/authorized_keys """.format(user=user)) uncomment("/etc/pam.d/su",r"auths+sufficients+pam_wheel.sos+trust use_uid") uncomment("/etc/sudoers",r"%wheelsALL=(ALL)s+NOPASSWD:sALL") Fabric を実行します。devops ユーザーで SSH ログインできれば成功。 # fab -H monitor setup_sudoers [monitor] Executing task 'setup_sudoers' ~略~ Done. Disconnecting from monitor... done. # ssh devops@monitor ~略~ [devops@ホスト名 ~]$ [devops@ホスト名 ~]$ exit # 2) sshd 設定 作成した仮想マシンに、sshd の設定をします。root ログイン禁止、空のパスワード禁止。 13 / 24
  • 14. hbstudy#41×IDCF クラウドハンズオン 【~/fabfile.py】 def sshd_config(user=SUDOERS): comment("/etc/ssh/sshd_config",r"^PermitRootLogin yes") uncomment("/etc/ssh/sshd_config",r"PermitEmptyPasswords no") append("/etc/ssh/sshd_config", ["PermitRootLogin no", "AllowUsers {0}".format(user)]) run("service sshd restart") Fabric を実行します。実際にログインして確認しても OK。 失敗して二度とログインできなくなったら仮想マシンを再作成! # fab -H monitor sshd_config [monitor] Executing task 'sshd_config' ~略~ [monitor] out: sshd を起動中: [ OK ] [monitor] out: [monitor] out: Done. Disconnecting from monitor... done. 3) /etc/hosts に名前登録 作成した仮想マシンの hosts にデータ格納先(Redis)サーバを「redis-server」として登録します。 Fabric は先ほど作ったものを利用します。 ※IP アドレスは、作業用 VM の IP アドレスに変更してください。 # ifconfig eth0 ~略~ # fab -u devops -H monitor setup_hosts:ip=10.1.1.94,host_name=redis-server [monitor] Executing task 'setup_hosts' 10.1.2.23 redis-server [monitor] sudo: echo '10.1.2.23 redis-server' >> /etc/hosts Done. Disconnecting from monitor... done. 14 / 24
  • 15. hbstudy#41×IDCF クラウドハンズオン 4) Redis のクライアントをインストール Redis のパッケージをインストールするのみです。 【~/fabfile.py】 def setup_redis_cli(): setup_repo_epel() sudo(""" yum -y install redis """) # fab -u devops -H monitor setup_redis_cli [monitor] Executing task 'setup_hosts' ~略~ Done. Disconnecting from monitor... done. 5) コンテンツを設置 Python CGI をコンテンツとして作成します。 今回はホスト名を表示するだけ。 【~/hello_py.cgi】※http://repo.cloud.idc.jp/Tmp/hello_py.cgi に置いてます #!/usr/bin/python # -*- coding: utf-8 -*- html = ''' <HTML> <HEAD> <TITLE>test</TITLE> </HEAD> <BODY> <HR> <DIV ALIGN="center"> <H1>%s</H1> <HR> </DIV> </BODY> 15 / 24
  • 16. hbstudy#41×IDCF クラウドハンズオン </HTML> ''' import socket name = socket.gethostname() print html % name 今作成したコンテンツを、サーバーにアップロードします。 【~/fabfile.py】 from fabric.operations import * def setup_cgi(): sudo(""" yum -y install httpd chkconfig httpd on service httpd start """) put("~/hello_py.cgi","/var/www/cgi-bin/hello_py.cgi",use_sudo=True) sudo("chmod 755 /var/www/cgi-bin/hello_py.cgi") run("curl -s http://localhost/cgi-bin/hello_py.cgi | sed -e 's/<[^>]*>//g'") # fab -u devops -H monitor setup_cgi ~略~ [monitor] out: i-1063-23685-VM [monitor] out: Done. Disconnecting from monitor... done. 16 / 24
  • 17. hbstudy#41×IDCF クラウドハンズオン 6) Monit インストール WEB サーバの負荷状況は monit から監視します。 まず、Monit の監視設定を作成します。 1 分のロードアベレージが 2 を超えたら、Redis にプッシュします。 【~/loadavg.rc】 check system loadavg if loadavg (1min) > 2 then exec "/usr/bin/redis-cli -h %(redis_server)s rpush scale:%(scale_group)s:up %(host_name)s" ※2 行目の if からは 1 行で書いてください 次に Monit をインストールする Fabfile を作成します。 【~/fabfile.py】 def hostname(): return run("hostname") def setup_monit(): setup_repo_epel() sudo(""" yum -y install monit """) upload_template("loadavg.rc","/etc/monit.d",use_sudo=True,backup=False, context=dict(redis_server="redis-server", host_name=hostname(), scale_group=SCALE_GROUP)) sudo(""" chkconfig monit on service monit restart """) Fabric を実行します。Monit のサービスが起動できれば成功。 # fab -u devops -H monitor setup_monit ~略~ [monitor] out: monit を起動中: monit: generated unique Monit id ~ and stored to '/root/.monit.id' [monitor] out: [ OK ] 17 / 24
  • 18. hbstudy#41×IDCF クラウドハンズオン Done. Disconnecting from monitor... done. 7) Web 公開 ポータルサイトで HTTP をロードバランシング設定し公開します。 「リソース」>「ネットワーク」>「ロードバランサー」にて、80 番のルールを作成し、作成した サーバを分散先として登録します。 ※ロードバランサー設定については、エントリーガイド(pp.32)を参照してください http://【公開 IP アドレス】/cgi-bin/hello_py.cgi へ接続し動作確認。 18 / 24
  • 19. hbstudy#41×IDCF クラウドハンズオン 6. 自動でスケールアウトしてみる 1) cron スクリプト設置 Redis の状態を見て、スケールアウトさせるスクリプトを設置します。 まず、スクリプトの中で実行する、稼働中の VM の数える Fabric を作成します。 【~/fabfile.py】 def count_idcf_vms(): with hide('running', 'stdout', 'stderr'): resp = local(""" idcf-compute-api listVirtualMachines --state Running """,capture=True) retval = json.loads(resp,'UTF-8') ret = retval["listvirtualmachinesresponse"] count = ret["count"] print count 動作を確認します。 # fab -u devops -H monitor count_idcf_vms [monitor] Executing task 'count_idcf_vms' 2 Done. スケールを制御するスクリプトを設置します。 【~/scale.sh】※http://repo.cloud.idc.jp/Tmp/scale.sh に置いてます #!/bin/bash queue="scale:sclgrp:up" lock_key="scale:sclgrp:lock" incrd_key="scale:sclgrp:incrd" path="`dirname $0`" log_file="scale.log" log() { echo [`date`] $1 >> ${path}/${log_file} 19 / 24
  • 20. hbstudy#41×IDCF クラウドハンズオン } log "-------------------------" queue_count=$(redis-cli llen $queue | awk '{print $1}') log "queue_count: $queue_count" if [ $queue_count -gt 0 ]; then vm_name=$(redis-cli lpop $queue | awk '{print $1}') log "queued by: $vm_name" locked=$(redis-cli get $lock_key | awk '{print $1}') incrd=$(redis-cli get $incrd_key | awk '{print $1}') if [ -z "$locked" ]; then locked=0 fi if [ -z "$incrd" ]; then incrd=0 fi log "locked: $locked" log "incrd: $incrd" vm_count=$(fab -f ~/fabfile.py -H localhost count_idcf_vms | awk 'NR==2 {print $0}') log "vm_count: $vm_count" if [ $locked -lt 1 ]; then redis-cli incr $lock_key redis-cli incr $incrd_key fab -f ~/fabfile.py -H localhost setup_idcf_vm:displayname=scale_$incrd redis-cli set $lock_key 0 redis-cli del $queue else log "not deploying new vm" fi fi # cd ~ # chmod +x scale.sh # crontab –e */3 * * * * /root/scale.sh 20 / 24
  • 21. hbstudy#41×IDCF クラウドハンズオン 2) 負荷をかけます stress コマンドで負荷をかけます。 【~/fabfile.py】 def setup_stress(): sudo("yum -y install stress") def do_stress(): run("stress --cpu 8 --timeout 10m") stress コマンドをインストール後、実行します。 # fab -u devops -H monitor setup_stress # fab -u devops -H monitor do_stress 以上で、負荷がかかり始め、数分で VM が作成されるはずです。ポータルサイトをご覧ください。 VM が作られるまでの過程を確認するには、monitor サーバーで Monit の動作を確認。 SSH で別セッションを張ってみてください。 [devops@ホスト名 ~]$ tail -f /var/log/monit [JST Dec 6 16:11:33] error : 'loadavg' loadavg(1min) of 3.5 matches resource limit [loadavg(1min)>2.0] [JST Dec 6 16:11:33] info : 'loadavg' exec: /usr/bin/redis-cli redis-server でスケールスクリプトの動作を確認。 # tail -f ~/scale.log [Thu Dec 6 18:34:01 JST 2012] ------------------------- [Thu Dec 6 18:34:01 JST 2012] queue_count: 0 [Thu Dec 6 18:35:01 JST 2012] ------------------------- [Thu Dec 6 18:35:01 JST 2012] queue_count: 1 [Thu Dec 6 18:35:01 JST 2012] queued by: i-1063-16861-VM [Thu Dec 6 18:35:01 JST 2012] locked: 0 [Thu Dec 6 18:35:01 JST 2012] incrd: 0 [Thu Dec 6 18:35:02 JST 2012] vm_count: 2 ポータルから scale_0 という仮想マシンができていることを確認してください。 作成されていれば成功。 21 / 24
  • 22. hbstudy#41×IDCF クラウドハンズオン 7. [Appendix]ロードバランサーに自動追加 時間が余ればこちらもお試しください。 自動で作成された仮想マシンが、自動でロードバランサーに組み込まれるところを作ります。 ポータルから設定したロードバランサーのルール ID を確認します。 # idcf-compute-api listLoadBalancerRules { "listloadbalancerrulesresponse": { "count": 1, "loadbalancerrule": [ { "account": "hbstudy1", "algorithm": "roundrobin", "cidrlist": "", "domain": "70000001277", "domainid": 1278, "id": 42849, 以下略 ロードバランサーに追加する Fabric を作成します。 【~/fabfile.py】 def add_balancing_server(vmid): resp = local(""" idcf-compute-api assignToLoadBalancerRule --id {id} --virtualmachineids {virtualmachineids} """.format(id="42849", #your ID of the load balancer rule virtualmachineids=vmid),capture=True) print resp ※ルールの ID は先に確認したものに置き換えてください。 22 / 24
  • 23. hbstudy#41×IDCF クラウドハンズオン スケールスクリプトを修正します。(赤字のところを追記) 【~/scale.sh】※http://repo.cloud.idc.jp/Tmp/scale2.sh に置いてます #!/bin/bash queue="scale:sclgrp:up" lock_key="scale:sclgrp:lock" incrd_key="scale:sclgrp:incrd" path="`dirname $0`" log_file="scale.log" log() { echo [`date`] $1 >> ${path}/${log_file} } log "-------------------------" queue_count=$(redis-cli llen $queue | awk '{print $1}') log "queue_count: $queue_count" if [ $queue_count -gt 0 ]; then vm_name=$(redis-cli lpop $queue | awk '{print $1}') log "queued by: $vm_name" locked=$(redis-cli get $lock_key | awk '{print $1}') incrd=$(redis-cli get $incrd_key | awk '{print $1}') if [ -z "$locked" ]; then locked=0 fi if [ -z "$incrd" ]; then incrd=0 fi log "locked: $locked" log "incrd: $incrd" vm_count=$(fab -f ~/fabfile.py -H localhost count_idcf_vms | awk 'NR==2 {print $0}') log "vm_count: $vm_count" if [ $locked -lt 1 ]; then redis-cli incr $lock_key redis-cli incr $incrd_key # fab -f ~/fabfile.py -H localhost setup_idcf_vm:displayname=scale_$incrd 23 / 24
  • 24. hbstudy#41×IDCF クラウドハンズオン vm_id=$(fab -f ~/fabfile.py -H localhost setup_idcf_vm:displayname=scale_$incrd | grep "__vmid__" | cut -d',' -f2) fab -f ~/fabfile.py -H localhost add_balancing_server:vmid=$vm_id redis-cli set $lock_key 0 redis-cli del $queue else log "not deploying new vm" fi fi この後、負荷をかけて自動で作成された仮想マシンはロードバランサーに追加されます。 ポータルからロードバランサーの設定を確認してみてください。 この状態では、追加された仮想マシンでは httpd が動おらず、ヘルスチェックに失敗するので HTTP の通信は分散されません。 httpd のインストール、コンテンツのアップロードが必要です。 まだ時間が余っている人は考えてみてはいかがでしょうか。。。。 ここまでの fabfile は以下の URL に置いています。 http://repo.cloud.idc.jp/Tmp/fabfile.py 24 / 24