Last Modified:
インスタンス起動時にホスト名を設定する #AWS
(AWSの中でもCloudFormationネタ)
インスタンス起動時にホスト名を設定したい。 巷では「起動後にゴニョゴニョ手作業で設定してAMIを作っておく」みたいなのを良く見かけるけど、 なるべくAMI管理はしたくないので真っさらなAmazon LinuxのAMIから作りたい。
解決
cloud-initを使えば起動時に設定できる。
Bastion:
Type: AWS::EC2::Instance
Properties:
UserData: !Base64 |
#cloud-config
preserve_hostname: false
hostname: bastion.internal
# manage_etc_hosts: true
知見
- cloud-initはAWS固有のものではない
- Amazon Linux(2016.09.1 - ami-56d4ad31)の場合は
/usr/lib/python2.7/dist-packages/cloudinit/
以下にソースがあるので、それを読むと良く分かる。 - 実行時ログは
/var/log/cloud-init.log
と/var/log/cloud-init-output.log
で見れる
- Amazon Linux(2016.09.1 - ami-56d4ad31)の場合は
UserData:
にシェルスクリプトやcloud-init用の設定が書けるUserData: !Base64 |
のイディオムを使うと楽- 書ける設定内容 :: Modules — Cloud-Init 0.7.9 documentation
- 実行順序 :: Amazon Linuxのcloud-initの実行順番を確認する | Developers.IO
- マルチパートを使って両方書くことも可能っぽい :: cloud-initでシェルスクリプトとcloud-configを同時に使う | Developers.IO
hostname:
の設定だけだと何もしてくれないのでpreserve_hostname:
をfalse
にしておくmanage_etc_hosts: true
で/etc/hostsをいじって127.0.0.1に解決してくれるようになる。 でも「localhostなら127.0.0.1、ホスト名なら10.x.y.zにしたい」とかやりたいならmanage_etc_hostsは設定しないほうが良い。
余談
JSONじゃなくてYAMLで書くべき。 関数の省略記法が使えるし、何よりコメントが自由に書ける。 何でみんなJSONで書くの?