EC2インスタンスのhostnameを永続変更する方法|Amazon Linux 2・2023対応の手順と注意点

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, Linuxサーバー構築(Rocky Linux/RHEL9) > EC2インスタンスのhostnameを永続変更する方法|Amazon Linux 2・2023対応の手順と注意点
「EC2インスタンスを再起動したらホスト名が元に戻ってしまった」
そういうトラブルに直面したことはありませんか。

一般的な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を使った動的命名が正解


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜ 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/
Amazon Linux 2023 では、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

Linux DNS 設定の基本と同様に、サーバーのアイデンティティを正しく管理することはインフラ運用の基本です。ホスト名の変更は見た目だけの問題ではなく、ログ管理・監視ツールの識別にも影響します。

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

「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 の起動テンプレートの User Data に設定することで、各インスタンスが起動時に一意のホスト名を自動取得します。

タグを使ったホスト名の設定

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 インスタンスに ec2:DescribeTags 権限を持つ IAM ロールが必要です。

トラブルシュート

再起動後もホスト名が戻ってしまう

preserve_hostname: true を設定したにもかかわらず再起動後に戻ってしまう場合、以下を確認します。

/etc/cloud/cloud.cfgpreserve_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.cfgpreserve_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
EC2 の運用ではホスト名の永続化は基礎中の基礎です。特に複数台構成や Auto Scaling を使う場合は、インスタンスごとに一意のホスト名を自動設定する仕組みを最初から組み込んでおくことを強くおすすめします。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Linux無料マニュアルを受け取る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。