AmazonLinux起動時にタイムゾーン、ホスト名、ディスク拡張、アップデートを実施する方法(cloud init、user data)
<スポンサードリンク>
最近AWSでAmazonLinuxを利用する機会が増えてきました。(というか毎日使ってる。。。)
AWSはEC2インスタンスを起動すると、デフォルトで下記のような制約があります。
などなど。
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」をクリック。
そうすると入力する画面がでてくる。
そこにUser Dataを流し込みます。
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]
みればなんとなくわかると思いますが、
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にまかせてしまうのもありだと思います。