概要
社内システムや監視サーバーのように、クライアントが プライベート IPv4 アドレスを直接指定して 接続している EC2 インスタンスは少なくありません。このインスタンスが故障したとき、スタンバイのインスタンスへ切り替えるには「同じ IP アドレスで、別のインスタンスが応答する」状態を作る必要があります。
EC2 のネットワーク接続の実体は、Elastic Network Interface(ENI、ネットワークインターフェイス) です。プライベート IP アドレスや MAC アドレス、セキュリティグループは、インスタンスではなく ENI が持っています。そのため、セカンダリ ENI をスタンバイのインスタンスに付け替えれば、IP アドレスごとトラフィックの行き先を移せます。
この記事では、ENI が持つ属性と付け替えの制約を整理し、Elastic IP アドレスや DHCP オプションセット、ロードバランサーとの違いを比べます。実践では、セカンダリ ENI をプライマリ役のインスタンスからスタンバイ役のインスタンスへ付け替え、同じプライベート IP アドレスのまま応答するホストが替わることを確かめます。

クラウドおさる猿山の見張り台の番号札は、見張り役の猿ではなく台そのものに付いているのでござる。今日は、その番号札(ENI)を倒れた見張りから控えの見張りへ掛け替えて、呼び出し番号を変えずに交代するところを確かめるでござるよ。
この記事のメリット
- ENI が持つ属性(プライベート IP アドレス・MAC アドレス・セキュリティグループなど)と、付け替えたときに何が引き継がれるかが分かる
- プライマリ ENI とセカンダリ ENI の違い、付け替えの制約(同じ AZ)を説明できるようになる
- プライベート IP のままのフェイルオーバーに、Elastic IP アドレス・DHCP オプションセット・ロードバランサーが向かない理由が分かる
- コンソールで ENI を作成・アタッチ・デタッチし、スタンバイへ切り替える手順を体験できる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。


クラウドおさる



はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。



基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説
ENI はネットワーク接続の実体
ENI は、VPC 内の仮想ネットワークカードを表すリソースです。インスタンスがネットワークにつながるときに使うアドレスや設定は、ENI の属性として保持されます。
| ENI が持つ属性 | 内容 |
|---|---|
| プライマリプライベート IPv4 アドレス | サブネットの IPv4 アドレス範囲から割り当てる |
| セカンダリプライベート IPv4 アドレス | 同じサブネットの範囲から追加できる |
| Elastic IP アドレス | プライベート IPv4 アドレスごとに 1 つ関連付けられる |
| セキュリティグループ | ENI 単位で付ける |
| MAC アドレス | ENI ごとに固定 |
| 送信元/送信先チェック | ENI ごとのフラグ |
ENI をインスタンスからデタッチして別のインスタンスにアタッチしても、これらの属性はそのまま保持され、ネットワークトラフィックは新しいインスタンスへ向かいます。
プライマリ ENI とセカンダリ ENI
すべてのインスタンスには、起動時に作られる プライマリ ENI(eth0)があります。これに加えて、セカンダリ ENI を追加でアタッチできます。
| 項目 | プライマリ ENI | セカンダリ ENI |
|---|---|---|
| 作られるタイミング | インスタンスの起動時 | 自分で作成してアタッチする |
| デタッチ | できない | 実行中・停止中のどちらでもできる |
| 別のインスタンスへの付け替え | できない | できる |
| アタッチできる先 | ― | 同じ AZ のインスタンス |
アタッチは、インスタンスの実行中(ホットアタッチ)、停止中(ウォームアタッチ)、起動時(コールドアタッチ)のいずれでもできます。ENI とインスタンスは同じ AZ にある必要があり、別の AZ のインスタンスには付け替えられません。





付け替えられるのはセカンダリ ENI だけで、プライマリ ENI はインスタンスから外せないのでござる。そして付け替え先は同じ AZ のインスタンスに限られるでござるぞ。隣の山の見張り台に札は掛けられぬのでござるな。
OS 側の設定
ENI をアタッチしたあと、インスタンスの OS がそのインターフェイスを認識して IP アドレスやルートを設定する必要があります。Amazon Linux と Windows Server は、ホットアタッチ・ウォームアタッチを自動で認識して設定します。それ以外の OS では、2 つ目のインターフェイスの起動、プライベート IPv4 アドレスの設定、ルートテーブルの変更を手動で行う場合があります。
なお、同じサブネットの ENI を 1 台のインスタンスに複数アタッチすると、非対称ルーティングなどの問題が起きることがあります。この記事では、付け替え用の ENI を、インスタンスのプライマリ ENI とは別のサブネット(同じ AZ)に置きます。
ほかの手段との違い
「障害時に、同じプライベート IP アドレスのまま別のインスタンスへ切り替える」という要件に対して、よく比べられる手段は次のとおりです。
| 手段 | できること | この要件に合うか |
|---|---|---|
| セカンダリ ENI の付け替え | プライベート IP アドレス・MAC アドレス・セキュリティグループごと別のインスタンスへ移す | 合う。ルートテーブルや DNS を変えずにトラフィックが移る |
| セカンダリプライベート IPv4 アドレスの付け替え | ENI に追加したセカンダリプライベート IPv4 アドレスだけを、別のインスタンスへ割り当て直す | 合う。ただし移るのはアドレスだけで、MAC アドレスやセキュリティグループは移らない |
| Elastic IP アドレスの付け替え | パブリック IPv4 アドレスを別のインスタンスへ移す | 合わない。プライベート IP アドレスでの接続は切り替わらない |
| DHCP オプションセット | VPC 内のインスタンスに配る DNS サーバー・ドメイン名・NTP サーバーなどを指定する | 合わない。特定のインスタンスに IP アドレスを割り当てる機能ではない |
| ロードバランサーの登録替え | ターゲットを入れ替えて、ロードバランサーの宛先を切り替える | 合わない。クライアントの接続先がロードバランサーのアドレスに変わる |
DHCP オプションセットで何を設定できるかは、DHCPオプションセットによるVPC内カスタムDNS設定で扱っています。
スタンバイへ移せるのは、ENI そのものか、セカンダリプライベート IPv4 アドレスです(両方を移すこともできます)。この記事では、MAC アドレスやセキュリティグループまでまとめて引き継げる ENI の付け替えを扱います。
ENI の付け替えは、障害が起きてから付け替えが終わるまで一時的に接続が切れますが、ルートテーブルや DNS サーバーへの変更は要りません。実際の運用では、この付け替えを監視の仕組みやスクリプトで自動化します。



外から見える番号(Elastic IP アドレス)を掛け替えても、内側の呼び出し番号(プライベート IP アドレス)は変わらないでござる。「プライベート IP のまま」と言われたら、番号札を持っている ENI か、そのセカンダリの番号を動かすのでござる。MAC アドレスやセキュリティグループまで丸ごと引き継ぐなら、ENI ごとでござるな。
実践
プライベート IP アドレス 10.0.2.100 を持つセカンダリ ENI を作り、プライマリ役のインスタンスに付けます。プライマリ役を止めて障害に見立て、ENI をスタンバイ役のインスタンスへ付け替えます。クライアント役のインスタンスから同じ IP アドレスにアクセスし、応答するホストが替わることを確かめます。
前提条件
- リージョン:
ap-northeast-1(東京) - EC2・Systems Manager の操作権限を持つ IAM ユーザーまたはロールでコンソールにログイン済みであること
以下のリソースが作成済みであることを前提とします。3 台のインスタンスはすべて ap-northeast-1a にあり、Session Manager で接続できます。
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| VPC | eni-lab-vpc | CIDR 10.0.0.0/16 | Amazon VPC で仮想ネットワークを構築しサブネットを設定する |
| サブネット | eni-lab-app-1a | 10.0.1.0/24(ap-northeast-1a)。3 台のインスタンスを置く。インターネットゲートウェイへのルートあり | 同上 |
| サブネット | eni-lab-service-1a | 10.0.2.0/24(ap-northeast-1a)。付け替え用の ENI を置く | 同上 ※同じ AZ にもう 1 つ作る |
| セキュリティグループ | eni-lab-service-sg | インバウンドで HTTP(80)を 10.0.0.0/16 から許可 | セキュリティグループとネットワーク ACL でアクセスを制御する |
| EC2 インスタンス | eni-lab-primary / eni-lab-standby | Amazon Linux 2023。httpd が Hello from eni-lab-primary(standby は eni-lab-standby)を返す | Amazon EC2 でインスタンスを起動しSSH接続する ※接続は Session Manager |
| EC2 インスタンス | eni-lab-client | Amazon Linux 2023。curl で確かめる側 | 同上 |
このハンズオンで作成するリソースは以下のとおりです。
| リソース種別 | リソース名 | 内容 |
|---|---|---|
| ネットワークインターフェイス | eni-lab-service-eni | eni-lab-service-1a に作成。プライベート IPv4 アドレス 10.0.2.100、セキュリティグループ eni-lab-service-sg |
EC2 インスタンスは起動している間ずっと課金されます。検証が終わったら必ず削除してください。
手順 1: ネットワークインターフェイスを作成する
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。
上部の検索バーに EC2 と入力し、「EC2」を選択します。左側ナビゲーションの「ネットワーク & セキュリティ」→「ネットワークインターフェイス」を選択し、右上の「ネットワークインターフェイスの作成」をクリックします。以下を設定します。
- Description:
eni-lab-service-eni - サブネット:
eni-lab-service-1a(候補にはサブネット ID・AZ・名前が表示されます。選択後は ID で表示されます) - プライベート IPv4 アドレス:
カスタムを選び、「IPv4 アドレス」に10.0.2.100を入力 - セキュリティグループ: 一覧で
eni-lab-service-sgにチェックを入れる


「タグ」で「新規タグを追加」をクリックし、キー Name・値 eni-lab-service-eni を入力します。その他の項目はデフォルトのままにして、「ネットワークインターフェイスの作成」をクリックします。
一覧の検索欄に eni-lab-service-eni と入力して絞り込み、eni-lab-service-eni を選択します。下に表示される「詳細」タブでプライベート IPv4 アドレスが 10.0.2.100 であること、MAC アドレスとアベイラビリティーゾーン(ap-northeast-1a)を確認します。MAC アドレスは手順 4 で見比べるので控えておきます。


手順 2: プライマリ役のインスタンスにアタッチする
eni-lab-service-eni を選択したまま、「アクション」→「アタッチ」をクリックします。「VPC」で eni-lab-vpc を選択してから、「インスタンス」で eni-lab-primary を選択し、「アタッチ」をクリックします(「高度な ENA 設定」はデフォルトのままにします)。


ステータスが In-use になったことを確認します。インスタンスが実行中のままアタッチするホットアタッチなので、Amazon Linux 2023 が新しいインターフェイスを自動で認識して設定します。
左側ナビゲーションの「インスタンス」から eni-lab-client を選択し、「接続」をクリックします。「SSM セッションマネージャー」が選ばれていることを確認して「接続」をクリックします。開いたターミナルで次のコマンドを実行します。
curl -s http://10.0.2.100/Hello from eni-lab-primary と表示され、プライマリ役のインスタンスが 10.0.2.100 で応答していることを確認します。


手順 3: プライマリ役を止めて ENI をスタンバイ役へ付け替える
障害に見立てて、プライマリ役を停止します。「インスタンス」で eni-lab-primary を選択し、「インスタンスの状態」→「インスタンスを停止」をクリックし、確認画面で「停止」をクリックします。
eni-lab-client のターミナルで次のコマンドを実行すると、5 秒待っても応答が返らず「応答なし」と表示されます。
curl -s --max-time 5 http://10.0.2.100/ || echo "応答なし"「ネットワークインターフェイス」に戻り、eni-lab-service-eni を選択して「アクション」→「デタッチ」をクリックし、確認画面で「デタッチ」をクリックします。セカンダリ ENI は、インスタンスの停止中でもデタッチできます。
ステータスが Available に戻ったら、「アクション」→「アタッチ」をクリックし、「VPC」で eni-lab-vpc、「インスタンス」で eni-lab-standby を選択して「アタッチ」をクリックします。


手順 4: 同じ IP アドレスでスタンバイ役が応答することを確かめる
eni-lab-client のターミナルで、同じコマンドを実行します。
curl -s http://10.0.2.100/Hello from eni-lab-standby と表示されます。クライアントの接続先は 10.0.2.100 のまま変えずに、応答するインスタンスがスタンバイ役に替わりました。


「ネットワークインターフェイス」で eni-lab-service-eni を選択し、「詳細」タブを確認します。「インスタンス ID」が eni-lab-standby のインスタンス ID に替わり(名前は表示されないので、インスタンスの一覧の ID と見比べます)、プライベート IPv4 アドレス(10.0.2.100)と MAC アドレスは手順 1 で控えた値から変わっていません。





「プライベート IP のまま」「すぐ切り替える」と言われたら ENI(またはセカンダリプライベート IP)の付け替え、「パブリック IP を移す」なら Elastic IP でござる。DHCP オプションセットは IP を配る仕組みではないので、名前に惑わされぬよう気をつけるでござるな。
まとめ
| 要件 | 選ぶもの |
|---|---|
| プライベート IP アドレスのまま、スタンバイのインスタンスへ切り替える | セカンダリ ENI の付け替え(アドレスだけならセカンダリプライベート IPv4 アドレスの付け替えでもよい) |
| パブリック IPv4 アドレスを別のインスタンスへ移す | Elastic IP アドレスの付け替え |
| VPC 内のインスタンスに配る DNS サーバーやドメイン名を変える | DHCP オプションセット |
| 複数のインスタンスにリクエストを振り分ける | ロードバランサー |
- プライベート IP アドレス・MAC アドレス・セキュリティグループは ENI の属性で、付け替えても保持される
- プライマリ ENI はデタッチできない。付け替えられるのはセカンダリ ENI だけ
- ENI は同じ AZ のインスタンスにしかアタッチできない
- アタッチは実行中(ホット)・停止中(ウォーム)・起動時(コールド)のいずれでもできる。Amazon Linux と Windows Server はホット・ウォームアタッチを自動で認識して設定する
- 付け替えのあいだは一時的に接続が切れるが、ルートテーブルや DNS の変更は要らない
参照先
- Elastic Network Interface – Amazon Elastic Compute Cloud
- EC2 インスタンスのネットワークインターフェイスのアタッチ – Amazon Elastic Compute Cloud
- Amazon EC2 インスタンス用の複数のネットワークインターフェイス – Amazon Elastic Compute Cloud
- EC2 インスタンス用のネットワークインターフェイスを作成する – Amazon Elastic Compute Cloud
- Elastic IP アドレス – Amazon Elastic Compute Cloud
- Amazon VPC の DHCP オプションセット – Amazon Virtual Private Cloud















