SoftLayerの無料ベアメタルでOpenStackの学習をする(13) - 第12章「Fogを使ったマルチクラウドへのシステム展開」

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

# 第12章 Fogを使ったマルチクラウドへのシステム展開

当章ではFogとChefを利用しOpenStackとAWSのマルチクラウド環境を構築する。

当章の支援ファイルは[こちら](https://github.com/josug-book1-materials/chapter12)。

## 12.1 システム自動展開の概要

第11章のAnsibleのプレイブックではOpenStack以外のクラウドには対応できないよね、という話。

## 12.2 自動展開の内部動作

自動展開には大きく分けて、(1)インフラリソースを構築する、(2)アプリケーションを構築するという2つのステップがある。(1)はクラウドに対する操作でクラウド毎に異なるAPIを使う必要があるが、(2)はOSへの操作なので共通でありChef、Ansible、Puppetとかのツールで自動化可能である。
この章では(1)をFogで、(2)をChefで自動化する。話の中心はもちろん(1)。

## 12.3 Fogについて

Fogはクラウド操作用のRubyのライブラリー。AWSでもOpenStackでもFog::Compute.newで仮想マシンを作成できるが、渡す引数が違い単純に共通化できるものではないという話。

## 12.4 事前準備

### 12.4.1 クラウド環境の準備

OpenStackは当然これまで使ってきたものを利用する。[AWSにアカウントをつくり](http://aws.amazon.com/jp/register-flow/)、[CentOS 6 x86_64 - with Updates HVM](https://aws.amazon.com/marketplace/pp/B00NQAYLWO/ref=srh_res_product_title?ie=UTF8&sr=0-4&qid=1427764534059)をマーケットプレースで購入しておく。

### 12.4.2 前提環境の構築

まず、OpenStack側の準備。手順は[こちら](https://github.com/josug-book1-materials/chapter12/blob/master/openstack_prepare_fog_server.sh)

キーペアkey-openstackを作る。

```
[root@step-server ~]# nova keypair-add key-openstack | tee key-openstack.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA6O4FWIoi1oQ7XVn2ysvH0NNmhU48MpmB5MGua7zI0b93uinZ
～～～～～～～

[root@step-server ~]# chmod 600 key-openstack.pem
```

ネットワークfog-netを192.168.1.0/24で作成する。

<pre>
[root@step-server ~]# neutron net-create fog-net
Created a new network:
+-----------------+--------------------------------------+
| Field           | Value                                |
+-----------------+--------------------------------------+
| admin_state_up  | True                                 |
| id              | 2d6b7733-8381-4ca1-8de5-a47d3054a088 |
| name            | fog-net                              |
| router:external | False                                |
| shared          | False                                |
| status          | ACTIVE                               |
| subnets         |                                      |
| tenant_id       | 106e169743964758bcad1f06cc69c472     |
+-----------------+--------------------------------------+

[root@step-server ~]# neutron subnet-create --ip-version 4 --gateway 192.168.1.254 \
> --name fog-subnet fog-net 192.168.1.0/24
Created a new subnet:
+-------------------+--------------------------------------------------+
| Field             | Value                                            |
+-------------------+--------------------------------------------------+
| allocation_pools  | {"start": "192.168.1.1", "end": "192.168.1.253"} |
| cidr              | 192.168.1.0/24                                   |
| dns_nameservers   |                                                  |
| enable_dhcp       | True                                             |
| gateway_ip        | 192.168.1.254                                    |
| host_routes       |                                                  |
| id                | 199d8419-1f7a-4959-ae3c-0ab4370464c7             |
| ip_version        | 4                                                |
| ipv6_address_mode |                                                  |
| ipv6_ra_mode      |                                                  |
| name              | fog-subnet                                       |
| network_id        | 2d6b7733-8381-4ca1-8de5-a47d3054a088             |
| tenant_id         | 106e169743964758bcad1f06cc69c472                 |
+-------------------+--------------------------------------------------+

[root@step-server ~]# neutron router-interface-add Ext-Router fog-subnet
Added interface 7fab4d8b-c854-42b4-8ce1-0a3330c9b55f to router Ext-Router.
</pre>
 
セキュリティグループsg-for-fogを作り、ルールを追加する。

<pre>
[root@step-server ~]# neutron security-group-create sg-for-fog
Created a new security_group:
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field                | Value                                                                                                                                                                                                                                                                                                                         |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| description          |                                                                                                                                                                                                                                                                                                                               |
| id                   | 4c9ac151-c1c0-43e3-8b6a-0b69e7217fbe                                                                                                                                                                                                                                                                                          |
| name                 | sg-for-fog                                                                                                                                                                                                                                                                                                                    |
| security_group_rules | {"remote_group_id": null, "direction": "egress", "remote_ip_prefix": null, "protocol": null, "tenant_id": "106e169743964758bcad1f06cc69c472", "port_range_max": null, "security_group_id": "4c9ac151-c1c0-43e3-8b6a-0b69e7217fbe", "port_range_min": null, "ethertype": "IPv4", "id": "3b3b7311-f5ec-44c3-a4a4-d567ef515568"} |
|                      | {"remote_group_id": null, "direction": "egress", "remote_ip_prefix": null, "protocol": null, "tenant_id": "106e169743964758bcad1f06cc69c472", "port_range_max": null, "security_group_id": "4c9ac151-c1c0-43e3-8b6a-0b69e7217fbe", "port_range_min": null, "ethertype": "IPv6", "id": "6d612c19-d6cb-40e2-9558-5794937cb6df"} |
| tenant_id            | 106e169743964758bcad1f06cc69c472                                                                                                                                                                                                                                                                                              |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

[root@step-server ~]# neutron security-group-rule-create --protocol tcp \
>   --port-range-min 22 --port-range-max 22 \
>   --remote-ip-prefix 0.0.0.0/0 \
>   sg-for-fog
Created a new security_group_rule:
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| direction         | ingress                              |
| ethertype         | IPv4                                 |
| id                | 8479bc21-449e-4a98-8715-3a4ea7e696ff |
| port_range_max    | 22                                   |
| port_range_min    | 22                                   |
| protocol          | tcp                                  |
| remote_group_id   |                                      |
| remote_ip_prefix  | 0.0.0.0/0                            |
| security_group_id | 4c9ac151-c1c0-43e3-8b6a-0b69e7217fbe |
| tenant_id         | 106e169743964758bcad1f06cc69c472     |
+-------------------+--------------------------------------+

[root@step-server ~]# neutron security-group-rule-create --protocol icmp \
>   --remote-ip-prefix 0.0.0.0/0 \
>   sg-for-fog
Created a new security_group_rule:
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| direction         | ingress                              |
| ethertype         | IPv4                                 |
| id                | 6794a260-43a1-4683-8877-8cce01c1f4af |
| port_range_max    |                                      |
| port_range_min    |                                      |
| protocol          | icmp                                 |
| remote_group_id   |                                      |
| remote_ip_prefix  | 0.0.0.0/0                            |
| security_group_id | 4c9ac151-c1c0-43e3-8b6a-0b69e7217fbe |
| tenant_id         | 106e169743964758bcad1f06cc69c472     |
+-------------------+--------------------------------------+

[root@step-server ~]# neutron security-group-rule-create --protocol icmp \
>   --remote-ip-prefix 192.168.1.0/24 \
>   sg-for-fog
Created a new security_group_rule:
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| direction         | ingress                              |
| ethertype         | IPv4                                 |
| id                | 2ab010d1-39a3-4ae0-b786-4a8c586a6963 |
| port_range_max    |                                      |
| port_range_min    |                                      |
| protocol          | icmp                                 |
| remote_group_id   |                                      |
| remote_ip_prefix  | 192.168.1.0/24                       |
| security_group_id | 4c9ac151-c1c0-43e3-8b6a-0b69e7217fbe |
| tenant_id         | 106e169743964758bcad1f06cc69c472     |
+-------------------+--------------------------------------+

[root@step-server ~]# neutron security-group-rule-create --protocol tcp \
>   --remote-ip-prefix 192.168.1.0/24 \
>   sg-for-fog
Created a new security_group_rule:
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| direction         | ingress                              |
| ethertype         | IPv4                                 |
| id                | b3cf5963-4815-4552-8250-f8f3382bb9e9 |
| port_range_max    |                                      |
| port_range_min    |                                      |
| protocol          | tcp                                  |
| remote_group_id   |                                      |
| remote_ip_prefix  | 192.168.1.0/24                       |
| security_group_id | 4c9ac151-c1c0-43e3-8b6a-0b69e7217fbe |
| tenant_id         | 106e169743964758bcad1f06cc69c472     |
+-------------------+--------------------------------------+
</pre>

centos-baseイメージのUUIDを確認する。

<pre>
[root@step-server ~]# nova image-list
+--------------------------------------+--------------------------+--------+--------------------------------------+
| ID                                   | Name                     | Status | Server                               |
+--------------------------------------+--------------------------+--------+--------------------------------------+
| 098f948e-e80b-4b1a-8a46-f8d2dd57e149 | centos-base              | ACTIVE |                                      |
| 39fb3a6e-e543-4bfe-8ff7-a948acd1c7a3 | cirros-0.3.3-x86_64-disk | ACTIVE |                                      |
| 362ae42a-1e46-4de4-afd9-af57965f1b3f | web-base-v1.0            | ACTIVE | d0ce0d2a-f4fa-448d-bb9b-b605af386b9f |
+--------------------------------------+--------------------------+--------+--------------------------------------+
</pre>

次にAWSでの準備作業。今回は東京リージョン(ap-northeast-1)で作業をする。
EC2の東京リージョンでキーペアkey-awsを作り、秘密鍵をkey-aws.pemで保存する。

VPCでfog-vpcを192.168.0.0/24のネットワークで作り、Publicを192.168.1.0/24にする

セキュリティグループ sg_for_fog を作成しルールをつける。

CentOSのイメージIDを確認する。Asia Pacific (Tokyo) の CentOS 6 はami-13614b12 で本書から変わらず。


### 12.4.3 Fogサーバーの構築

OpenStackにFog用のサーバーを立てる。これまでと違いフレーバーが standard.medium。

<pre>
[root@step-server ~]# get_uuid () { cat - | grep " id " | awk '{print $4}'; }
[root@step-server ~]# MY_FOG_NET=`neutron net-show fog-net | get_uuid`
[root@step-server ~]# echo $MY_FOG_NET
2d6b7733-8381-4ca1-8de5-a47d3054a088
[root@step-server ~]# nova boot \
>   --image centos-base \
>   --key-name key-openstack \
>   --flavor standard.medium \
>   --nic net-id=$MY_FOG_NET \
>   --security-groups sg-for-fog \
>   --availability-zone az1 \
>   fog-server
+--------------------------------------+----------------------------------------------------+
| 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                            | SE8gXSae2YmG                                       |
| config_drive                         |                                                    |
| created                              | 2015-03-31T04:17:20Z                               |
| flavor                               | standard.medium (102)                              |
| hostId                               |                                                    |
| id                                   | d6a19009-7a64-42e6-8b75-9975191583eb               |
| image                                | centos-base (098f948e-e80b-4b1a-8a46-f8d2dd57e149) |
| key_name                             | key-openstack                                      |
| metadata                             | {}                                                 |
| name                                 | fog-server                                         |
| os-extended-volumes:volumes_attached | []                                                 |
| progress                             | 0                                                  |
| security_groups                      | sg-for-fog                                         |
| status                               | BUILD                                              |
| tenant_id                            | 106e169743964758bcad1f06cc69c472                   |
| updated                              | 2015-03-31T04:17:20Z                               |
| user_id                              | 98dd78b670884b64b879568215777c53                   |
+--------------------------------------+----------------------------------------------------+

[root@step-server ~]# FIP=`nova floating-ip-create Ext-Net | awk -F '|' '{print $2,$4}' | awk '{if ($2 == "-") print $1;}'`

[root@step-server ~]# nova floating-ip-associate fog-server $FIP

[root@step-server ~]# nova list --field name,networks
+--------------------------------------+-------------+--------------------------------------+
| ID                                   | Name        | Networks                             |
+--------------------------------------+-------------+--------------------------------------+
| d6a19009-7a64-42e6-8b75-9975191583eb | fog-server  | fog-net=192.168.1.1, 192.168.100.136 |
| 65d3400d-3467-4563-9ff5-9c0e30c7157e | step-server | work-net=10.0.0.1, 192.168.100.131   |
+--------------------------------------+-------------+--------------------------------------+
</pre>

AWSにも指示にあるようにFog用のサーバーを立てる。
本書には「t2.medium」で立てるようにあるけれど「t2.micro」なら750時間まで無料なので「t2.micro」で立ててみる。これで後で苦労する。

両方のサーバーで、支援ファイルをgit cloneして、導入スクリプトを流す。

<pre>
[root@step-server ~]# ssh -i key-openstack.pem root@192.168.100.136

[root@fog-server ~]# yum -y install git

[root@fog-server ~]# git clone https://github.com/josug-book1-materials/chapter12.git

[root@fog-server ~]# sh chapter12/install_fog_chef.sh
</pre>

OpenStackでは成功した導入スクリプトがAWSではエラーになった。調べてみると berkshelf の依存先の dep-selector-libgecode が導入される時にコンパイルが走り、メモリーをバカ食いして落ちるらしい。
これが、メモリーが4GBの「t2.medium」を使うことになっている理由のようだ。
このくらい、課金するかと思ったが「[berkshelfはAWSのmicroインスタンスでビルド出来る](http://qiita.com/ymmtmdk/items/a8e1edd64f34c5531725)」を見つけた。これで、先に dep-selector-libgecode を導入しておく。

```
Successfully installed dep-selector-libgecode-1.0.2
1 gem installed
```

入った！気を取り直して、導入シェルを再実行する。今度は導入が完了した。

```
[root@ip-192-168-1-130 ~]# sh chapter12/install_fog_chef.sh
Updating all packages (it takes some time ...)
Installing ruby
Package flex-2.5.35-9.el6.x86_64 already installed and latest version
Package gcc-4.4.7-11.el6.x86_64 already installed and latest version
～～～～～～
Vendoring yum (3.5.3) to cookbooks/yum
Vendoring yum-epel (0.6.0) to cookbooks/yum-epel
Vendoring yum-mysql-community (0.1.16) to cookbooks/yum-mysql-community
##### Building environment completed #####

```

両方のサーバーで、コマンドが導入されていることを確認してreboot。

```
[root@ip-192-168-1-130 ~]# SU - FOG
-bash: SU: command not found
[root@ip-192-168-1-130 ~]# su - fog
[fog@ip-192-168-1-130 ~]$ wchi fog
-bash: wchi: command not found
[fog@ip-192-168-1-130 ~]$ which fog
/usr/bin/fog
[fog@ip-192-168-1-130 ~]$ which chef-zero
/usr/bin/chef-zero
[fog@ip-192-168-1-130 ~]$ exit
logout
[root@ip-192-168-1-130 ~]# reboot
```

## 12.5 マルチクライドへのシステム展開

### 12.5.1 OpenStackへの展開


ユーザーfogがfogサーバーで秘密鍵が使えるように準備する。

```
[root@step-server ~]# scp -i key-openstack.pem key-openstack.pem root@192.168.100.136:/home/fog/key-openstack.pem
key-openstack.pem                                                                   100% 1676     1.6KB/s   00:00
[root@step-server ~]# ssh -i key-openstack.pem root@192.168.100.136
[root@fog-server ~]# chown fog:fog /home/fog/key-openstack.pem
[root@fog-server ~]# chmod 600 /home/fog/key-openstack.pem
[root@fog-server ~]# ls -l /home/fog/key-openstack.pem
```

環境設定ファイル fogrc を読み込む。

```
[fog@fog-server ~]$ cat chapter12/etc/fogrc
# OpenStack
export OS_AUTH_URL='http://192.168.100.10:5000/v2.0/'
export OS_USERNAME='snsapp-infra-user'
export OS_PASSWORD='passw0rd'
export OS_TENANT_NAME='SNSApp'
export OS_REGION_NAME='RegionOne'
～～～～～～～～

[fog@fog-server ~]$ source chapter12/etc/fogrc
```

[OpenStack環境用のyaml](https://github.com/josug-book1-materials/chapter12/blob/master/etc/openstack.yaml)を今回用に書き換える。書き換える必要があるのは、環境固有のUUIDの部分である。


image id   : 098f948e-e80b-4b1a-8a46-f8d2dd57e149
network id : 2d6b7733-8381-4ca1-8de5-a47d3054a088

```
[fog@fog-server ~]$ sed -e 's/84ab092f-8e0a-42ba-a820-51fc40d07e72/098f948e-e80b-4b1a-8a46-f8d2dd57e149/g' chapter12/etc/openstack.yaml > chapter12/etc/openstack-1.yaml

[fog@fog-server ~]$ sed -e 's/9ef02f9c-cff0-40b8-a25d-1ecd9e9a7694/2d6b7733-8381-4ca1-8de5-a47d3054a088/g' chapter12/etc/openstack-1.yaml > chapter12/etc/openstack-2.yaml
```

書き換え後の openstack-2.yaml を指定して create_server.rb を実行する。

```
[fog@fog-server ~]$ cd chapter12/
[fog@fog-server chapter12]$ ruby create_server.rb etc/openstack-2.yaml
Created server db1
Created server web1
Created server web2
Created server app1
Created server lb1
 - provider: Openstack
   name: db1
   flavor: standard.xsmall
   image_id: 098f948e-e80b-4b1a-8a46-f8d2dd57e149
   key_name: key-openstack
   key_file: "/home/fog/key-openstack.pem"
   availability_zone: az1
   network_id: 2d6b7733-8381-4ca1-8de5-a47d3054a088
   security_groups:
   - sg-for-fog
   role: db
   ip_address: 192.168.1.3
 - provider: Openstack
   name: web1
   flavor: standard.xsmall
   image_id: 098f948e-e80b-4b1a-8a46-f8d2dd57e149
   key_name: key-openstack
   key_file: "/home/fog/key-openstack.pem"
   availability_zone: az1
   network_id: 2d6b7733-8381-4ca1-8de5-a47d3054a088
   security_groups:
   - sg-for-fog
   role: web
   ip_address: 192.168.1.4
 - provider: Openstack
   name: web2
   flavor: standard.xsmall
   image_id: 098f948e-e80b-4b1a-8a46-f8d2dd57e149
   key_name: key-openstack
   key_file: "/home/fog/key-openstack.pem"
   availability_zone: az1
   network_id: 2d6b7733-8381-4ca1-8de5-a47d3054a088
   security_groups:
   - sg-for-fog
   role: web
   ip_address: 192.168.1.5
 - provider: Openstack
   name: app1
   flavor: standard.xsmall
   image_id: 098f948e-e80b-4b1a-8a46-f8d2dd57e149
   key_name: key-openstack
   key_file: "/home/fog/key-openstack.pem"
   availability_zone: az1
   network_id: 2d6b7733-8381-4ca1-8de5-a47d3054a088
   security_groups:
   - sg-for-fog
   role: app
   ip_address: 192.168.1.6
 - provider: Openstack
   name: lb1
   flavor: standard.xsmall
   image_id: 098f948e-e80b-4b1a-8a46-f8d2dd57e149
   key_name: key-openstack
   key_file: "/home/fog/key-openstack.pem"
   availability_zone: az1
   network_id: 2d6b7733-8381-4ca1-8de5-a47d3054a088
   security_groups:
   - sg-for-fog
   role: lb
   ip_address: 192.168.1.7
```

仮想マシンが作成され起動している。

<pre>
[root@step-server ~]# nova list --field name,networks
+--------------------------------------+-------------+--------------------------------------+
| ID                                   | Name        | Networks                             |
+--------------------------------------+-------------+--------------------------------------+
| 94b26056-af33-410e-84fc-93a0b4914f9b | app1        | fog-net=192.168.1.6                  |
| a695dc3c-c1f8-4c60-82ee-a8e4ffc6aae6 | db1         | fog-net=192.168.1.3                  |
| d6a19009-7a64-42e6-8b75-9975191583eb | fog-server  | fog-net=192.168.1.1, 192.168.100.136 |
| 75f7b5ea-5fcf-4da2-9824-484dbdf6fd7a | lb1         | fog-net=192.168.1.7                  |
| 65d3400d-3467-4563-9ff5-9c0e30c7157e | step-server | work-net=10.0.0.1, 192.168.100.131   |
| 805c81e9-23d9-4879-be49-31907f546165 | web1        | fog-net=192.168.1.4                  |
| c056b4a0-ac8f-4057-956f-d2f7def1b832 | web2        | fog-net=192.168.1.5                  |
+--------------------------------------+-------------+--------------------------------------+
</pre>

### 12.5.2 AWSへの展開

AWSのサーバーに秘密鍵を転送しユーザーfogが使えるように権限を与える。

```
[root@ip-192-168-1-130 ~]# chown fog:fog /home/fog/key-aws.pem
[root@ip-192-168-1-130 ~]# chmod 600 /home/fog/key-aws.pem
[root@ip-192-168-1-130 ~]# ls -l /home/fog/key-openstack.pem
```

APIを使うのでIAMユーザーを作成する。Access Key IdとSecret Access Keyを入手する。
このユーザーに AmazonEC2FullAccess のPolicyを与えた。

![IAMユーザーのポリシー](https://qiita-image-store.s3.amazonaws.com/0/71995/23ff9a11-b38e-1ccc-7277-7251666c73d3.png)

「chapter12/etc/fogrc」にIAMのAccess Key IdとSecret Access Keyを設定して、読み込んで環境変数に設定する。

```
[fog@ip-192-168-1-130 ~]$ vi chapter12/etc/fogrc

# AWS
export AWS_ACCESS_KEY_ID='AKIXXXXXXXXXXXXXXXXX'
export AWS_SECRET_ACCESS_KEY='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
export AWS_REGION='ap-northeast-1'

[fog@ip-192-168-1-130 ~]$ source chapter12/etc/fogrc
```

[AWS用のyamlファイル](https://github.com/josug-book1-materials/chapter12/blob/master/etc/aws.yaml)を編集する。本書どおりに設定していれば、変更が必要なのは network_id ぐらい。

```
[fog@ip-192-168-1-130 ~]$ vi chapter12/etc/aws.yaml

- provider: AWS
  name: db1
  flavor: t2.micro
  image_id: ami-13614b12
  key_name: key-aws
  key_file: /home/fog/key-aws.pem
  network_id: subnet-abcdefgh
  security_groups:
    - sg_for_fog
  role: db
～～～～～～～～～～～～
```

yamlを指定してcreate_server.rbを実行する。

```
[fog@ip-192-168-1-130 ~]$ cd chapter12/
[fog@ip-192-168-1-130 chapter12]$ ruby create_server.rb etc/aws.yaml
Created server db1
Created server web1
Created server web2
Created server app1
Created server lb1
 - provider: Aws
   name: db1
   flavor: t2.micro
   image_id: ami-13614b12
   key_name: key-aws
   key_file: "/home/fog/key-aws.pem"
   availability_zone:
   network_id: subnet-abcdefgh
   security_groups:
   - sg_for_fog
   role: db
   ip_address: 192.168.1.208
 - provider: Aws
   name: web1
   flavor: t2.micro
   image_id: ami-13614b12
   key_name: key-aws
   key_file: "/home/fog/key-aws.pem"
   availability_zone:
   network_id: subnet-abcdefgh
   security_groups:
   - sg_for_fog
   role: web
   ip_address: 192.168.1.131
 - provider: Aws
   name: web2
   flavor: t2.micro
   image_id: ami-13614b12
   key_name: key-aws
   key_file: "/home/fog/key-aws.pem"
   availability_zone:
   network_id: subnet-abcdefgh
   security_groups:
   - sg_for_fog
   role: web
   ip_address: 192.168.1.114
 - provider: Aws
   name: app1
   flavor: t2.micro
   image_id: ami-13614b12
   key_name: key-aws
   key_file: "/home/fog/key-aws.pem"
   availability_zone:
   network_id: subnet-abcdefgh
   security_groups:
   - sg_for_fog
   role: app
   ip_address: 192.168.1.16
 - provider: Aws
   name: lb1
   flavor: t2.micro
   image_id: ami-13614b12
   key_name: key-aws
   key_file: "/home/fog/key-aws.pem"
   availability_zone:
   network_id: subnet-abcdefgh
   security_groups:
   - sg_for_fog
   role: lb
   ip_address: 192.168.1.56
```

5台の仮想マシンが起動した。

![AWSでのサーバーの起動](https://qiita-image-store.s3.amazonaws.com/0/71995/232995e9-77ab-7e7a-36f2-da55a13fa72e.png)

同じスクリプトにOpenStack用・AWS用と与えるyamlを変えるだけで別のクラウドプラットフォームに同様の展開が出来ることが確認できた。

## 12.6 内部動作の紹介

実行したFogコードの解説の節である。まじめに読もう。

## 12.7 アプリケーション導入を含めた自動化

ここではサーバーを起動と、さらにその後のアプリケーションの導入をChefで自動化している。
事前に12.6で作成したサーバーを削除しておく。

deploy_app.rb を yaml を指定して実行。下記はOpenStackの例だか、AWSなら当然 aws.yaml を指定。

```
[fog@fog-server chapter12]$ ruby deploy_app.rb etc/openstack-2.yaml
Created server db1
Created server web1
Created server web2
Created server app1
Created server lb1
waiting icmp session to db1
waiting icmp session to db1
waiting icmp session to db1
I found icmp session to db1
I found icmp session to web1
waiting icmp session to web2
I found icmp session to web2
I found icmp session to app1
I found icmp session to lb1
cookbooks uploaded.
roles uploaded.
deploy finished => db1
check logfile => more /tmp/db1_bootstrap.log
deploy finished => web1
check logfile => more /tmp/web1_bootstrap.log
deploy finished => web2
check logfile => more /tmp/web2_bootstrap.log
deploy finished => app1
check logfile => more /tmp/app1_bootstrap.log
deploy finished => lb1
check logfile => more /tmp/lb1_bootstrap.log
```

w3m を導入し、ロードバランサー lb1 に割り振られたアドレスにアクセスする。

```
[root@fog-server ~]# yum install -y w3m

[root@fog-server ~]# w3m http://192.168.1.17/
```

アプリケーションの起動が確認できた。
![w3mでのアプリへのアクセス](https://qiita-image-store.s3.amazonaws.com/0/71995/44c967b7-8560-00c5-bc47-d44fd596f450.png)

***
第12章の完了。AWSのアカウントを今回のために今日、作った。かなり使い勝手がSoftLayerのポータルと違うので戸惑った。
***

[前回はこちら](http://qiita.com/orz/items/1df2dbc43bcd7638f672) - [次回はこちら](http://qiita.com/orz/items/11bcaef5faf5d8ff87f2)