:wq!

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

ども、takiponeです。

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

Startup Scriptsとは

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

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

クラウドのためのアーキテクチャ設計 - ベストプラクティス - from 玉川憲 (Ken Tamagawa) - Amazon Web Services

ミドルウェアの基本的な構成ができているイメージに加えて、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からシリアルコンソールを表示することもできます。