cloud-initを使ってホスト名を動的に設定したい
運用上、EC2インスタンスはstart/terminateしかしない。
これは、以前の記事で書いた構成のためである。
ホスト名を変えたいのは以下の点で困るから。
- Datadogに表示されるhostnameを分かりやすい物に変えたい
- Fluentdでoutputするレコードにhostnameをappendしているため、分かりやすい物に変えたい
何故cloud-initを使うのか
userdataを使わずにスクリプト置いてcloud-initから実行したい。
userdataでも出来る。出来るけど、userdataには極力何も置かない方針としたかった。
userdataに色々書くと追々混沌とするだろうなぁという恐怖があった。
設定後のイメージ
EC2.TagName-EC2.instance_id-EC2.private_ip_address
こんな形式でホスト名を設定したい。
cloud-initで設定するには
こうする。
/var/lib/cloud/scripts/per-boot/00_hostname.sh
readonly AWS_REGION="ap-northeast-1"
ip_address=$(/bin/curl -s http://169.254.169.254/latest/meta-data/local-ipv4 | sed -e "s/\./-/g")
instance_id=$(/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id)
tag_name=$(aws --region ${AWS_REGION} ec2 describe-instances \
--instance-id ${instance_id} \
--query 'Reservations[].Instances[].Tags[?Key==`Name`].Value' \
--output text)
hostname ${tag_name}-${instance_id}-${ip_address}
hostnamectl set-hostname ${tag_name}-${instance_id}-${ip_address}
exit 0
※実際にはこれをAnsibleで管理していて、マシンに置いている。