雑多なインフラエンジニア日記

技術ブログでっす~

EC2 User Data について (色々自動設定してみるの巻)

今までEC2を何気なく作成していましたが、そろそろ「User Data」なるものを
使ってみようと思ったのでメモ。

これのことです。
f:id:jinjin252525:20130624223623j:plain

インスタンス起動時にやりたい処理(ホスト名設定など)をUser Dataに記述
しておけば、起動時に色々設定してくれる優れものです!

シェバン(#!/bin/bash)を先頭に書き、yum -y install httpd などと書いておくと
Apacheがインストールされます。

#!/bin/bash
yum -y install httpd


的な。。

ここまではよくある話で、そもそも、んなもん、Apacheインストール済みのAMI
作成しとけばー!?、と色々な記事を見て思っておりました。

それはさておき、個人的に面倒くさいのは、インスタンス起動後のホスト名設定とDNS設定。

これを実現するUser Dataを作ってみました。

前提

・/etc/bashrc、~/.bash_profile に AWS関連の環境変数が記述してあること。
http://xoxo-infra.hatenablog.com/entry/2013/02/08/013002

VPCを使っていること。

・R53でプライベートIPを管理していること。
http://xoxo-infra.hatenablog.com/entry/2013/02/12/221955

・route53 コマンドがインストールされていること。
http://xoxo-infra.hatenablog.com/entry/2013/02/28/195446

・インターネットに出れること(NATサーバ経由でも可)
※R53はインターネット経由でアクセスする為。

となります。

設定するUser Data

#!/bin/sh

HOST=web001

# ENV
DOMAIN_ID=XXXXXXXXXXXXXXXX
WORK_DIR=/home/user
LOG=${WORK_DIR}/init.log
. /etc/bashrc
. ${WORK_DIR}/.bash_profile
CFG=/etc/sysconfig/network

# HostName
/bin/cp -p ${CFG} ${CFG}.`date -I`
/bin/sed -e 's/HOSTNAME/#HOSTNAME/g' -e '/#HOSTNAME/a\HOSTNAME='${HOST}'' ${CFG}.`date -I` > ${CFG}
/bin/hostname ${HOST}

# Tag
INS_ID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id`
/opt/aws/bin/ec2-create-tags ${INS_ID} -t Name=${HOST} > ${LOG} 2>&1

# IP
IP=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/local-ipv4`
/usr/bin/route53 add_record ${DOMAIN_ID} ${HOST}.test.domain. A ${IP} 300 >> ${LOG} 2>&1

exit


HOST= は設定したいホスト名、
DOMAIN_ID= は管理しているプライベート用ドメインのID
${HOST}.test.domain. はプライベート用ドメイン名に
読み替えて下さい。

# HostName の箇所は、デフォルトで/etc/sysconfig/networkに設定されているHOSTNAMEを
コメントアウト、その後、コメントアウトした下の行に HOSTNAME=web001 を設定しています。

# Tag の箇所は、curlで自身のインスタンスIDを取得し、Nameタグにホスト名を付与しています。

# IP は同じく、curlで自身のプライベートIPを取得し、R53に登録しています。

見切れてますがこんな感じです。
f:id:jinjin252525:20130624223628j:plain


あとは通常通り、インスタンス作成すればホスト名&DNS設定が完了した状態で
起動されます!

curl -s http://169.254.169.254/latest/meta-data で自身の情報を色々取れるので、
自由度は高いですね。(というか便利!)

管理するインスタンス数が少ない場合、chefとかcapibaraとかでやる手間のほうが面倒
だったりするかと思うので、数台の管理には使えるかなぁ。。

・参考
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
http://understeer.hatenablog.com/entry/2012/07/19/123050

以上です。