人生やまあり

大学卒業後IT会社に就職してITをやってます。

AmazonLinux起動時にタイムゾーン、ホスト名、ディスク拡張、アップデートを実施する方法(cloud init、user data)


<スポンサードリンク>

最近AWSでAmazonLinuxを利用する機会が増えてきました。(というか毎日使ってる。。。)

AWSはEC2インスタンスを起動すると、デフォルトで下記のような制約があります。

  • ホスト名がIPを連結した文字列になる(例えばip-10.10.0.10)
  • タイムゾーンUTCになる。
  • EBSのディスクを大きいサイズに設定してもOS上は拡張されていないように見える。

などなど。

EC2インスタンスを起動する時に設定を自動化出来るcloud-initを使うと、起動時に指定した初期設定を自動化することができます。
Cloud-initはもともとUbuntuが由来のソフトウェアですが、Amazon Linuxでも標準でインストールされております。インスタンスの自動構築だとChefやPuppetも最近では人気ですが、簡単な設定であれば記述方法がシンプルで準備のいらないCloud-initが便利でお勧めです。



Cloud initを利用するために、User Dataを利用してスクリプトを流し込みます。

Cloud initを利用したUser Dataの設定方法

User Dataはマネジメントコンソールで設定することができます。入力するのは下記の通り「Step3. Configure Instance Details」。
はじめは入力するところが隠れているので、「Advanced Details」をクリック。

f:id:lance104:20140307164148j:plain

そうすると入力する画面がでてくる。

f:id:lance104:20140307164234j:plain

そこにUser Dataを流し込みます。

f:id:lance104:20140307164150j:plain

User Dataに流し込むスクリプト

User Dataに流し込んでいるスクリプトは下記の通りです。

#cloud-config
runcmd:
 - [ echo, 'Setting time zone' ]
 - [ cp, /usr/share/zoneinfo/Asia/Tokyo, /etc/localtime]
 - [ echo, 'Extend disk size' ]
 - [ resize2fs, /dev/xvda1]
 - [ echo, 'Setting custom hostname' ]
 - [ sed, -i, 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=MyName/g', /etc/sysconfig/network ]
 - [ hostname, 'MyName' ]
 - [ echo, 'Update All packages' ]
 - [ yum, -y, update]

みればなんとなくわかると思いますが、

  • タイムゾーンの設定
  • ディスクの拡張
  • ホスト名設定
  • yumのアップデートを実施しています。




Cloud initが問題なくうごいているか確認

では実際に実行したマシンにログインしてみましょう。

# ssh ec2-user@54.XXX.XXX.XXX -i .ssh/XXXXXXX.pem
Last login: Fri Mar  7 07:35:53 2014 from XXXX

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.09-release-notes/
[ec2-user@MyName ~]$

!!!!!
ホスト名は設定通り「MyName」になっていますね。念のため/etc/sysconfig/networkを確認してみましょう。

[ec2-user@MyName ~]$ cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=MyName
NOZEROCONF=yes
NETWORKING_IPV6=no
IPV6INIT=no
IPV6_ROUTER=no
IPV6_AUTOCONF=no
IPV6FORWARDING=no
IPV6TO4INIT=no
IPV6_CONTROL_RADVD=no
[ec2-user@MyName ~]$

うんうん、いい感じ。
EBSのデフォルトサイズ8GBから20GBに設定した状態も見てみましょう。

[ec2-user@MyName ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       20G  1.2G   19G   6% /
tmpfs           298M     0  298M   0% /dev/shm
[ec2-user@MyName ~]$

こちらもいい感じですね。
ではつぎタイムゾーン

[ec2-user@MyName ~]$ date
Fri Mar  7 16:55:35 JST 2014
[ec2-user@MyName ~]$

こちらもいい感じ。

実際に起動した実行されたログ

Cloud initを利用して自動書記実行されたログは/var/log/cloud-init.logに保存されます。
実際に上記のUser Dataを流し込んだログを見てみましょう。

[ec2-user@MyName ~]$ cat /var/log/cloud-init.log
[CLOUDINIT] 2014-03-07 07:34:06,399 - cloud-init[INFO]: cloud-init start-local running: Fri, 07 Mar 2014 07:34:06 +0000. up 20.74 seconds
[CLOUDINIT] 2014-03-07 07:34:06,467 - __init__.py[DEBUG]: found data source ec2

<省略>

[CLOUDINIT] 2014-03-07 07:34:48,924 - cloud-init-run-module[INFO]: cloud-init-run-module ['once-per-instance', 'user-scripts', 'execute', 'run-parts', '/var/lib/cloud/data/scripts']
[CLOUDINIT] 2014-03-07 07:34:48,932 - __init__.py[DEBUG]: restored from cache type DataSourceEc2
/var/lib/cloud/data/scripts/runcmd:

Setting time zone
Extend disk size
resize2fs 1.42.3 (14-May-2012)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/xvda1 is now 5242880 blocks long.

Setting custom hostname
Update All packages
Loaded plugins: priorities, update-motd, upgrade-helper
Resolving Dependencies
--> Running transaction check
---> Package aws-amitools-ec2.noarch 0:1.4.0.9-2.0.amzn1 will be updated

<省略>

  python-jmespath.noarch 0:0.2.1-1.0.amzn1
  python26.x86_64 0:2.6.9-1.43.amzn1
  python26-libs.x86_64 0:2.6.9-1.43.amzn1
  sudo.x86_64 0:1.8.6p3-12.17.amzn1
  unzip.x86_64 0:6.0-1.8.amzn1

Complete!
[ec2-user@MyName ~]$

バッチリですね。
毎回EC2インスタンス作成する度に、タイムゾーンやresize2fs、ホスト名、yumのupdateは面倒臭いので、cloud initにまかせてしまうのもありだと思います。