Amazon Linux 2023 でユーザーデータを利用して静的ホスト名を設定してみた

Amazon Linux 2023 でユーザーデータを利用して静的ホスト名を設定してみた

2026.05.02

はじめに

テクニカルサポートの 片方 です。
今回は、Amazon Linux 2023 の EC2 インスタンスでユーザーデータを利用して静的ホスト名を設定する方法を試してみました。
静的ホスト名を設定することで、例えば ip-10-x-xx-0.ap-northeast-1.compute.internal で出力されていたログを、test-server-インスタンス ID といった設定した静的ホスト名に変更可能です。
手動で変更する方法については、以下をご参照ください。

https://dev.classmethod.jp/articles/ec2-al2023-set-static-hostname/

やってみた

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}" でお好みの 静的ホスト名に変更してください。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/user-data.html

確認してみた

EC2 インスタンスが起動したら、設定できているか確認します。
01

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

02

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

03

ログにホスト名が反映されているか確認します。

$ 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$

ログのホスト名が想定通りであることが確認できました。
成功ですね。

まとめ

本ブログが誰かの参考になれば幸いです。

参考資料

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

関連記事