AmazonLinuxのECインスタンス起動時、cloud-initによりホスト名を[Nameタグ_インスタンスID_IPアドレス]に設定するメモになります。
EC2インスタンスを複数作成する場合、各インスタンスのホスト名にNameタグやインスタンスIDを付けて、操作対象のインスタンスを見分けやすくしたいといった事があるかと思います。EC2インスタンス起動時にホスト名を[Nameタグ_インスタンスID_IPアドレス]として設定するようにしたいと思います。
■概要
EC2インスタンス内の/var/lib/cloud/scripts/per-boot/配下にスクリプトを作成し、EC2インスタンスに設定しているTagsやmetadataからインスタンスIDやNameタグ等を取得し、EC2インスタンス起動の度、ホスト名を[Nameタグ_インスタンスID_IPアドレス]に設定します。
■EC2インスタンスに設定するNameタグとIAMポリシー例
EC2インスタンスのNameタグに、例えば「web-server-002」と設定します。
ホスト名変更対象のEC2インスタンスには、aws ec2コマンドで各種情報を取得できるよう以下のようなIAMポリシーを設定しておきます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource": "*"
}
]
}
■cloud-initにより実行するスクリプト
EC2インスタンス内に以下のようなスクリプトを作成します。
[ec2-user@ip-172-31-4-80 ~]$ hostname
ip-172-31-4-80
[ec2-user@ip-172-31-4-80 ~]$ sudo vi /var/lib/cloud/scripts/per-boot/001_setting_hostname.sh
#!/bin/sh
##### リージョン名を取得
REGION=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone/ | sed 's/.$//'`
##### インスタンス自身のインスタンスIDを取得
INSTANCE_ID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id`
##### インスタンス自身のIPアドレスを取得
IP_ADDRESS=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/local-ipv4`
##### Nameタグを取得
NAME_TAG=`/usr/bin/aws ec2 describe-instances --region ${REGION} --instance-ids ${INSTANCE_ID=} --query 'Reservations[].Instances[].Tags[?Key==\`Name\`].Value' --output text`
##### ホスト名の一部に設定するIPアドレスの.を-に変換
IP_ADDRESS=`echo ${IP_ADDRESS} | sed -e "s/\./-/g"`
##### ホスト名を変更する
INSTANCE_NAME="${NAME_TAG}_${INSTANCE_ID}_${IP_ADDRESS}"
hostname ${INSTANCE_NAME}
sed -i -e "s/^HOSTNAME=.*\$/HOSTNAME=${INSTANCE_NAME}/g" /etc/sysconfig/network
スクリプトに実行権限を付与します。
[ec2-user@ip-172-31-4-80 ~]$ sudo chmod 755 /var/lib/cloud/scripts/per-boot/001_setting_hostname.sh
[ec2-user@ip-172-31-4-80 ~]$
[ec2-user@ip-172-31-4-80 ~]$ ll /var/lib/cloud/scripts/per-boot/001_setting_hostname.sh
-rwxr-xr-x 1 root root 969 Dec 28 00:32 /var/lib/cloud/scripts/per-boot/001_setting_hostname.sh
[ec2-user@ip-172-31-4-80 ~]$
■EC2インスタンスのホスト名を変更
先のスクリプトを実行する、もしくはEC2インスタンスを再起動すると次回起動時にホスト名が変更されます。
[ec2-user@ip-172-31-4-80 ~]$ hostname
ip-172-31-4-80
[ec2-user@ip-172-31-4-80 ~]$ grep -i hostname /etc/sysconfig/network
HOSTNAME=localhost.localdomain
[ec2-user@ip-172-31-4-80 ~]$ sudo reboot
EC2インスタンスが起動すると、ホスト名が[Nameタグ_インスタンスID_IPアドレス]に設定されます。
[ec2-user@web-server-002_i-9b6f5f82_172-31-4-80 ~]$ hostname
web-server-002_i-9b6f5f82_172-31-4-80
[ec2-user@web-server-002_i-9b6f5f82_172-31-4-80 ~]$ grep -i hostname /etc/sysconfig/network
HOSTNAME=web-server-002_i-9b6f5f82_172-31-4-80
[ec2-user@web-server-002_i-9b6f5f82_172-31-4-80 ~]$
今回は/var/lib/cloud/scripts/per-boot/にスクリプトを配置して、EC2インスタンスを起動する度にホスト名を設定するようにしていますが、/var/lib/cloud/scripts/per-once/にスクリプトを配置して、EC2インスタンス初回起動時にホスト名を設定するのでも良いかもしれません。