そういうトラブルに直面したことはありませんか。
一般的なLinuxサーバーであれば hostnamectl コマンドで変更すれば永続化されますが、EC2では再起動後に cloud-init が動作してホスト名を上書きするため、同じ手順では解決しません。
この記事では、Amazon Linux 2 および Amazon Linux 2023 でホスト名を永続化する正しい方法を解説します。
cloud-init の設定ファイル(preserve_hostname)の書き方から、/etc/hosts の編集、Auto Scaling グループへの対応、User Data による自動化まで順番に説明します。
この記事のポイント
・EC2のホスト名が戻るのは cloud-init の上書き動作が原因
・cloud.cfg の preserve_hostname: true で永続化できる
・Amazon Linux 2 と 2023 では設定ファイルのパスが異なる
・Auto Scaling 環境ではインスタンスIDを使った動的命名が正解
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ EC2 のホスト名は再起動で元に戻るのか
一般的な物理サーバーや VM では、hostnamectl set-hostname を実行すると /etc/hostname に書き込まれ、再起動後もそのまま保持されます。EC2 では話が違います。インスタンスが起動するたびに cloud-init というツールが動作し、インスタンスメタデータ(
http://169.254.169.254/latest/meta-data/)からホスト名情報を取得して /etc/hostname を上書きします。デフォルトのホスト名は
ip-10-0-1-23.ap-northeast-1.compute.internal のようにプライベートIPを含む形式です。これが再起動のたびに復元されます。永続化するには「cloud-init に上書きさせない」設定を加える必要があります。その設定が
preserve_hostname です。Amazon Linux 2 での永続的なホスト名変更手順
Amazon Linux 2(RHEL7系)での手順を説明します。RHEL 9.4 / Amazon Linux 2 で動作確認済みです。1. hostnamectl でホスト名を設定する
まず通常通り hostnamectl でホスト名を変更します。# ホスト名を変更する $ sudo hostnamectl set-hostname web01.example.com # 変更を確認する $ hostnamectl Static hostname: web01.example.com Icon name: computer-vm Chassis: vm Machine ID: a1b2c3d4e5f6... Boot ID: f7e8d9c0b1a2... Virtualization: kvm Operating System: Amazon Linux 2 CPE OS Name: cpe:2.3:o:amazon:amazon_linux:2 Kernel: Linux 5.10.210-201.852.amzn2.x86_64 Architecture: x86-64
2. cloud-init の preserve_hostname を有効にする
この設定がなければ再起動時に cloud-init がホスト名を上書きします。# cloud.cfg を編集する $ sudo vi /etc/cloud/cloud.cfg # 以下の行を true に変更する(デフォルトは false) preserve_hostname: true
preserve_hostname はファイルの冒頭付近に記述されています。# 変更前 preserve_hostname: false # 変更後 preserve_hostname: true
3. /etc/hostname と /etc/hosts を確認する
hostnamectl の設定が正しく反映されているか確認します。# /etc/hostname の内容を確認する $ cat /etc/hostname web01.example.com # /etc/hosts を確認する $ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
/etc/hosts に自分のホスト名を追加することで、hostname -f(FQDN)コマンドが正しく動作するようになります。# /etc/hosts にエントリを追加する $ sudo vi /etc/hosts # 以下の行を追加する(プライベートIPに合わせる) 10.0.1.23 web01.example.com web01
4. 再起動して確認する
# 再起動する $ sudo reboot # 再起動後にSSH再接続してホスト名を確認する $ hostname web01.example.com $ hostname -f web01.example.com
ip-10-0-1-23.ap-northeast-1.compute.internal に戻らなければ成功です。Linux ポート確認の全コマンドの設定と同様、変更後は必ず確認コマンドで検証する習慣をつけましょう。Amazon Linux 2023 での差異と注意点
Amazon Linux 2023(RHEL9系)では、cloud-init の設定ファイルが一部異なります。設定ファイルの場所の違い
| OS | cloud-init 設定ファイル |
|---|---|
| Amazon Linux 2 | /etc/cloud/cloud.cfg |
| Amazon Linux 2023 | /etc/cloud/cloud.cfg(同じ) |
| 追加設定ディレクトリ | /etc/cloud/cloud.cfg.d/ |
cloud.cfg を直接編集する代わりに /etc/cloud/cloud.cfg.d/ 配下にドロップインファイルを作成する方式が推奨されています。これにより、OS更新で cloud.cfg が上書きされるリスクを避けられます。# Amazon Linux 2023 推奨の方法 $ sudo vi /etc/cloud/cloud.cfg.d/99-preserve-hostname.cfg # 以下の内容を記述する preserve_hostname: true
Amazon Linux 2023 での hostnamectl の動作
Amazon Linux 2023 ではhostnamectl の出力フォーマットが変わっています。# Amazon Linux 2023 での hostnamectl 出力例 $ hostnamectl Static hostname: web01.example.com Pretty hostname: web01.example.com Icon name: computer-vm Chassis: vm Machine ID: b2c3d4e5f6a7... Boot ID: c3d4e5f6a7b8... Virtualization: kvm Operating System: Amazon Linux 2023.7.20250101 Kernel: Linux 6.1.128-136.201.amzn2023.x86_64 Architecture: x86-64
cloud-init 設定(preserve_hostname)の詳細
preserve_hostname の動作原理
preserve_hostname: true を設定すると、cloud-init の起動シーケンスで「set_hostname」モジュールがスキップされます。具体的には以下の動作になります。・false(デフォルト):起動のたびにメタデータからホスト名を取得して上書き
・true:既存の
/etc/hostname の内容を維持して上書きしない設定が正しく機能しているか確認するには cloud-init のログを見ます。
# cloud-init のログで hostname 設定を確認する $ sudo grep -i hostname /var/log/cloud-init.log 2026-05-12 10:00:01,234 - util.py[DEBUG]: Running module set_hostname 2026-05-12 10:00:01,234 - util.py[DEBUG]: preserve_hostname is set, skipping
update_hostname との違い
cloud.cfg にはpreserve_hostname と混同しやすい設定として update_hostname があります。| 設定 | 動作 |
|---|---|
preserve_hostname: true |
ホスト名の変更処理を完全にスキップ |
update_hostname: false |
modules に update_hostname が含まれない場合の制御 |
preserve_hostname: true が最もシンプルで確実な方法です。Auto Scaling グループでのホスト名設定
Auto Scaling グループでは複数のインスタンスが自動的に起動・終了するため、固定のホスト名を設定するのは不適切です。この場合はインスタンスIDを含む動的なホスト名を User Data で自動設定するのが実務的な方法です。User Data でホスト名を動的に設定する
#!/bin/bash # Auto Scaling 向けの動的ホスト名設定スクリプト INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/region) HOSTNAME="web-${INSTANCE_ID}.${REGION}.internal" # ホスト名を設定する hostnamectl set-hostname "${HOSTNAME}" # /etc/hosts に追記する PRIVATE_IP=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4) echo "${PRIVATE_IP} ${HOSTNAME}" >> /etc/hosts # preserve_hostname を設定する cat > /etc/cloud/cloud.cfg.d/99-preserve-hostname.cfg << EOF preserve_hostname: true EOF
タグを使ったホスト名の設定
EC2 タグを使ってホスト名を管理する方法もあります。インスタンスにName タグを設定して、そのタグ値をホスト名に使います。#!/bin/bash # AWS CLI でタグからホスト名を取得する INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/region) # Name タグの値を取得する NAME_TAG=$(aws ec2 describe-tags \ --filters "Name=resource-id,Values=${INSTANCE_ID}" \ "Name=key,Values=Name" \ --region "${REGION}" \ --query 'Tags[0].Value' \ --output text) if [ "${NAME_TAG}" != "None" ] && [ -n "${NAME_TAG}" ]; then HOSTNAME=$(echo "${NAME_TAG}" | tr '[:upper:]' '[:lower:]' | tr ' ' '-') hostnamectl set-hostname "${HOSTNAME}" fi
ec2:DescribeTags 権限を持つ IAM ロールが必要です。トラブルシュート
再起動後もホスト名が戻ってしまう
preserve_hostname: true を設定したにもかかわらず再起動後に戻ってしまう場合、以下を確認します。・
/etc/cloud/cloud.cfg の preserve_hostname が正しく true になっているか・cloud-init キャッシュが残っていないか
# cloud-init のキャッシュを確認する $ sudo ls -la /var/lib/cloud/instances/ # 設定が反映されているか確認する $ sudo grep preserve_hostname /etc/cloud/cloud.cfg preserve_hostname: true # cloud-init のログでエラーを確認する $ sudo tail -50 /var/log/cloud-init.log | grep -i error
hostname -f が正しいFQDNを返さない
/etc/hosts の設定が不足している場合に発生します。# 現在の FQDN を確認する $ hostname -f hostname: Name or service not known # /etc/hosts を確認する $ cat /etc/hosts 127.0.0.1 localhost # プライベートIPとFQDNを追加する $ echo "10.0.1.23 web01.example.com web01" | sudo tee -a /etc/hosts # 再確認する $ hostname -f web01.example.com
AMI 作成後のインスタンスでホスト名が引き継がれてしまう
AMI(Amazon Machine Image)を作成してその AMI から新しいインスタンスを起動した場合、元のインスタンスのホスト名が残ってしまうことがあります。AMI 作成前に cloud-init のキャッシュをクリアするのが正解です。
# AMI 作成前に cloud-init のデータをリセットする $ sudo cloud-init clean --logs # または手動でキャッシュディレクトリを削除する $ sudo rm -rf /var/lib/cloud/instances $ sudo rm -rf /var/lib/cloud/data # /etc/hostname もクリアしておく(任意) $ sudo truncate -s 0 /etc/hostname
cloud-init clean を実行してから AMI を作成することで、新しいインスタンス起動時に cloud-init が正しくホスト名を設定します。systemd-analyze で起動時間計測の手法と同様に、起動シーケンス全体を把握することが正確なトラブルシュートにつながります。本記事のまとめ
EC2 インスタンスでホスト名を永続化するには、hostnamectl だけでなく cloud-init の設定変更が必要です。| やりたいこと | 設定・コマンド |
|---|---|
| ホスト名の変更 | sudo hostnamectl set-hostname ホスト名 |
| cloud-init の上書きを防ぐ | /etc/cloud/cloud.cfg の preserve_hostname: true |
| Amazon Linux 2023 推奨方法 | /etc/cloud/cloud.cfg.d/99-preserve-hostname.cfg に追記 |
| FQDN の正常動作 | /etc/hosts にプライベートIP+FQDNを追記 |
| Auto Scaling での動的設定 | User Data でインスタンスIDを取得して hostnamectl を呼ぶ |
| AMI 作成前のリセット | sudo cloud-init clean --logs |
Linux無料マニュアルを受け取る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます