SoftLayerの無料ベアメタルでOpenStackの学習をする(9) - 第8章「新バージョンのアプリケーションリリース」(Swiftの利用)

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

# 第8章 新バージョンのアプリケーションリリース

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

## 8.1 新バージョンのアプリケーションの特徴とデプロイの流れ

現在のサンプルSNSアプリはテキストメッセージを保存－表示するだけのものでありデータの保管先はMySQLである。新バージョンのアプリケーションでは画像ファイルを共有できるようにする。この保管先にSwiftが使われる。

作業手順は下記のとおりである。

0. dbsサーバー×1、appサーバー×1、webサーバー×4、lbsサーバー×1を既存のネットワークに立てる。
0. 既存dbsサーバーのデータを、新規dbサーバーに移行する。
0. 既存lbsについていてFloating IPを新lbsに付け替える。

## 8.2 仮想マシンインスタンス作成の準備

userdataファイルの作成と確認である。

appでは接続先のdbsサーバーのIPを構成ファイルに設定する必要があり、webサーバーでは接続先のappサーバーのIPを構成ファイルに設定する必要がある。
後者は前回[こちら](http://qiita.com/orz/items/143a1ae5985610f49da4#734-metadata%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E8%A8%AD%E5%AE%9A)で「nova boot」に「--meta rest_ip=${MY_REST_IP}」のように指定していしたものを取り出す[userdata](https://github.com/josug-book1-materials/chapter05-10/blob/master/07/userdata_web_auto_setting.txt)を作成した。このケースではキー「rest_ip」を明示指定して取り出している。

今回のuserdataではこの部分を汎用化し、キーを名前で指定できるfunctionを用意している。

```
function get_metadata () { 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('${1:?}')"; }
```

appサーバー用はこちら - [userdata_v2_app.txt](https://github.com/josug-book1-materials/chapter05-10/blob/master/08/userdata_v2_app.txt)。
webサーバー用はこちら - [userdata_v2_web.txt](https://github.com/josug-book1-materials/chapter05-10/blob/master/08/userdata_v2_web.txt)

appサーバーでは、dbsサーバーのIPを取り出し、endpoint.confの該当部分を書き換えている。

```
MY_DBS_IP=`get_metadata dbs_ip`
sed -i -e "s/db_host = localhost/db_host = ${MY_DBS_IP:?}/" /root/sample-app/endpoint.conf

```

webサーバーでは、appサーバーのIPの他にSwiftに接続する情報を取り出している。

```
MY_REST_IP=`get_metadata rest_ip`; MY_KEYSTONE_URL=`get_metadata keystone_url`
MY_REGION_NAME=`get_metadata region_name`; MY_TENANT_NAME=`get_metadata tenant_name`
MY_USER_NAME=`get_metadata user_name`; MY_PASSWORD=`get_metadata password`
```

endpoint.confは、一部を書き換えるのではなく全体を作成している。

```
cat << EOF > /root/sample-app/endpoint.conf
[rest-server]
rest_host = ${MY_REST_IP:?}
rest_endpoint = http://%(rest_host)s:5555/bbs
[swift]
container_name = sample_bbs
upload_path = /tmp/flask/
keystone_url = ${MY_KEYSTONE_URL:?}
region_name = ${MY_REGION_NAME:?}
tenant_name = ${MY_TENANT_NAME:?}
user_name = ${MY_USER_NAME:?}
password = ${MY_PASSWORD:?}
EOF
```

## 8.3 仮想マシンインスタンスの作成

仮想マシンインスタンスを一括して作成するスクリプトは[こちら](https://github.com/josug-book1-materials/chapter05-10/blob/master/08/01_create_v2_servers.sh)。

まず、いつものように、ネットワークのUUIDを保管しておく。

```
[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_DBS_NET=`neutron net-show dbs-net | get_uuid`
[root@step-server ~]# env | grep MY_
MY_DBS_NET=ec886dac-29bf-404a-8464-736c948e7c2a
MY_APP_NET=7d3828af-2da1-4e10-a904-f9e03b28e181
MY_DMZ_NET=35e4baac-7230-4232-9644-856874dfe8af
```

### 8.3.1 DBサーバーの起動

userdata_dbs.txtを基にDBサーバー「v2-dbs01」を作成する。userdata_dbs.txtは第8章用に特に用意されていない。[第6章のuserdata_dbs.txt](https://github.com/josug-book1-materials/chapter05-10/blob/master/06/userdata_dbs.txt)をそのまま使うようだ。
この中では下記のように、v1.0のブランチをチェックアウトしている。

```
git checkout -b v1.0 remotes/origin/v1.0
```

install_db.shは[v1.0のもの](https://github.com/josug-book1-materials/sample-app/blob/v1.0/server-setup/install_db.sh)も[v2.0のもの](https://github.com/josug-book1-materials/sample-app/blob/v2.0/server-setup/install_db.sh)も同一なので、[第6章のuserdata_dbs.txt](https://github.com/josug-book1-materials/chapter05-10/blob/master/06/userdata_dbs.txt)を使って問題ないようだ。もちろん、下記のようにv2.0のブランチをチェックアウトしても問題にはならないのだろう。

```
git checkout -b v1.0 remotes/origin/v2.0
```
v2-dbs01を起動する。

<pre>
root@step-server 08]# nova boot --flavor standard.xsmall --image "centos-base" \
> --key-name key-for-internal --user-data userdata_dbs.txt \
> --security-groups sg-all-from-console,sg-all-from-dbs-net \
> --availability-zone az1 --nic net-id=${MY_DMZ_NET} --nic net-id=${MY_DBS_NET} \
> v2-dbs01
+--------------------------------------+----------------------------------------------------+
| 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                            | 2EzPQXc7pzkq                                       |
| config_drive                         |                                                    |
| created                              | 2015-03-25T11:42:05Z                               |
| flavor                               | standard.xsmall (100)                              |
| hostId                               |                                                    |
| id                                   | bcc6e192-915d-4efe-b96c-7193ddcd7ba8               |
| image                                | centos-base (098f948e-e80b-4b1a-8a46-f8d2dd57e149) |
| key_name                             | key-for-internal                                   |
| metadata                             | {}                                                 |
| name                                 | v2-dbs01                                           |
| os-extended-volumes:volumes_attached | []                                                 |
| progress                             | 0                                                  |
| security_groups                      | sg-all-from-console, sg-all-from-dbs-net           |
| status                               | BUILD                                              |
| tenant_id                            | 106e169743964758bcad1f06cc69c472                   |
| updated                              | 2015-03-25T11:42:05Z                               |
| user_id                              | 98dd78b670884b64b879568215777c53                   |
+--------------------------------------+----------------------------------------------------+
</pre>

### 8.3.2 APPサーバーの起動

v2-dbs01がdbs-netに持つIPを取得・保管する。

```
[root@step-server 08]# export MY_DBS_IP=`nova show v2-dbs01 |grep " dbs-net" |awk '{print $5}'`
[root@step-server 08]# echo $MY_DBS_IP
172.16.20.4
```

その値を「--meta」に指定しv2-app01を起動する。

<pre>
[root@step-server 08]# nova boot --flavor standard.xsmall --image "centos-base" \
> --key-name key-for-internal --user-data userdata_v2_app.txt \
> --security-groups sg-all-from-console,sg-all-from-app-net,sg-all-from-dbs-net \
> --availability-zone az1 \
> --nic net-id=${MY_DMZ_NET} --nic net-id=${MY_APP_NET} --nic net-id=${MY_DBS_NET} \
> --meta dbs_ip=${MY_DBS_IP} \
> v2-app01
+--------------------------------------+---------------------------------------------------------------+
| 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                            | 7DtURVAGprYy                                                  |
| config_drive                         |                                                               |
| created                              | 2015-03-25T11:47:39Z                                          |
| flavor                               | standard.xsmall (100)                                         |
| hostId                               |                                                               |
| id                                   | 05b9180d-3e9d-4fba-b530-81aefb766349                          |
| image                                | centos-base (098f948e-e80b-4b1a-8a46-f8d2dd57e149)            |
| key_name                             | key-for-internal                                              |
| metadata                             | {"dbs_ip": "172.16.20.4"}                                     |
| name                                 | v2-app01                                                      |
| os-extended-volumes:volumes_attached | []                                                            |
| progress                             | 0                                                             |
| security_groups                      | sg-all-from-console, sg-all-from-app-net, sg-all-from-dbs-net |
| status                               | BUILD                                                         |
| tenant_id                            | 106e169743964758bcad1f06cc69c472                              |
| updated                              | 2015-03-25T11:47:40Z                                          |
| user_id                              | 98dd78b670884b64b879568215777c53                              |
+--------------------------------------+---------------------------------------------------------------+
</pre>

### 8.3.3 WEBサーバーの起動

webサーバーの起動には下記の「--meta」が指定されている。

```
--meta rest_ip=${MY_REST_IP} \
--meta keystone_url=${OS_AUTH_URL} \
--meta region_name=${OS_REGION_NAME} \
--meta tenant_name=${OS_TENANT_NAME} \
--meta user_name=${OS_USERNAME} \
--meta password=${OS_PASSWORD} \
```

MY_REST_IPにはv2-app01がapp-netに持つIPを取得・保管する。

```
[root@step-server 08]# export MY_REST_IP=`nova show v2-app01 |grep " app-net" |awk '{print $5}'`
[root@step-server 08]# echo $MY_REST_IP
172.16.10.7
```

Swift接続に必要な「OS_」で始まる値は「source openrc」で設定されているはずである。

```
[root@step-server 08]# env | grep OS_
OS_REGION_NAME=RegionOne
OS_PASSWORD=passw0rd
OS_AUTH_URL=http://192.168.100.10:5000/v2.0/
OS_USERNAME=snsapp-infra-user
OS_TENANT_NAME=SNSApp
```

「-num-instances 4」を付けv2-webを4台起動する。

<pre>
[root@step-server 08]# nova boot --flavor standard.xsmall --image "centos-base" \
> --key-name key-for-internal --user-data userdata_v2_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} \
> --num-instances 4 \
> --meta rest_ip=${MY_REST_IP} \
> --meta keystone_url=${OS_AUTH_URL} \
> --meta region_name=${OS_REGION_NAME} \
> --meta tenant_name=${OS_TENANT_NAME} \
> --meta user_name=${OS_USERNAME} \
> --meta password=${OS_PASSWORD} \
> v2-web
+--------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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                            | Z5ZfcB7KttG2                                                                                                                                                                                  |
| config_drive                         |                                                                                                                                                                                               |
| created                              | 2015-03-25T11:57:47Z                                                                                                                                                                          |
| flavor                               | standard.xsmall (100)                                                                                                                                                                         |
| hostId                               |                                                                                                                                                                                               |
| id                                   | d2e01c48-d38a-4655-a7c5-55acf5cb3433                                                                                                                                                          |
| image                                | centos-base (098f948e-e80b-4b1a-8a46-f8d2dd57e149)                                                                                                                                            |
| key_name                             | key-for-internal                                                                                                                                                                              |
| metadata                             | {"region_name": "RegionOne", "rest_ip": "172.16.10.7", "keystone_url": "http://192.168.100.10:5000/v2.0/", "tenant_name": "SNSApp", "password": "passw0rd", "user_name": "snsapp-infra-user"} |
| name                                 | v2-web-d2e01c48-d38a-4655-a7c5-55acf5cb3433                                                                                                                                                   |
| 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-25T11:57:48Z                                                                                                                                                                          |
| user_id                              | 98dd78b670884b64b879568215777c53                                                                                                                                                              |
+--------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
</pre>

本書によれば名前の後は連番かUUIDのどちらかが付き、それはOpenStackのバージョンで決まるとあった。今回の環境ではUUIDが付いた。

<pre>
[root@step-server 08]# nova list --name v2-web* --field name,status
+--------------------------------------+---------------------------------------------+--------+
| ID                                   | Name                                        | Status |
+--------------------------------------+---------------------------------------------+--------+
| 4c92e879-82c9-4f0d-994e-612112cded0e | v2-web-4c92e879-82c9-4f0d-994e-612112cded0e | ACTIVE |
| 745bbdd4-3bcf-4847-b19f-ad7f049e4fa6 | v2-web-745bbdd4-3bcf-4847-b19f-ad7f049e4fa6 | ACTIVE |
| c1b8303b-96dc-498f-a8bd-7adda921ae23 | v2-web-c1b8303b-96dc-498f-a8bd-7adda921ae23 | ACTIVE |
| d2e01c48-d38a-4655-a7c5-55acf5cb3433 | v2-web-d2e01c48-d38a-4655-a7c5-55acf5cb3433 | ACTIVE |
+--------------------------------------+---------------------------------------------+--------+
</pre>

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

ロードバランサー用のuserdataもdbs用と同様に特記が無い。nginxが導入できればいいだけなので[第7章のuserdata_lbs.txt](https://github.com/josug-book1-materials/chapter05-10/blob/master/07/userdata_lbs.txt)で良い様だ。

v2-lbs01を起動する。

<pre>
[root@step-server 08]# 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} \
> v2-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                            | ruYnLVSmL8st                                       |
| config_drive                         |                                                    |
| created                              | 2015-03-25T12:12:01Z                               |
| flavor                               | standard.xsmall (100)                              |
| hostId                               |                                                    |
| id                                   | 5a6bbf91-b357-4c94-9144-5be3e4f52e3d               |
| image                                | centos-base (098f948e-e80b-4b1a-8a46-f8d2dd57e149) |
| key_name                             | key-for-internal                                   |
| metadata                             | {}                                                 |
| name                                 | v2-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-25T12:12:01Z                               |
| user_id                              | 98dd78b670884b64b879568215777c53                   |
+--------------------------------------+----------------------------------------------------+
</pre>

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

<pre>
[root@step-server 08]# nova list --name v2-lbs01 --field name,networks
+--------------------------------------+----------+----------------------+
| ID                                   | Name     | Networks             |
+--------------------------------------+----------+----------------------+
| 5a6bbf91-b357-4c94-9144-5be3e4f52e3d | v2-lbs01 | dmz-net=192.168.0.15 |
+--------------------------------------+----------+----------------------+
</pre>

v2-webサーバーに割り振られたIPは下記のとおり。

<pre>
[root@step-server 08]# nova list --name v2-web* --field name,networks
+--------------------------------------+---------------------------------------------+--------------------------------------------+
| ID                                   | Name                                        | Networks                                   |
+--------------------------------------+---------------------------------------------+--------------------------------------------+
| 4c92e879-82c9-4f0d-994e-612112cded0e | v2-web-4c92e879-82c9-4f0d-994e-612112cded0e | dmz-net=192.168.0.14; app-net=172.16.10.11 |
| 745bbdd4-3bcf-4847-b19f-ad7f049e4fa6 | v2-web-745bbdd4-3bcf-4847-b19f-ad7f049e4fa6 | dmz-net=192.168.0.13; app-net=172.16.10.10 |
| c1b8303b-96dc-498f-a8bd-7adda921ae23 | v2-web-c1b8303b-96dc-498f-a8bd-7adda921ae23 | dmz-net=192.168.0.11; app-net=172.16.10.8  |
| d2e01c48-d38a-4655-a7c5-55acf5cb3433 | v2-web-d2e01c48-d38a-4655-a7c5-55acf5cb3433 | dmz-net=192.168.0.12; app-net=172.16.10.9  |
+--------------------------------------+---------------------------------------------+--------------------------------------------+
</pre>

v2-lbs01に「dmz-net=192.168.0.15」でログインし、v2-webサーバーのアドレスをnginxの構成に登録する。nginxを再起動する。

```
[root@step-server ~]# ssh -i key-for-internal.pem root@192.168.0.15
[root@v2-lbs01 ~]# cat /etc/nginx/conf.d/lbs.conf
upstream web-server {
  ip_hash;
  server 192.168.0.11:80;
  server 192.168.0.12:80;
  server 192.168.0.13:80;
  server 192.168.0.14:80;
}

server {
  listen 80 default_server;
  server_name _;

  location / {
    proxy_pass http://web-server/;
  }
}
[root@v2-lbs01 ~]# service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
```

## 8.4 DBサーバーのデータ移行

v1.0(dbs01)のデータをv2.0(v2-dbs01)に移行する。dbsのアドレスは下記のとおり。

<pre>
[root@step-server ~]# nova list --name dbs01 --field name,networks
+--------------------------------------+----------+------------------------------------------+
| ID                                   | Name     | Networks                                 |
+--------------------------------------+----------+------------------------------------------+
| edf1b599-de4f-4b2c-be90-17ab1252728f | dbs01    | dmz-net=192.168.0.4; dbs-net=172.16.20.3 |
| bcc6e192-915d-4efe-b96c-7193ddcd7ba8 | v2-dbs01 | dmz-net=192.168.0.9; dbs-net=172.16.20.4 |
+--------------------------------------+----------+------------------------------------------+
</pre>

dbs01にログインし対象のテーブル構造と内容を確認する。このあたりは本書には無いが何をやっているか理解するために実施する。

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

[root@dbs01 ~]# mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW COLUMNS FROM sample_bbs.contents;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| timestamp | datetime     | YES  |     | NULL    |                |
| text      | varchar(255) | YES  |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> select * from sample_bbs.contents;
+----+---------------------+---------------+
| id | timestamp           | text          |
+----+---------------------+---------------+
|  1 | 2015-03-24 13:12:57 | 6章の終了     |
|  2 | 2015-03-25 14:53:53 | 7章の終了     |
+----+---------------------+---------------+
2 rows in set (0.00 sec)

mysql>
</pre>

mysqldumpでsample_bbs.contentsの内容をダンプする。

<pre>
[root@dbs01 ~]# mysqldump -u root -e -t -t sample_bbs contents > mysql.dump.v1.sql
</pre>

catで中身を確認するとこんな感じ。

<pre>
[root@dbs01 ~]# cat mysql.dump.v1.sql
-- MySQL dump 10.13  Distrib 5.1.73, for redhat-linux-gnu (x86_64)
--
-- Host: localhost    Database: sample_bbs
-- ------------------------------------------------------
-- Server version       5.1.73

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Dumping data for table `contents`
--

LOCK TABLES `contents` WRITE;
/*!40000 ALTER TABLE `contents` DISABLE KEYS */;
INSERT INTO `contents` VALUES (1,'2015-03-24 13:12:57','6章の終了'),(2,'2015-03-25 14:53:53','7章の終了');
/*!40000 ALTER TABLE `contents` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2015-03-25 22:00:53
</pre>

踏み台サーバーに戻り、これをv2-dbs01にコピーする。

```
[root@step-server ~]# scp -i key-for-internal.pem root@192.168.0.4:~/mysql.dump.v1.sql ~/
mysql.dump.v1.sql                                           100% 1564     1.5KB/s   00:00
[root@step-server ~]# scp -i key-for-internal.pem mysql.dump.v1.sql root@192.168.0.9:~/
mysql.dump.v1.sql                                           100% 1564     1.5KB/s   00:00

```

v2-dbs01にログインしmysqlに接続する。

<pre>
[root@step-server ~]# ssh -i key-for-internal.pem root@192.168.0.9
[root@v2-dbs01 ~]# mysql -u root sample_bbs
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
</pre>

インポートする。

<pre>
mysql> source mysql.dump.v1.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

ERROR 1136 (21S01): Column count doesn't match value count at row 1
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
</pre>

データが入っていない。「ERROR 1136 (21S01): Column count doesn't match value count at row 1」ってエラーがあった。

<pre>
mysql> select * from sample_bbs.contents;
Empty set (0.00 sec)
</pre>

やはりINSERTでエラーになることを確認。

<pre>
mysql> INSERT INTO `contents` VALUES (1,'2015-03-24 13:12:57','6章の終了'),(2,'2015-03-25 14:53:53','7章の終了');
ERROR 1136 (21S01): Column count doesn't match value count at row 1
</pre>

列の数が合わないらしい。テーブルを確認するとimagerefという列が存在する。イメージをSwiftに保存するのだから情報は必要だろう。

<pre>
mysql> SHOW COLUMNS FROM sample_bbs.contents;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| timestamp | datetime     | YES  |     | NULL    |                |
| text      | varchar(255) | YES  |     | NULL    |                |
| imageref  | varchar(255) | YES  |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
</pre>

とりあえず、デフォルト値のNULLをimagerefに設定してINSERTする。

<pre>
mysql> INSERT INTO `contents` VALUES (1,'2015-03-24 13:12:57','6章の終了',NULL),(2,'2015-03-25 14:53:53','7章の終了',NULL);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
</pre>

## 8.5 動作確認と後片付け

本書では新しいFloating IPを割り当て外部からアクセスする設定になっている。その方法は学習したし、本当にやると今回の環境ではホスト上に新しいIP用のReverse Proxyを立てる必要がある。そのまま生かして新しいFloating IPを割り当てるのではなく、[こちら] (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)や[こちら](http://qiita.com/orz/items/143a1ae5985610f49da4#75-floating-ip%E3%81%AE%E4%BB%98%E3%81%91%E6%9B%BF%E3%81%88)でやったようにFloating IPを付け替えてしまうこととする。どうせ、ユーザーは私しかいないし。

<pre>
[root@step-server ~]# nova floating-ip-disassociate lbs01 192.168.100.133
[root@step-server ~]# nova floating-ip-associate v2-lbs01 192.168.100.133
[root@step-server ~]# nova list --name  v2-lbs01 --field name,networks
+--------------------------------------+----------+---------------------------------------+
| ID                                   | Name     | Networks                              |
+--------------------------------------+----------+---------------------------------------+
| 5a6bbf91-b357-4c94-9144-5be3e4f52e3d | v2-lbs01 | dmz-net=192.168.0.15, 192.168.100.133 |
+--------------------------------------+----------+---------------------------------------+
</pre>

コメントをつけて画像をアップロードしたが、イメージが表示されない。

![7-2.png](https://qiita-image-store.s3.amazonaws.com/0/71995/af3a6a09-e05e-2b7e-83db-94898bda0552.png)

イメージのURLは[http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472/sample_bbs/dde871b05aaf446199783f37b9e9b430-07-01.png](http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472/sample_bbs/dde871b05aaf446199783f37b9e9b430-07-01.png)とコントロールノードのポート8080になっている。
これがswiftのアクセス先のようだ。
html内にIPアドレスが明示されているので単純にReverse Proxyでアクセスする訳にはいかない。代わりにホスト区画からwgetでデータが取得できることを確認する。

<pre>
user01@test:~$ wget http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472/sample_bbs/dde871b05aaf446199783f37b9e9b430-07-01.png
--2015-03-28 04:42:50--  http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472/sample_bbs/dde871b05aaf446199783f37b9e9b430-07-01.png
Connecting to 192.168.100.10:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10807 (11K) [image/png]
Saving to: ‘dde871b05aaf446199783f37b9e9b430-07-01.png’

100%[======================================>] 10,807      --.-K/s   in 0s

2015-03-28 04:42:50 (366 MB/s) - ‘dde871b05aaf446199783f37b9e9b430-07-01.png’ saved [10807/10807]
</pre>

踏み台サーバーから確認するとswiftにsample_bbsというコンテナができ、そのなかに今回のイメージが保存されているのがわかる。

<pre>
[root@step-server ~]# swift list
sample_bbs
[root@step-server ~]# swift list sample_bbs
dde871b05aaf446199783f37b9e9b430-07-01.png
</pre>

今回のシナリオでは*今回のアプリケーションのリリースは見送る*ため新バージョン用の仮想サーバーを削除し作業を終了している。公開用Floating IPはlbs01に戻しておく。

<pre>[root@step-server ~]# nova list --name v2 --field name
+--------------------------------------+---------------------------------------------+
| ID                                   | Name                                        |
+--------------------------------------+---------------------------------------------+
| 05b9180d-3e9d-4fba-b530-81aefb766349 | v2-app01                                    |
| bcc6e192-915d-4efe-b96c-7193ddcd7ba8 | v2-dbs01                                    |
| 5a6bbf91-b357-4c94-9144-5be3e4f52e3d | v2-lbs01                                    |
| 4c92e879-82c9-4f0d-994e-612112cded0e | v2-web-4c92e879-82c9-4f0d-994e-612112cded0e |
| 745bbdd4-3bcf-4847-b19f-ad7f049e4fa6 | v2-web-745bbdd4-3bcf-4847-b19f-ad7f049e4fa6 |
| c1b8303b-96dc-498f-a8bd-7adda921ae23 | v2-web-c1b8303b-96dc-498f-a8bd-7adda921ae23 |
| d2e01c48-d38a-4655-a7c5-55acf5cb3433 | v2-web-d2e01c48-d38a-4655-a7c5-55acf5cb3433 |
+--------------------------------------+---------------------------------------------+

[root@step-server ~]# nova delete v2-app01 v2-dbs01 v2-lbs01 \
> v2-web-4c92e879-82c9-4f0d-994e-612112cded0e \
> v2-web-745bbdd4-3bcf-4847-b19f-ad7f049e4fa6 \
> v2-web-c1b8303b-96dc-498f-a8bd-7adda921ae23 \
> v2-web-d2e01c48-d38a-4655-a7c5-55acf5cb3433

[root@step-server ~]# nova floating-ip-associate lbs01 192.168.100.133
</pre>


## [自習] swiftの操作
この作業内容ではswiftを操作した感じがないので、もう少し自習する。

コンテナmy_containerを作成しlistで確認する。

<pre>
[root@step-server ~]# swift post my_container
[root@step-server ~]# swift list
my_container
sample_bbs
</pre>

「swift stat」でもコンテナ数は 2 になっている。

<pre>
[root@step-server ~]# swift stat
       Account: AUTH_106e169743964758bcad1f06cc69c472
    Containers: 2
       Objects: 1
         Bytes: 10807
X-Account-Project-Domain-Id: default
X-Account-Storage-Policy-Policy-0-Bytes-Used: 10807
X-Account-Storage-Policy-Policy-0-Container-Count: 2
   X-Timestamp: 1427284873.93734
X-Account-Storage-Policy-Policy-0-Object-Count: 1
    X-Trans-Id: txfb3403b1c86241ed99bd5-0055162840
  Content-Type: text/plain; charset=utf-8
 Accept-Ranges: bytes
</pre>

「swift stat my_container」でオブジェクト数は当然 0。

<pre>
[root@step-server ~]# swift stat my_container
       Account: AUTH_106e169743964758bcad1f06cc69c472
     Container: my_container
       Objects: 0
         Bytes: 0
      Read ACL:
     Write ACL:
       Sync To:
      Sync Key:
 Accept-Ranges: bytes
X-Storage-Policy: Policy-0
   X-Timestamp: 1427515440.96738
    X-Trans-Id: tx985b1e644bcc4c7ebcbb1-005516284b
  Content-Type: text/plain; charset=utf-8

</pre>

「swift upload」でファイルを保存する。オブジェクト数が 1 になった 。

<pre>
[root@step-server ~]# swift upload my_container 07.png
07.png

[root@step-server ~]# swift stat my_container
       Account: AUTH_106e169743964758bcad1f06cc69c472
     Container: my_container
       Objects: 1
         Bytes: 10807
      Read ACL:
     Write ACL:
       Sync To:
      Sync Key:
 Accept-Ranges: bytes
X-Storage-Policy: Policy-0
   X-Timestamp: 1427515440.96738
    X-Trans-Id: tx516b0ef01e0d40ffbb12e-0055162a8f
  Content-Type: text/plain; charset=utf-8

</pre>

手元のファイルを削除しswiftから取得する。

<pre>
[root@step-server ~]# rm 07.png
rm: remove regular file `07.png'? yes

[root@step-server ~]# swift download my_container 07.png
07.png [auth 0.240s, headers 0.283s, total 0.283s, 0.252 MB/s]
</pre>

コンテナに対して認証無しのRead権をつける。Read ACLが設定された。

<pre>
[root@step-server ~]# swift post my_container -r '.r:*'

[root@step-server ~]# swift stat my_container
       Account: AUTH_106e169743964758bcad1f06cc69c472
     Container: my_container
       Objects: 1
         Bytes: 10807
      Read ACL: .r:*
     Write ACL:
       Sync To:
      Sync Key:
 Accept-Ranges: bytes
X-Storage-Policy: Policy-0
   X-Timestamp: 1427515440.96738
    X-Trans-Id: tx1a1bf655ed0f4b089325c-0055162c75
  Content-Type: text/plain; charset=utf-8
</pre>

swiftのurlを確認する。[http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472](http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472)となっている。

<pre>
[root@step-server ~]# swift stat -v
    StorageURL: http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472
    Auth Token: 49a07b505b824dd9b96b556eebdf89f2
       Account: AUTH_106e169743964758bcad1f06cc69c472
    Containers: 2
       Objects: 2
         Bytes: 21614
X-Account-Project-Domain-Id: default
X-Account-Storage-Policy-Policy-0-Bytes-Used: 21614
X-Account-Storage-Policy-Policy-0-Container-Count: 2
   X-Timestamp: 1427284873.93734
X-Account-Storage-Policy-Policy-0-Object-Count: 2
    X-Trans-Id: txa8a06447bd9f4778b5d1c-0055162d94
  Content-Type: text/plain; charset=utf-8
 Accept-Ranges: bytes
</pre>

OpenStackへの認証を設定していないホスト区画で「swiftのurl/コンテナ名/ファイル名」でファイルが取得できるのを確認する。

<pre>
user01@test:~$ wget http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472/my_container/07.png
--2015-03-28 05:29:47--  http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472/my_container/07.png
Connecting to 192.168.100.10:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10807 (11K) [image/png]
Saving to: ‘07.png’

100%[======================================>] 10,807      --.-K/s   in 0s

2015-03-28 05:29:47 (284 MB/s) - ‘07.png’ saved [10807/10807]
</pre>

認証無しのread権をはずす。

<pre>
[root@step-server ~]# swift post my_container -r ''

[root@step-server ~]# swift stat my_container
       Account: AUTH_106e169743964758bcad1f06cc69c472
     Container: my_container
       Objects: 1
         Bytes: 10807
      Read ACL:
     Write ACL:
       Sync To:
      Sync Key:
 Accept-Ranges: bytes
X-Storage-Policy: Policy-0
   X-Timestamp: 1427515440.96738
    X-Trans-Id: tx6a205c4ee17d4573a1088-0055162f7d
  Content-Type: text/plain; charset=utf-8
</pre>

先ほどできたファイルの取得が「401 Unauthorized」で失敗する。

<pre>
user01@test:~$ wget http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472/my_container/07.png
--2015-03-28 05:35:36--  http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472/my_container/07.png
Connecting to 192.168.100.10:8080... connected.
HTTP request sent, awaiting response... 401 Unauthorized

Username/Password Authentication Failed.
</pre>

 「swift stat -v」で確認できるAuth TokenをつけてURLにアクセスすると「swift list」と同様の情報が得られる。

<pre>
user01@test:~$ curl http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472/ -X GET -H "X-Auth-Token: 5692fe00f9bd4e05a6934d62c67c0bab"
my_container
sample_bbs
</pre>

アクセス先を「url/コンテナ名」にすると「swift list コンテナ名」と同様の情報が得られる。

<pre>
user01@test:~$ curl http://192.168.100.10:8080/v1/AUTH_106e169743964758bcad1f06cc69c472/my_container -X GET -H "X-Auth-Token: 5692fe00f9bd4e05a6934d62c67c0bab"
07.png
</pre>

ダッシュボードからも確認・操作ができる。

![コンテナーのダッシュボードからの確認](https://qiita-image-store.s3.amazonaws.com/0/71995/0de06259-f901-aeff-a38c-237a496b0694.png)

***
第8章の完了。本文に記載が無いswiftの操作を多少自分で調べた。
***
[前回はこちら](http://qiita.com/orz/items/143a1ae5985610f49da4) - [次回はこちら](http://qiita.com/orz/items/db45139054ee42612179)