🔰1.検証の前提と背景
AWSでは、Elastic IP(グローバルIP)は簡単に付け替えられますが、プライベートIPの再利用には制限があります。
EC2を起動した際に割り当てられるプライベートIP(プライマリ)は、EC2本体アタッチされているプライマリENI(eth0)に紐づいており、再利用できない、いやできる? と言う点で論争になりました。
今回の目的は以下のようなパターンが できるのかどうか を検証することです。
旧EC2インスタンスのプライマリIPを新しいEC2インスタンスにそのまま再利用できるのか?
検証に使用した構成は以下の通りです:
- 旧EC2(test_01 / RHEL 9)のAMIから新EC2(test_02 & test_03 / RHEL 9)を作成
- 旧EC2と同じVPC、サブネットで新EC2を作成
- Elastic IP、パブリックIPなし(プライベートIPのみ)
⚙️2.検証した手順
❌️方法①:旧EC2のENIをそのまま新EC2に移す ※旧EC2は削除しない前提
- 旧EC2(test_01)を停止 ※削除はしないこと!
- 対象のENI(ネットワークインターフェース = eth0 = 10.0.6.196)をデタッチ
- 新EC2(test_02)をAMIから起動(test_02と同じVPC、サブネットを選択)
- 旧EC2(test_01)のENIを新EC2(test_02)にアタッチ
- 起動して確認!
→ 結果:上記2の時点でアウト。
旧EC2を存在する限り、元から付いているENI(eth0)と一体化しているプライマリIPを解放する術はなさそう。
CLIでも不可能。


AWS様「ENIのeth0はお前の体そのものや、外せると思うな」ってことらしいです。
⭕️方法②:旧EC2にセカンダリIPを追加し、それを新EC2に移動できるか検証
- 旧EC2(test_01)を停止 ※削除はしないこと!
- あらかじめ作成していたENIをアタッチしてセカンダリIP(10.0.6.197)を旧EC2に追加
- 旧EC2(test_01)から上記2でアタッチした2つ目のENIをデタッチ
- 元から付いていた1つ目のENI(プライマリIP)は絶対に外すことはできない
- 旧EC2(test_01)のAMIから新EC2(test_02)を起動する際、上記3で外したENIを指定して起動
- この方法だと指定したENIがプライマリになる
- ENIを指定しないで新EC2を起動し、あとでENIをアタッチするとそれがセカンダリENIになる
→ 結果:成功
セカンダリIPであれば再割り当て可能。(同じVPC、サブネット上のEC2に限る。)

AWS様の公式ドキュメントにも明記されている機能。
⭕️方法③:旧EC2を完全に削除後、新EC2を旧EC2のIPで起動
- 旧EC2(test_01)を削除
- EC2(test_01)にアタッチされていたENIも削除される
- 旧EC2(test_01)のAMIから新EC2(test_03)を起動する際、旧EC2(test_01)のIPアドレスを指定して起動
→ 結果:成功
旧EC2削除済みなら問題なく同じIPアドレスが使い回せる。(ENIは変わる。)


🎯3.まとめ
他にも様々な方法があるかもしれませんが、今回の検証結果をまとめると以下のとおりです。
✅️ eth0のプライマリENIは、元EC2が存在する限り絶対に外せない。
どんな強引な手を使ってもデタッチ不可。AWSの仕様。
✅️元のEC2を残したまま「IPを移行したい」なら、やり方は以下のどちらになる。
・元EC2にセカンダリENIをアタッチして、そのENIごと移動する。
・もしくはセカンダリIPを 別のENIに付け替える。
→最初から「移動したいIPはセカンダリにする」設計がベストプラクティス!
✅️元のEC2を完全に「削除」していいなら、悩まなくて済む。
身も蓋もないですが、そのような仕様です。
📚 4.参考記事
以下、参考記事などです。
- AWS公式:AssignPrivateIpAddresses API
- AWS re:Post:https://repost.aws/ja/knowledge-center/ec2-change-primary-ip
- StackOverflow:プライベートIPの再割当
- ServerFault:ENIを使った移動
🐥 5.ひとこと
検証の中で一番ハマったのは「プライマリIPを外して他のインスタンスで使う」という部分です。
できそうでできない罠でした!
同じような検証をする人の一助になれば幸いです。
以上
コメント