SoftLayerの無料ベアメタルでOpenStackの学習をする(8) - 第7章「アプリケーションの負荷分散」

[前回はこちら](http://qiita.com/orz/items/5b68ecc57e2afb936330) - [次回はこちら](http://qiita.com/orz/items/b257046fd336850c52dc)
***
#これはなに
[「OpenStackクラウドインテグレーション オープンソースクラウドによるサービス構築入門」](http://www.shoeisha.co.jp/book/detail/9784798139784)の実習をSoftLayerの無料ベアメタルで行う記録である。
![OpenStackクラウドインテグレーション オープンソースクラウドによるサービス構築入門](http://www.seshop.com/static/images/product/17681/L.png)

# 第7章 アプリケーションの負荷分散

第5章から第10章までの支援ファイルはこちら。まとめてgitでダウンロードできる。
https://github.com/josug-book1-materials/chapter05-10
<br/>第7章の支援ファイルはこちらである。
https://github.com/josug-book1-materials/chapter05-10/tree/master/07
<br/>前回と同様に第7章のすべてのステップをまとめて行うスクリプトも用意されている。
https://github.com/josug-book1-materials/chapter05-10/blob/master/07/build_chap07.sh


## 7.1 負荷分散処理の流れ
この章では[第6章](http://qiita.com/orz/items/5b68ecc57e2afb936330)で構築した3層のSNSアプリのフロントにロードバランサーを立て、Webサーバーを増設してその配下に加える。最後に公開アドレスであるweb01につけていたFloting IPをロードバランサーに付け替える。

## 7.2 ロードバランサーの構築

ロードバランサーlbs01を構築し接続はweb01に転送する設定をする。

### 7.2.1 userdataファイルの作成

ロードバランサーにはnginxを利用する。
[userdataはこちら](https://github.com/josug-book1-materials/chapter05-10/blob/master/07/userdata_lbs.txt)。nginxの導入と自動起動が設定されている。

### 7.2.2 ロードバランサーの起動

ロードバランサーはdmz-netに接続されるので、dmz-netのUUIDを取得し「nova boot」に指定している。

<pre>
[root@step-server 07]# function get_uuid () { cat - | grep " id " | awk '{print $4}'; }
[root@step-server 07]# export MY_DMZ_NET=`neutron net-show dmz-net | get_uuid`
[root@step-server 07]# nova boot --flavor standard.xsmall --image "centos-base" \
> --key-name key-for-internal --user-data userdata_lbs.txt \
> --security-groups sg-all-from-console,sg-web-from-internet \
> --availability-zone az1 \
> --nic net-id=${MY_DMZ_NET} \
> lbs01
+--------------------------------------+----------------------------------------------------+
| Property                             | Value                                              |
+--------------------------------------+----------------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                             |
| OS-EXT-AZ:availability_zone          | nova                                               |
| OS-EXT-STS:power_state               | 0                                                  |
| OS-EXT-STS:task_state                | scheduling                                         |
| OS-EXT-STS:vm_state                  | building                                           |
| OS-SRV-USG:launched_at               | -                                                  |
| OS-SRV-USG:terminated_at             | -                                                  |
| accessIPv4                           |                                                    |
| accessIPv6                           |                                                    |
| adminPass                            | FLZDfBC57nW9                                       |
| config_drive                         |                                                    |
| created                              | 2015-03-24T05:40:19Z                               |
| flavor                               | standard.xsmall (100)                              |
| hostId                               |                                                    |
| id                                   | 37cbd237-9fd9-4f95-b4e3-caafeaf67454               |
| image                                | centos-base (098f948e-e80b-4b1a-8a46-f8d2dd57e149) |
| key_name                             | key-for-internal                                   |
| metadata                             | {}                                                 |
| name                                 | lbs01                                              |
| os-extended-volumes:volumes_attached | []                                                 |
| progress                             | 0                                                  |
| security_groups                      | sg-all-from-console, sg-web-from-internet          |
| status                               | BUILD                                              |
| tenant_id                            | 106e169743964758bcad1f06cc69c472                   |
| updated                              | 2015-03-24T05:40:20Z                               |
| user_id                              | 98dd78b670884b64b879568215777c53                   |
+--------------------------------------+----------------------------------------------------+
</pre>

lbs01には「dmz-net=192.168.0.5」が割り振られた。

<pre>
[root@step-server 07]# nova list --field name,networks
+--------------------------------------+-------------+---------------------------------------------------------------+
| ID                                   | Name        | Networks                                                      |
+--------------------------------------+-------------+---------------------------------------------------------------+
| 35d338e5-6e8a-4cee-9be1-9a37b431bf38 | app01       | dmz-net=192.168.0.3; app-net=172.16.10.3; dbs-net=172.16.20.1 |
| edf1b599-de4f-4b2c-be90-17ab1252728f | dbs01       | dmz-net=192.168.0.4; dbs-net=172.16.20.3                      |
| 37cbd237-9fd9-4f95-b4e3-caafeaf67454 | lbs01       | dmz-net=192.168.0.5                                           |
| 65d3400d-3467-4563-9ff5-9c0e30c7157e | step-server | work-net=10.0.0.1, 192.168.100.131                            |
| ca755522-3eb2-475a-8e37-7fe23398b1d9 | web01       | dmz-net=192.168.0.1, 192.168.100.133; app-net=172.16.10.1     |
+--------------------------------------+-------------+---------------------------------------------------------------+
</pre>

lbs01のIPアドレスを環境変数$MY_LBS_IPにセットしておく。

<pre>
[root@step-server 07]# export MY_LBS_IP=`nova show lbs01 | grep " dmz-net" | awk '{print $5}'`
[root@step-server 07]# echo $MY_LBS_IP
192.168.0.5
</pre>

nginxが起動していることを確認する。

```
[root@step-server 07]# curl http://${MY_LBS_IP}
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
～～～～～～～～
```

### 7.2.3 Nginxの設定

lbs01にロードバランサー用の設定ファイルを作成する。
まず、lbs01にログインする。

```
[root@step-server ~]# ssh -i key-for-internal.pem root@${MY_LBS_IP}
[root@lbs01 ~]#
```

構成ファイル/etc/nginx/conf.d/lbs.confを、下記のように作成する。serverのIP「192.168.0.1」は、web01の「dmz-net=192.168.0.1」の割り振りである。

```
[root@lbs01 ~]# cat /etc/nginx/conf.d/lbs.conf
upstream web-server {
  server 192.168.0.1:80;
}

server {
  listen 80 default_server;
  server_name _;

  location / {
    proxy_pass http://web-server/;
  }
}
```

構成を確認して再起動する。

```
[root@lbs01 ~]# service nginx configtest
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lbs01 ~]# service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
```

### 7.2.4 ロードバランサー経由でのアクセス確認

踏み台サーバーに戻り、lbs01にアクセスする。
先ほどは「Welcome to nginx!」だったが、今回は第6章の動作確認で書き込んだ「6章の終了」が表示されている。アプリに接続できているようである。

```
[root@step-server ~]# curl http://${MY_LBS_IP}
<!doctype html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
  </head>
  <body>
    <form method="POST" action="/">
      <label for="text">Please write something and hit enter</label> <input id="text" name="text" type="text" value="">
    </form>
    <br/>
            <table class="contents">
                    <tr>
                        <td>2015-03-24 13:12:57</td>
                        <td>6章の終了</td>
                    </tr>
            </table>
  </body>
</html>
```

## 7.3 Webサーバーのデプロイ

### 7.3.1 WEBサーバー構築方法の整理

この節で実行するWEBサーバー構築方法の整理である。
web01はgitからアプリを導入後、(1)endpoint.confにappサーバーのIPを指定し、(2)web.init.shの実行でアプリを起動した。
ここでは(1)は環境毎に設定が異なる項目である、この方法として下記のふたつの方法を試す。

0. endpoint.confに現行appサーバーのIPを指定したサーバーを構築しスナップショットを、追加webサーバーのテンプレートとする。
0. metadata機能を使ってデプロイ時にappサーバーのIPを取得し、設定ファイルを更新する。

### 7.3.2 テンプレートとなるweb02の構築

構築手順はweb01と同様である。違うところは名前がweb02。

<pre>
[root@step-server 06]# function get_uuid () { cat - | grep " id " | awk '{print $4}'; }
[root@step-server 06]# export MY_DMZ_NET=`neutron net-show dmz-net | get_uuid`
[root@step-server 06]# export MY_APP_NET=`neutron net-show app-net | get_uuid``
[root@step-server 06]# nova boot --flavor standard.xsmall --image "centos-base" \
> --key-name key-for-internal --user-data userdata_web.txt \
> --security-groups sg-all-from-console,sg-web-from-internet,sg-all-from-app-net \
> --availability-zone az1 \
> --nic net-id=${MY_DMZ_NET} --nic net-id=${MY_APP_NET} \
> web02
+--------------------------------------+----------------------------------------------------------------+
| Property                             | Value                                                          |
+--------------------------------------+----------------------------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                                         |
| OS-EXT-AZ:availability_zone          | nova                                                           |
| OS-EXT-STS:power_state               | 0                                                              |
| OS-EXT-STS:task_state                | scheduling                                                     |
| OS-EXT-STS:vm_state                  | building                                                       |
| OS-SRV-USG:launched_at               | -                                                              |
| OS-SRV-USG:terminated_at             | -                                                              |
| accessIPv4                           |                                                                |
| accessIPv6                           |                                                                |
| adminPass                            | QmG6wRJZywdB                                                   |
| config_drive                         |                                                                |
| created                              | 2015-03-24T06:33:36Z                                           |
| flavor                               | standard.xsmall (100)                                          |
| hostId                               |                                                                |
| id                                   | d0ce0d2a-f4fa-448d-bb9b-b605af386b9f                           |
| image                                | centos-base (098f948e-e80b-4b1a-8a46-f8d2dd57e149)             |
| key_name                             | key-for-internal                                               |
| metadata                             | {}                                                             |
| name                                 | web02                                                          |
| os-extended-volumes:volumes_attached | []                                                             |
| progress                             | 0                                                              |
| security_groups                      | sg-all-from-console, sg-web-from-internet, sg-all-from-app-net |
| status                               | BUILD                                                          |
| tenant_id                            | 106e169743964758bcad1f06cc69c472                               |
| updated                              | 2015-03-24T06:33:36Z                                           |
| user_id                              | 98dd78b670884b64b879568215777c53                               |
+--------------------------------------+----------------------------------------------------------------+
</pre>

「dmz-net=192.168.0.6」が割り振られた。

<pre>
[root@step-server 06]# nova list --field name,networks | grep web02
| d0ce0d2a-f4fa-448d-bb9b-b605af386b9f | web02       | dmz-net=192.168.0.6; app-net=172.16.10.4                      |
</pre>

web02にログインしendpoint.confを修正する。今回の環境ではapp01には「app-net=172.16.10.3」が割り振られているのでrest_hostに指定する。web01の時と同じである。

<pre>
[root@step-server ~]# ssh -i key-for-internal.pem root@192.168.0.6
[root@web02 ~]#

[root@web02 ~]# cat /root/sample-app/endpoint.conf
[rest-server]
rest_host = 172.16.10.3
rest_endpoint = http://%(rest_host)s:5555/bbs

[db-server]
db_host = localhost
db_endpoint = mysql://user:password@%(db_host)s/sample_bbs?charset=utf8
</pre>

スナップショットを取るためにshutdownする。
完了を確認し「nova image-create」でスナップショットを作成する。「nova list」で完了を待つ。

<pre>
[root@web02 ~]# shutdown -h now
[root@web02 ~]#
Broadcast message from root@web02
        (/dev/pts/0) at 15:48 ...

The system is going down for halt NOW!
Connection to 192.168.0.6 closed by remote host.
Connection to 192.168.0.6 closed.

[root@step-server ~]# nova list --name web02 --field name,power_state
+--------------------------------------+-------+-------------+
| ID                                   | Name  | Power State |
+--------------------------------------+-------+-------------+
| d0ce0d2a-f4fa-448d-bb9b-b605af386b9f | web02 | Shutdown    |
+--------------------------------------+-------+-------------+

[root@step-server ~]# nova image-create web02 web-base-v1.0

[root@step-server ~]# nova list --name web02 --field name,task_state
+--------------------------------------+-------+----------------------+
| ID                                   | Name  | Task State           |
+--------------------------------------+-------+----------------------+
| d0ce0d2a-f4fa-448d-bb9b-b605af386b9f | web02 | image_pending_upload |
+--------------------------------------+-------+----------------------+

[root@step-server ~]# nova list --name web02 --field name,task_state
+--------------------------------------+-------+------------+
| ID                                   | Name  | Task State |
+--------------------------------------+-------+------------+
| d0ce0d2a-f4fa-448d-bb9b-b605af386b9f | web02 | None       |
+--------------------------------------+-------+------------+
</pre>

glanceにイメージweb-base-v1.0が追加されている。

<pre>
[root@step-server ~]# glance image-list
+--------------------------------------+--------------------------+-------------+------------------+------------+--------+
| ID                                   | Name                     | Disk Format | Container Format | Size       | Status |
+--------------------------------------+--------------------------+-------------+------------------+------------+--------+
| 098f948e-e80b-4b1a-8a46-f8d2dd57e149 | centos-base              | qcow2       | bare             | 633235456  | active |
| 39fb3a6e-e543-4bfe-8ff7-a948acd1c7a3 | cirros-0.3.3-x86_64-disk | qcow2       | bare             | 13200896   | active |
| 362ae42a-1e46-4de4-afd9-af57965f1b3f | web-base-v1.0            | qcow2       | bare             | 1799749632 | active |
+--------------------------------------+--------------------------+-------------+------------------+------------+--------+
</pre>

web02を起動し、その中のアプリも開始しておく。

```
[root@step-server ~]# nova start web02
[root@step-server ~]# ssh -i key-for-internal.pem root@192.168.0.6

[root@web02 ~]# sh /root/sample-app/server-setup/web.init.sh start
Starting web.py                                            [  OK  ]
[root@web02 ~]# exit
logout
Connection to 192.168.0.6 closed.
```

### 7.3.3 スナップショットからの仮想マシンインスタンス起動

web-base-v1.0からweb03を起動する。

導入や設定は完了しているので、userdataの中身は、アプリケーションの起動のみ。
作成スクリプトは[こちらに用意されている](https://github.com/josug-book1-materials/chapter05-10/blob/master/07/03_create_web03.sh)が「"」で囲われていたので正常に動作しなかった。本文には「'」で記載されているので、それに従う。
もちろん[事前に用意](https://github.com/josug-book1-materials/chapter05-10/blob/master/07/userdata_web03.txt)もされている。

```
[root@step-server ~]# echo '#!/bin/bash' > userdata_web03.txt
[root@step-server ~]# echo 'sh /root/sample-app/server-setup/web.init.sh start' >> userdata_web03.txt
```

「--image "web-base-v1.0"」でスナップショットから起動する。

<pre>
[root@step-server 07]# nova boot --flavor standard.xsmall --image "web-base-v1.0" \
> --key-name key-for-internal --user-data userdata_web03.txt \
> --security-groups sg-all-from-console,sg-web-from-internet,sg-all-from-app-net \
> --availability-zone az1 \
> --nic net-id=${MY_DMZ_NET} --nic net-id=${MY_APP_NET} \
> web03
+--------------------------------------+----------------------------------------------------------------+
| Property                             | Value                                                          |
+--------------------------------------+----------------------------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                                         |
| OS-EXT-AZ:availability_zone          | nova                                                           |
| OS-EXT-STS:power_state               | 0                                                              |
| OS-EXT-STS:task_state                | scheduling                                                     |
| OS-EXT-STS:vm_state                  | building                                                       |
| OS-SRV-USG:launched_at               | -                                                              |
| OS-SRV-USG:terminated_at             | -                                                              |
| accessIPv4                           |                                                                |
| accessIPv6                           |                                                                |
| adminPass                            | Psxv5AkAVm4L                                                   |
| config_drive                         |                                                                |
| created                              | 2015-03-24T07:14:27Z                                           |
| flavor                               | standard.xsmall (100)                                          |
| hostId                               |                                                                |
| id                                   | 5e8fb496-f248-42e4-a6d9-997fd6307402                           |
| image                                | web-base-v1.0 (362ae42a-1e46-4de4-afd9-af57965f1b3f)           |
| key_name                             | key-for-internal                                               |
| metadata                             | {}                                                             |
| name                                 | web03                                                          |
| os-extended-volumes:volumes_attached | []                                                             |
| progress                             | 0                                                              |
| security_groups                      | sg-all-from-console, sg-web-from-internet, sg-all-from-app-net |
| status                               | BUILD                                                          |
| tenant_id                            | 106e169743964758bcad1f06cc69c472                               |
| updated                              | 2015-03-24T07:14:28Z                                           |
| user_id                              | 98dd78b670884b64b879568215777c53                               |
+--------------------------------------+----------------------------------------------------------------+
</pre>
web03が起動してきた。

<pre>
[root@step-server 07]# nova list --field name,networks
+--------------------------------------+-------------+---------------------------------------------------------------+
| ID                                   | Name        | Networks                                                      |
+--------------------------------------+-------------+---------------------------------------------------------------+
| 35d338e5-6e8a-4cee-9be1-9a37b431bf38 | app01       | dmz-net=192.168.0.3; app-net=172.16.10.3; dbs-net=172.16.20.1 |
| edf1b599-de4f-4b2c-be90-17ab1252728f | dbs01       | dmz-net=192.168.0.4; dbs-net=172.16.20.3                      |
| 37cbd237-9fd9-4f95-b4e3-caafeaf67454 | lbs01       | dmz-net=192.168.0.5                                           |
| 65d3400d-3467-4563-9ff5-9c0e30c7157e | step-server | work-net=10.0.0.1, 192.168.100.131                            |
| ca755522-3eb2-475a-8e37-7fe23398b1d9 | web01       | dmz-net=192.168.0.1, 192.168.100.133; app-net=172.16.10.1     |
| d0ce0d2a-f4fa-448d-bb9b-b605af386b9f | web02       | dmz-net=192.168.0.6; app-net=172.16.10.4                      |
| 5e8fb496-f248-42e4-a6d9-997fd6307402 | web03       | dmz-net=192.168.0.7; app-net=172.16.10.5                      |
+--------------------------------------+-------------+---------------------------------------------------------------+
</pre>

### 7.3.4 metadataを利用した設定

まずはmetadataサーバー「[http://169.254.169.254](http://169.254.169.254)」について。
これまで「nova boot」する時に「--user-data」で起動後の実行内容をシェルで書いて渡して来た。
仮想マシンは、起動後に特別なアドレス「[http://169.254.169.254/latest/user-data/](http://169.254.169.254/latest/user-data/)」にアクセスして、これを取り出すらしい。

テンプレート用に作ったweb02で確認する。web01/02用のuserdataが確認できる。

```
[root@web02 ~]#  curl http://169.254.169.254/openstack/latest/user_data
#!/bin/bash
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
cd /root
git clone -q https://github.com/josug-book1-materials/sample-app.git
cd sample-app
git checkout -b v1.0 remotes/origin/v1.0
sh /root/sample-app/server-setup/install_web.sh
```

web03はスナップショットからの起動のためアプリの開始だけをuserdataに指定した。*同じURL*にもかかわらずweb03専用のuserdataが取得された。

```
[root@step-server ~]# ssh -i key-for-internal.pem root@192.168.0.7
[root@web03 ~]# curl http://169.254.169.254/openstack/latest/user_data
#!/bin/bash
sh /root/sample-app/server-setup/web.init.sh start
```

metadataの場合は「nova boot」に「--mata key=value」の形式で指定する。この場合、下記のアクセスするとjson形式で仮想マシン側からアクセスできるらしい。

[http://169.254.169.254/openstack/latest/meta_data.json](http://169.254.169.254/openstack/latest/meta_data.json)

何も指定しなかったweb03でもこのようなものが取得された(読みやすいように改行済み)。

```
[root@web03 ~]# curl http://169.254.169.254/openstack/latest/meta_data.json
{
 "random_seed": "QXM9bT4Sm3tkoCADO (中略) TOgIJWKjLbLdrUR3mVKoU=",
 "uuid": "5e8fb496-f248-42e4-a6d9-997fd6307402",
 "availability_zone": "az1",
 "hostname": "web03.novalocal",
 "launch_index": 0,
 "public_keys": 
  {
   "key-for-internal": "ssh-rsa AAAAB3NzaC1y (中略) XiIII1yd2MrwXcCn Generated-by-Nova\n"
  },
 "name": "web03"
}
```

今回、実行されるのは下記のとおりである。

0. 「nova boot」に「--meta rest-ip=${MY_REST_IP}」のように指定する。
0. 仮想マシンではuserdataの実行中に[http://169.254.169.254/openstack/latest/meta_data.json](http://169.254.169.254/openstack/latest/meta_data.json)にアクセスし、値をjsonで取得する。
0. jsonからキー「rest-ip」の値を取り出す。
0. sedでendpoint.confの127.0.0.1をこの値に書き換える。

これを実現するuserdataは[userdata_web_auto_setting.txt](https://github.com/josug-book1-materials/chapter05-10/blob/master/07/userdata_web_auto_setting.txt)のようになっている。

まず、ネットワークのUUIDやAppサーバーのIPを取得する。

<pre>
[root@step-server ~]# function get_uuid () { cat - | grep " id " | awk '{print $4}'; }
[root@step-server ~]# export MY_DMZ_NET=`neutron net-show dmz-net | get_uuid`
[root@step-server ~]# export MY_APP_NET=`neutron net-show app-net | get_uuid`
[root@step-server ~]# export MY_REST_IP=`nova show app01 |grep " app-net" |awk '{print $5}'`
[root@step-server ~]# env | grep MY_
MY_APP_NET=7d3828af-2da1-4e10-a904-f9e03b28e181
MY_DMZ_NET=35e4baac-7230-4232-9644-856874dfe8af
MY_REST_IP=172.16.10.3
</pre>

「--meta rest_ip=${MY_REST_IP}」を付けて「nova boot」する。

<pre>
[root@step-server 07]# nova boot --flavor standard.xsmall --image "centos-base" \
> --key-name key-for-internal --user-data userdata_web_auto_setting.txt \
> --security-groups sg-all-from-console,sg-web-from-internet,sg-all-from-app-net \
> --availability-zone az1 \
> --nic net-id=${MY_DMZ_NET} --nic net-id=${MY_APP_NET} \
> --meta rest_ip=${MY_REST_IP} \
> web04
+--------------------------------------+----------------------------------------------------------------+
| Property                             | Value                                                          |
+--------------------------------------+----------------------------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                                         |
| OS-EXT-AZ:availability_zone          | nova                                                           |
| OS-EXT-STS:power_state               | 0                                                              |
| OS-EXT-STS:task_state                | scheduling                                                     |
| OS-EXT-STS:vm_state                  | building                                                       |
| OS-SRV-USG:launched_at               | -                                                              |
| OS-SRV-USG:terminated_at             | -                                                              |
| accessIPv4                           |                                                                |
| accessIPv6                           |                                                                |
| adminPass                            | bBUeoqUWWH88                                                   |
| config_drive                         |                                                                |
| created                              | 2015-03-25T05:07:24Z                                           |
| flavor                               | standard.xsmall (100)                                          |
| hostId                               |                                                                |
| id                                   | 1955e438-626f-4582-8d15-bfe13b97a084                           |
| image                                | centos-base (098f948e-e80b-4b1a-8a46-f8d2dd57e149)             |
| key_name                             | key-for-internal                                               |
| metadata                             | {"rest_ip": "172.16.10.3"}                                     |
| name                                 | web04                                                          |
| os-extended-volumes:volumes_attached | []                                                             |
| progress                             | 0                                                              |
| security_groups                      | sg-all-from-console, sg-web-from-internet, sg-all-from-app-net |
| status                               | BUILD                                                          |
| tenant_id                            | 106e169743964758bcad1f06cc69c472                               |
| updated                              | 2015-03-25T05:07:25Z                                           |
| user_id                              | 98dd78b670884b64b879568215777c53                               |
+--------------------------------------+----------------------------------------------------------------+
</pre>

これで、webサーバーは4つできた。

<pre>
[root@step-server 07]# nova list --name web* --field name,networks
+--------------------------------------+-------+-----------------------------------------------------------+
| ID                                   | Name  | Networks                                                  |
+--------------------------------------+-------+-----------------------------------------------------------+
| ca755522-3eb2-475a-8e37-7fe23398b1d9 | web01 | dmz-net=192.168.0.1, 192.168.100.133; app-net=172.16.10.1 |
| d0ce0d2a-f4fa-448d-bb9b-b605af386b9f | web02 | dmz-net=192.168.0.6; app-net=172.16.10.4                  |
| 5e8fb496-f248-42e4-a6d9-997fd6307402 | web03 | dmz-net=192.168.0.7; app-net=172.16.10.5                  |
| 1955e438-626f-4582-8d15-bfe13b97a084 | web04 | dmz-net=192.168.0.8; app-net=172.16.10.6                  |
+--------------------------------------+-------+-----------------------------------------------------------+
</pre>

web04に入って渡されたuserdataの確認。

```
[root@step-server ~]# ssh -i key-for-internal.pem root@192.168.0.8
[root@web04 ~]# curl http://169.254.169.254/openstack/latest/user_data
#!/bin/bash
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
cd /root
git clone https://github.com/josug-book1-materials/sample-app.git
cd sample-app
git checkout -b v1.0 remotes/origin/v1.0
sh /root/sample-app/server-setup/install_web.sh

MY_REST_IP=`curl -S -s http://169.254.169.254/openstack/latest/meta_data.json \
| python -c \
"import json,sys; print json.load(sys.stdin).get('meta').get('rest_ip')"`

sed -i -e "s/rest_host = 127.0.0.1/rest_host = ${MY_REST_IP:?}/" \
/root/sample-app/endpoint.conf

sh /root/sample-app/server-setup/web.init.sh start
```

mata_data.jsonの確認。「meta」の「rest_ip」にapp01のアドレスが渡っている。

```
[root@web04 ~]# curl http://169.254.169.254/openstack/latest/meta_data.json
{
  "random_seed": "9isqFeB5tivwrp5xof (中略) CTWF4xuBlNkh4HScfdDLI=", 
  "uuid": "1955e438-626f-4582-8d15-bfe13b97a084", 
  "availability_zone": "az1", 
  "hostname": "web04.novalocal", 
  "launch_index": 0, 
  "meta": 
  {
    "rest_ip": "172.16.10.3"
  }, 
  "public_keys": 
  {
    "key-for-internal": "ssh-rsa AAAAB3NzaC1yc2Cg (中略) 5Hyd2MrwXcCn Generated-by-Nova\n"
  }, 
  "name": "web04"}
```

先ほどの[userdata_web_auto_setting.txt](https://github.com/josug-book1-materials/chapter05-10/blob/master/07/userdata_web_auto_setting.txt)では、curlでこのjsonを取り出し、pythonでjsonからrest_ipの値を取り出し、sedでrest_hostの行を置き換えている。

## 7.4 ロードバランサーへのエントリーの追加

lbs01にログインしてweb02-04を追加し、nginx を再起動する。

```
[root@lbs01 ~]# cat /etc/nginx/conf.d/lbs.conf
upstream web-server {
  server 192.168.0.1:80;
  server 192.168.0.6:80;
  server 192.168.0.7:80;
  server 192.168.0.8:80;
}

server {
  listen 80 default_server;
  server_name _;

  location / {
    proxy_pass http://web-server/;
  }
}

[root@lbs01 ~]# service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
```

lbs01で8回のリクエストを実施。不精をしてlbs01上で127.0.0.1でアクセス。

```
[root@lbs01 ~]# for i in {1..8}; do curl http://127.0.0.1/; sleep 2; done
```

本日付けで各サーバーに2回づつのアクセスが確認できる。

```
[root@step-server ~]# ssh -i key-for-internal.pem root@192.168.0.1
[root@web01 ~]# tail sample-app/web.log
127.0.0.1 - - [24/Mar/2015 12:14:32] "GET / HTTP/1.1" 200 -
192.168.100.1 - - [24/Mar/2015 13:10:14] "GET / HTTP/1.1" 200 -
192.168.100.1 - - [24/Mar/2015 13:12:27] "GET / HTTP/1.0" 200 -
192.168.100.1 - - [24/Mar/2015 13:12:27] "GET /favicon.ico HTTP/1.0" 404 -
192.168.100.1 - - [24/Mar/2015 13:12:58] "POST / HTTP/1.0" 302 -
192.168.100.1 - - [24/Mar/2015 13:12:58] "GET / HTTP/1.0" 200 -
192.168.100.1 - - [24/Mar/2015 13:21:24] "GET / HTTP/1.0" 200 -
192.168.0.5 - - [24/Mar/2015 15:07:02] "GET / HTTP/1.0" 200 -
192.168.0.5 - - [25/Mar/2015 14:39:34] "GET / HTTP/1.0" 200 -
192.168.0.5 - - [25/Mar/2015 14:39:43] "GET / HTTP/1.0" 200 -
[root@web01 ~]# exit
logout
Connection to 192.168.0.1 closed.

[root@step-server ~]# ssh -i key-for-internal.pem root@192.168.0.6
[root@web02 ~]# tail sample-app/web.log
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
 * Restarting with stat
192.168.0.5 - - [25/Mar/2015 14:39:36] "GET / HTTP/1.0" 200 -
192.168.0.5 - - [25/Mar/2015 14:39:44] "GET / HTTP/1.0" 200 -
[root@web02 ~]# exit
logout
Connection to 192.168.0.6 closed.

[root@step-server ~]# ssh -i key-for-internal.pem root@192.168.0.7
[root@web03 ~]# tail sample-app/web.log
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
 * Restarting with stat
192.168.0.5 - - [25/Mar/2015 14:39:38] "GET / HTTP/1.0" 200 -
192.168.0.5 - - [25/Mar/2015 14:39:46] "GET / HTTP/1.0" 200 -
[root@web03 ~]# exit
logout
Connection to 192.168.0.7 closed.

[root@step-server ~]# ssh -i key-for-internal.pem root@192.168.0.8
[root@web04 ~]# tail sample-app/web.log
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
 * Restarting with stat
192.168.0.5 - - [25/Mar/2015 14:39:40] "GET / HTTP/1.0" 200 -
192.168.0.5 - - [25/Mar/2015 14:39:48] "GET / HTTP/1.0" 200 -
[root@web04 ~]# exit
logout
Connection to 192.168.0.8 closed.
```

## 7.5 Floating IPの付け替え

公開用にweb01に振られていたFloating IP「192.168.100.133」をlbs01に付け替える。

<pre>
[root@step-server ~]# nova list --name web01 --field name,networks
+--------------------------------------+-------+-----------------------------------------------------------+
| ID                                   | Name  | Networks                                                  |
+--------------------------------------+-------+-----------------------------------------------------------+
| ca755522-3eb2-475a-8e37-7fe23398b1d9 | web01 | dmz-net=192.168.0.1, 192.168.100.133; app-net=172.16.10.1 |
+--------------------------------------+-------+-----------------------------------------------------------+

[root@step-server ~]# nova floating-ip-disassociate web01 192.168.100.133
[root@step-server ~]# nova floating-ip-associate lbs01 192.168.100.133

[root@step-server ~]# nova list --name lbs01 --field name,networks
+--------------------------------------+-------+--------------------------------------+
| ID                                   | Name  | Networks                             |
+--------------------------------------+-------+--------------------------------------+
| 37cbd237-9fd9-4f95-b4e3-caafeaf67454 | lbs01 | dmz-net=192.168.0.5, 192.168.100.133 |
+--------------------------------------+-------+--------------------------------------+
</pre>

公開IPは変更されていないので、[6章の最後に作ったReverse Proxy経由でのアクセス](http://qiita.com/orz/items/5b68ecc57e2afb936330#65-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9)は変更する必要はない。そのままの構成でアクセスできる。

![Reverse Proxy経由のアクセス](https://qiita-image-store.s3.amazonaws.com/0/71995/2a9368e5-9621-f1e1-68c7-8633cfa05ae2.png)

lbsでnginxのアクセスログを確認すると、こちらへのアクセスが確認できる。

```
[root@step-server ~]# ssh -i key-for-internal.pem root@192.168.0.5
[root@lbs01 ~]# tail /var/log/nginx/access.log
```

***
第7章が完了した。
***

[前回はこちら](http://qiita.com/orz/items/5b68ecc57e2afb936330) - [次回はこちら](http://qiita.com/orz/items/b257046fd336850c52dc)