Amazon Linux 2023 でユーザーデータを利用して静的ホスト名を設定してみた
はじめに
テクニカルサポートの 片方 です。
今回は、Amazon Linux 2023 の EC2 インスタンスでユーザーデータを利用して静的ホスト名を設定する方法を試してみました。
静的ホスト名を設定することで、例えば ip-10-x-xx-0.ap-northeast-1.compute.internal で出力されていたログを、test-server-インスタンス ID といった設定した静的ホスト名に変更可能です。
手動で変更する方法については、以下をご参照ください。
やってみた
Amazon Linux 2023 の EC2 インスタンスで利用するユーザーデータは以下です。
#!/bin/bash
set -euo pipefail
LOG_FILE="/var/log/user-data-hostname.log"
exec > >(tee -a "${LOG_FILE}" | logger -t user-data-hostname -s 2>/dev/console) 2>&1
METADATA_IP="169.254.169.254"
OVERRIDE_CFG="/etc/cloud/cloud.cfg.d/99-preserve-hostname.cfg"
echo "=== start user-data ==="
# IMDSv2 token
TOKEN="$(curl -fsS -X PUT "http://${METADATA_IP}/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600")"
# instance-id
INSTANCE_ID="$(curl -fsS \
-H "X-aws-ec2-metadata-token: ${TOKEN}" \
"http://${METADATA_IP}/latest/meta-data/instance-id")"
# hostname は小文字推奨
HOSTNAME="test-server-${INSTANCE_ID}"
echo "INSTANCE_ID=${INSTANCE_ID}"
echo "HOSTNAME=${HOSTNAME}"
# --------------------------------------------------
# preserve_hostname を確認し、false なら true に更新
# --------------------------------------------------
UPDATED=0
declare -a CFG_FILES
CFG_FILES=("/etc/cloud/cloud.cfg")
shopt -s nullglob
for f in /etc/cloud/cloud.cfg.d/*.cfg; do
CFG_FILES+=("$f")
done
shopt -u nullglob
for cfg in "${CFG_FILES[@]}"; do
[[ -f "${cfg}" ]] || continue
if grep -qiE '^[[:space:]]*preserve_hostname:[[:space:]]*false([[:space:]]|$)' "${cfg}"; then
echo "found preserve_hostname: false in ${cfg} -> update to true"
sed -i -E 's/^[[:space:]]*preserve_hostname:[[:space:]]*false([[:space:]]|$)/preserve_hostname: true/' "${cfg}"
UPDATED=1
fi
done
# どこにも true が無ければ override ファイルを作成
if ! grep -RqsE '^[[:space:]]*preserve_hostname:[[:space:]]*true([[:space:]]|$)' \
/etc/cloud/cloud.cfg /etc/cloud/cloud.cfg.d 2>/dev/null; then
echo "preserve_hostname: true not found -> create ${OVERRIDE_CFG}"
cat > "${OVERRIDE_CFG}" <<'EOF'
preserve_hostname: true
EOF
UPDATED=1
fi
if [[ "${UPDATED}" -eq 0 ]]; then
echo "preserve_hostname is already true"
fi
echo "current preserve_hostname settings:"
grep -RnsE '^[[:space:]]*preserve_hostname:' /etc/cloud/cloud.cfg /etc/cloud/cloud.cfg.d 2>/dev/null || true
# --------------------------------------------------
# hostname 設定
# --------------------------------------------------
hostnamectl set-hostname "${HOSTNAME}"
echo "hostnamectl result:"
hostnamectl
echo "/etc/hostname:"
cat /etc/hostname
echo "=== end user-data ==="
※ 適宜修正してください。
※ HOSTNAME="test-server-${INSTANCE_ID}" でお好みの 静的ホスト名に変更してください。
確認してみた
EC2 インスタンスが起動したら、設定できているか確認します。

hostnamectl コマンドで確認します。

sudo nano /etc/cloud/cloud.cfg コマンドで、preserve_hostname 値が true であるか確認します。

ログにホスト名が反映されているか確認します。
$ journalctl | head -20
sh-5.2$ journalctl | head -20
Hint: You are currently not seeing messages from other users and the system.
Users in groups 'adm', 'systemd-journal', 'wheel' can see all messages.
Pass -q to turn off this notice.
May 02 04:53:02 test-server-i-0531a2f69fcbc4b2c sudo[1828]: ssm-user : TTY=pts/0 ; PWD=/usr/bin ; USER=root ; COMMAND=/usr/bin/nano /etc/cloud/cloud.cfg
May 02 04:53:03 test-server-i-0531a2f69fcbc4b2c sudo[1828]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1001)
May 02 04:53:16 test-server-i-0531a2f69fcbc4b2c sudo[1828]: pam_unix(sudo:session): session closed for user root
May 02 04:59:57 test-server-i-0531a2f69fcbc4b2c sudo[2033]: ssm-user : TTY=pts/0 ; PWD=/usr/bin ; USER=root ; COMMAND=/usr/bin/nano /etc/cloud/cloud.cfg
May 02 04:59:57 test-server-i-0531a2f69fcbc4b2c sudo[2033]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1001)
May 02 05:04:41 test-server-i-0531a2f69fcbc4b2c sudo[2033]: pam_unix(sudo:session): session closed for user root
sh-5.2$
ログのホスト名が想定通りであることが確認できました。
成功ですね。
まとめ
本ブログが誰かの参考になれば幸いです。
参考資料
- Amazon Linux 2023 で静的ホスト名を設定してみた | DevelopersIO
- ユーザーデータ入力を使用して EC2 インスタンスを起動するときにコマンドを実行する - Amazon Elastic Compute Cloud
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました






