[GCE] Startup ScriptsでVMインスタンスを自動構成する

 Cloud, GCE

ども、takiponeです。
前回は、VMインスタンスからイメージを作成する方法をご紹介しました。イメージと上手く組み合わせることでVMインスタンスの管理でに役立つ機能として、ここではStartup Scriptsをご紹介します。

Startup Scriptsとは

Startup Scriptsは、VMインスタンスの起動時に所定のコマンドを自動実行する仕組みです。Amazon EC2のユーザーデータを読み込んで実行するCloud-initと同様、GCEのVMインスタンス専用のツールによってStartup Scriptsが実行されます。

イメージとStartup Scriptsの組み合わせは、Amazon EC2の以下の例がわかりやすいです。

ミドルウェアの基本的な構成ができているイメージに加えて、Startup Scriptsによって設定ファイル、スクリプトの配置や設定コマンドの実行などと組み合わせると使いやすいと思います。

今回はお試しとして、ドキュメントにあるApacheのインストールとサンプルファイルの配置をStartup Scriptsで試してみます。

設定方法

まずは、実行したい内容を含むテキストファイルを通常のシェルスクリプトと同様の形式で作成します。

例: install-apache.sh

#! /bin/bash
# Installs apache and a custom homepage

apt-get update  
apt-get install -y apache2  
cat <<EOF > /var/www/index.html  
<html><body><h1>Hello World</h1>  
<p>This page was created from a simple startup script!</p>  
</body></html>  
EOF  

Startup Scriptsを指定してのVMインスタンス作成はDeveloper Consoleではサポートされていないため、VMインスタンスを作成するgcutil addinstanceコマンドに--metadata_from_fileオプションを付加しスクリプトファイルを指定します。今回はVMインスタンス名をsimple-apacheとしました。

$ gcutil addinstance simple-apache --metadata_from_file=startup-script:install-apache.sh
Select a zone:  
1: asia-east1-a  
2: asia-east1-b  
3: europe-west1-a  (maintenance starts in 12 days)  
4: europe-west1-b  
5: us-central1-a  
6: us-central1-b  
7: us-central1-f  
>>> 1
Select a machine type:  
1: n1-standard-1    1 vCPU, 3.75 GB RAM  
2: n1-standard-16    16 vCPUs, 60 GB RAM  
3: n1-standard-2    2 vCPUs, 7.5 GB RAM  
4: n1-standard-4    4 vCPUs, 15 GB RAM  
5: n1-standard-8    8 vCPUs, 30 GB RAM  
6: n1-highcpu-16    16 vCPUs, 14.4 GB RAM  
7: n1-highcpu-2    2 vCPUs, 1.8 GB RAM  
8: n1-highcpu-4    4 vCPUs, 3.6 GB RAM  
9: n1-highcpu-8    8 vCPUs, 7.2 GB RAM  
10: n1-highmem-16    16 vCPUs, 104 GB RAM  
11: n1-highmem-2    2 vCPUs, 13 GB RAM  
12: n1-highmem-4    4 vCPUs, 26 GB RAM  
13: n1-highmem-8    8 vCPUs, 52 GB RAM  
14: f1-micro    1 vCPU (shared physical core) and 0.6 GB RAM  
15: g1-small    1 vCPU (shared physical core) and 1.7 GB RAM  
>>> 14
Select an image:  
1: XXXXXX  
2: XXXXXX  
3: projects/centos-cloud/global/images/centos-6-v20140718  
4: projects/coreos-cloud/global/images/coreos-alpha-394-0-0-v20140801  
5: projects/coreos-cloud/global/images/coreos-beta-367-1-0-v20140715  
6: projects/coreos-cloud/global/images/coreos-stable-367-1-0-v20140724  
7: projects/debian-cloud/global/images/backports-debian-7-wheezy-v20140718  
8: projects/debian-cloud/global/images/debian-7-wheezy-v20140718  
9: projects/opensuse-cloud/global/images/opensuse-13-1-v20140711  
10: projects/rhel-cloud/global/images/rhel-6-v20140718  
11: projects/suse-cloud/global/images/sles-11-sp3-v20140712  
>>> 7
INFO: Waiting for insert of instance simple-apache. Sleeping for 3s.  
  : (中略)
+---------------+---------------+-----------------+--------------+---------+
| name          | network-ip    | external-ip     | zone         | status  |
+---------------+---------------+-----------------+--------------+---------+
| simple-apache | 10.240.182.70 | XXX.XXX.XXX.XXX | asia-east1-a | RUNNING |
+---------------+---------------+-----------------+--------------+---------+

Table of operations:

+------------------------+--------+---------------------------+----------------+
| name                   | status | insert-time               | operation-type |
+------------------------+--------+---------------------------+----------------+
| operation-140704348530 | DONE   | 2014-08-02T22:24:45.874-0 | insert         |
| 2-4ffb2d71ffcf0        |        | 7:00                      |                |
| -fa025c8d-8e3c1210     |        |                           |                |
+------------------------+--------+---------------------------+----------------+
$

できました!作成したVMインスタンスに早速SSHで接続してみます。

$ gcutil ssh simple-apache
INFO: Zone for simple-apache detected as asia-east1-a.  
INFO: Running command line: ssh -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -o StrictHostKeyChecking=no -i /Users/ryuta/.ssh/google_compute_engine -A -p 22 ryuta@XXX.XXX.XXX.XXX --  
Warning: Permanently added 'XXX.XXX.XXX.XXX' (RSA) to the list of known hosts.  
Linux simple-apache 3.14-0.bpo.1-amd64 #1 SMP Debian 3.14.12-1~bpo70+1 (2014-07-13) x86_64

The programs included with the Debian GNU/Linux system are free software;  
the exact distribution terms for each program are described in the  
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent  
permitted by applicable law.  
ryuta@simple-apache:~$  

apache2パッケージの有無とapache2サービスがHTTPをListenしているかを確認します。

ryuta@simple-apache:~$ dpkg -l apache2  
Desired=Unknown/Install/Remove/Purge/Hold  
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                      Version           Architecture      Description
+++-=========================-=================-=================-=======================================================
ii  apache2                   2.2.22-13+deb7u3  amd64             Apache HTTP Server metapackage  
ryuta@simple-apache:~$ sudo netstat -ltp  
Active Internet connections (only servers)  
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 *:http                  *:*                     LISTEN      2714/apache2  
tcp        0      0 *:ssh                   *:*                     LISTEN      2027/sshd  
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      2027/sshd  
ryuta@simple-apache:~$  

ちゃんとインストールされ、サービスが起動していますね!

まとめ

GCEのVMインスタンスで利用できる、Startup Scriptsによる起動時の自動構成をご紹介しました。VMインスタンスの構築・運用に活用しましょう!

おまけ: 留意点

実際の構築・運用で利用するためには、以下の点に留意する必要があると思います。

  • 起動時に毎回実行される
  • スクリプトの実行ログは/var/log/startupscript.logファイルに記録される

初回起動時のみ実行したいという場合は、VMインスタンスのカスタム メタデータstartup-scriptを削除することで、次回起動時の実行を抑制することができます。[編集]リンクをクリックします。

「startup-script」の右にある[X]をクリックし、[保存]で完了です。

Startup Scriptsの実行ログは以下のように出力されます。

$ sudo cat /var/log/startupscript.log
Aug  3 12:33:29 simple-apache startupscript: Running startup script /var/run/google.startup.script  
Aug  3 12:33:30 simple-apache startupscript: Hit http://gce_debian_mirror.storage.googleapis.com wheezy Release.gpg  
Aug  3 12:33:30 simple-apache startupscript: Get:1 http://security.debian.org wheezy/updates Release.gpg [836 B]  
Aug  3 12:33:30 simple-apache startupscript: Get:2 http://ftp.debian.org wheezy-backports Release.gpg [836 B]  
Aug  3 12:33:30 simple-apache startupscript: Get:3 http://gce_debian_mirror.storage.googleapis.com wheezy-backports Release.gpg [836 B]  
:(中略)
Aug  3 05:26:33 simple-apache startupscript: Setting up apache2-mpm-worker (2.2.22-13+deb7u3) ...#015  
Aug  3 05:26:34 simple-apache startupscript: [....] Starting web server: apache2#033[?25l#033[?1c#0337#033[1G[#033[32m ok #03  
3[39;49m#0338#033[?25h#033[?0c.#015  
Aug  3 05:26:34 simple-apache startupscript: Setting up apache2 (2.2.22-13+deb7u3) ...#015  
Aug  3 05:26:34 simple-apache startupscript: Setting up ssl-cert (1.0.32) ...#015  
Aug  3 05:26:39 simple-apache startupscript: Finished running startup script /var/run/google.startup.script  

実際の起動メッセージを確認したい場合は、Developer Consoleからシリアルコンソールを表示することもできます。



次の記事 :

Google Compute Engineに新しいゾーンが追加されました!


前の記事 :

[GCE] VMインスタンスからイメージを作成する