1.2.2 設定スクリプトの自動実行

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudのアップデート情報は[こちら](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/)を参照してください。）

概要
プロビジョニング・スクリプト（Provisioning Scripts）は、サーバーを起動した最初の1回だけ実行します。 インターネット側に開いたポートを、サーバーの起動時に自動的にポートを閉じる方法を紹介します。
 

プロビジョニング・スクリプトについて
これまでサーバーを注文する時（注文フォーム2ページ目の最終確認画面）に省略した「プロビジョニング・スクリプト」は、重要なので説明します。サーバーが利用可能になった時、自動的に実行したいスクリプトを、サーバー毎に指定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604778/29e48c60-3ceb-66f9-15df-6489eba7ba0b.png)

スクリプトは「URL」の所に入力するか、ポータルで事前に登録済みのものがあれば、画面上の「下側三角マーク」から選択することができます。毎回URLを入力するのは大変ですので、事前の登録をおすすめします。

登録するスクリプトは、タイムゾーンを変更するスクリプトを作成するには、アメリカ中部標準時（CDT）から、日本標準時（JST）に変更する手順を、そのまま書きます。

```
#!/bin/sh

rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

時間に関しては共通ですが、ディストリビューションによってコマンド内容が異なることがあります。複数のディストリビューションを扱う場合は、手順によって別のスクリプトを用意することがおすすめです。
 

 

セキュリティを高めるスクリプトを作るには
インターネットからのポートを閉じる手順をスクリプトにまとめておき、プロビジョニング・スクリプトとして利用できます。そうしておきますと注文時、自動的にサーバーの安全性を高められます。

次のファイアウォールでプライベート側のネットワークからしか接続できないようにするサンプルを利用して、作業を進めます。

CentOS 向け設定

```
#=== OSファイアウォールの設定
# Configure Linux Firewall
# --- CAUTION --- Change to deny access from public address
iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
#iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -s 0.0.0.0/0 -d 0.0.0.0/0 -p all -j REJECT
service iptables save
```
 
Ubuntu 向け設定

```
#=== OSファイアウォールの設定
# Configure Linux Firewall
# --- CAUTION --- Change to deny access from public address
ufw allow from 10.0.0.0/8
echo y | ufw enable
```

このような内容のスクリプトを、HTTPまたはHTTPS経由でダウンロード可能な場所に設置します。GitHubはHTTPSが無料で使えるので、おすすめです。

HTTPとHTTPSの違いは、自動実行されるかどうかです。HTTPで指定したスクリプトは、注文後に自動実行されず、「/root/」ディレクトリの中にスクリプトが設置されるだけです。対してHTTPSで指定した場合は、実行も自動的に行われます。

動作確認は、ブラウザからスクリプトが参照可能かどうかで行えます。次のサンプル・スクリプトでは、ファイアウォールの設定のほか、SSHのパスワード認証の禁止、デフォルトの言語設定を日本語へ変更も行っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604778/a07b0902-5a4f-2d5f-e084-4238bde30fc1.png)


サンプルのスクリプトをコピーし、パッケージの登録など、セットアップ後に手動で行う作業をまとめておくと便利です。

プロビジョニング・スクリプトの登録
メニューバーの「デバイス」から「管理」を選び、「プロビジョニング・スクリプト」を選択すると、スクリプトの一覧画面に移ります。それから、「プロビジョニング・スクリプトの追加」をクリックして、スクリプトの追加を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604778/dc63be99-dfea-17d1-ccf6-03274707282d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604778/2d3dee76-b923-a471-5973-2303f8d353ea.png)


「名前」は、スクリプトの名前を記入します。
「URL」は、スクリプトのURLを記入します。
記入後は「Add」をクリックして登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604778/81f1796d-cd24-582b-24e6-45ca9f8992ee.png)


サーバー注文時にスクリプトを実行
サーバー注文時（注文フォーム2ページ目の最終確認画面）、サーバーのスペック等やホスト名称を登録する画面に「プロビジョン・スクリプト」という項目があります。ここで、登録済みのスクリプト名を選びます。あとは、適用されるURLを確認し、注文を進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604778/e92a56d5-5e8f-f938-7981-751db579af9c.png)


サーバーの注文が終わった後、サーバーにログインして動作確認をします。プロビジョニング・スクリプトが実行されていますので、インターネットからログインすることはできません。VPNに接続し、プライベート・ネットワークからログインします。

ログイン後、「date」コマンドを実行すると、ログイン直後にタイムゾーンが切り替わっていることがわかります。通常は「JST」ではなく「CDT」が表示されます。

[root@web1 ~]# date
2014年  9月 29日 月曜日 16:20:51 JST


次に、rootディレクトリ内で「ls」を実行すると、実行可能な形式でファイルが置かれていることがわかります。このファイル内容は、自動的に展開されたプロビジョニング・スクリプトです。

[root@web2 ~]# ls -l /root/
total 4
-rwx--x--x 1 root root 85 Sep 16 15:43 post_install.NRvP

ファイルは不要ですので、削除しても構いません。
 

プロビジョニング・スクリプトの応用
プロビジョニング・スクリプトは、決まり切った処理をするだけではなく、パラメータを渡すことによって、複雑な作業も行えます。

先ほどのスクリプトは、インターネット側からのアクセスを全て禁止しました。環境によって、HTTPやHTTPSを公開させたいときもあります。ルールを変更する度にプロビジョニング・スクリプトを作成するのは手間です。

問題解決のために、パラメータとして公開を許可するポート番号をスクリプトに渡す方法があります。それが注文時に指定する「metadata」の項目です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604778/66ad3a0f-73a1-d2d8-2d10-af3c7f3438e3.png)


画面のように、公開ポート番号の指定があれば、iptablesでルールを追加することも簡単です。metadataで入力した値を受け取り、iptablesで許可するには、次のようにします。
 

```
#=== OSファイアウォールの設定
# Configure Linux Firewall
# --- CAUTION --- Change to deny access from public address
iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

# metadata の取得
curl -v https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/UserMetadata.txt > /root/UserMetadata.txt

# iptables に公開ポートの設定を反映
if [ -e /root/UserMetadata.txt ]; then
    cat /root/UserMetadata.txt | xargs -I{} /sbin/iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport {} -j ACCEPT
fi

iptables -A INPUT -s 0.0.0.0/0 -d 0.0.0.0/0 -p all -j REJECT
service iptables save
```


iptablesのルール設定のほか、パッケージの自動組み込みなど、環境によって替わる可能性があるものは、このようにパラメータを組みあわせた応用をすると便利です。