【実務・中級編】 Elastic IP(EIP)の割り当てとパブリックIPとの違い – クラウドインフラと仮想化ネットワーク実践ガイド

クラウドの境界線で迷うエンジニアたちへ:EIPとパブリックIPの本当のハナシ

クラウドインフラの設計や運用を任されると、避けて通れないのが「ネットワークの境界線」の設計です。VPCの構築を始めたばかりのころ、誰もが一度は次のような疑問にぶつかります。

「EC2インスタンスを立ち上げるとき、自動で割り当てられる『パブリックIPv4アドレス』と、わざわざ別途取得してアタッチする『Elastic IP (EIP)』の決定的な違いって何なんだ?」

「インスタンスを再起動したらIPアドレスが変わってしまい、外部APIのホワイトリスト(IP制限)に弾かれてシステムが止まった……」

現場で数々の修羅場をくぐり抜けてきたシニアエンジニアなら、この痛みが痛いほどわかるはずです。今回は、AWSのネットワーキングの根幹を支える「パブリックIP」と「Elastic IP」の仕様の裏側を、パケットの挙動や実務でのユースケースを交えながら徹底的に紐解いていきます。

—

1. パブリックIPv4アドレス vs Elastic IP:仕様の決定的な違い

まずは、両者の最も根本的な違いを整理しましょう。どちらもAWSの外側(インターネット)と通信するために必要なグローバルIPアドレスを提供しますが、その「ライフサイクル」と「コスト構造」が大きく異なります。

| 特性 | パブリックIPv4アドレス (Public IPv4) | Elastic IP (EIP) |
| :— | :— | :— |
| ライフサイクル | インスタンスのライフサイクルに完全に依存する | インスタンスから切り離してもAWSアカウント内に保持される |
| 再起動時の挙動 | 停止(Stop)/起動(Start)でアドレスが変わる可能性がある | 割り当てを解除しない限り、絶対に変わらない(静的) |
| コスト | インスタンス起動中は無料(AWSの無料枠の範囲内等) | インスタンスにアタッチされていない状態(孤立状態)のときに課金される |
| 主な用途 | 一時的なテスト環境、動的なスケールアウトを前提としたWebサーバー | 外部APIのIP制限(ホワイトリスト)対策、固定IPが必要なSSH踏み台 |

パケットの動きから見る仕組み

AWSのVPC内部において、EC2インスタンスには通常プライベートIPアドレス(例: 10.0.1.100)のみが割り当てられています。インターネットへ通信する際、AWSの基盤ネットワーク(VPCルーターやNATゲートウェイ、あるいはENI直近の仮想ルーター)でNAT(Network Address Translation)が行われ、パブリックIPやEIPに変換されて外の世界へと飛び出します。

このとき、通常のパブリックIPは「インスタンスという器」に紐づいているため、インスタンスを停止して再度起動した際、AWSのプールから別のIPアドレスが再割り当てされるリスクがあります。一方、EIPはあなたのアカウントに「予約された不動産」のようなものであり、どのインスタンスに紐づくかを自由に付け替えることができます。

—

2. アドレス枯渇対策とAWSの巧妙な課金体系

「静的なIPが便利なら、全部EIPにしておけばいいじゃないか」と思いがちですが、ここにAWSの巧妙な(そして理にかなった)IPv4アドレス枯渇対策が隠されています。

IPv4アドレスは世界的に枯渇しており、AWSにとっても貴重な資産です。そのため、使われていないIPv4アドレスが遊休状態になるのを防ぐため、EIPには次のような厳格な課金ポリシーが適用されています。

1. インスタンスにアタッチされているEIP: 無料
2. 停止中のインスタンスにアタッチされているEIP: 無料(インスタンスが停止していても、アタッチ状態であれば課金対象外)
3. どのリソースにもアタッチされていない(解放されていない)EIP: 有料(時間単位で課金)

もし、不要になったテスト環境を「インスタンスだけ削除して、EIPの解放を忘れた」なんてことをやらかすと、じわじわとAWS利用料を押し上げる原因になります。インフラのコスト最適化(FinOps)の観点からも、EIPのライフサイクル管理は厳重に行う必要があります。

—

3. 実務で役立つ設定とデバッグの作法

ここからは、実務でAWS CLIやTerraformを使ってEIPを扱い、アプリケーションから外部へリクエストを飛ばす際の実装パターンを見ていきましょう。

AWS CLIによるEIPの取得とアタッチ

まずは、手動またはスクリプトでEIPを確保し、特定のEC2インスタンスに紐づける手順です。

# 1. VPCスコープで新しいElastic IPを取得する
# 出力される AllocationId と PublicIp をメモしておきます
aws ec2 allocate-address --domain vpc

# 2. 取得した AllocationId と対象のインスタンスIDを指定してアタッチする
aws ec2 associate-address \
    --instance-id i-0123456789abcdef0 \
    --allocation-id eipalloc-0123456789abcdef0

# 【Tips】デバッグ時:現在の割り当て状況を確認するコマンド
aws ec2 describe-addresses --allocation-ids eipalloc-0123456789abcdef0

Python (requests) を使ったグローバルIPの確認スクリプト

「今、自分のアプリケーションがどのパブリックIP(EIP)で外に出ていかっているのか?」を確認したいときは、外部のIP確認サービスを叩くスニペットを常備しておくと、セキュリティグループのミスやルートテーブルのルーティング漏れ(IGWへのルートがあるか)を瞬時に切り分けられます。

import requests

def check_outbound_ip():
    """
    自信のインスタンスがインターネット側からどのIPアドレスで見えているかを確認する関数。
    外部のIPエコーサービスを利用して、現在ルーティングに使われているパブリックIP/EIPを特定する。
    """
    try:
        # パブリックIPをプレーンテキストで返してくれる信頼性の高いエンドポイント
        response = requests.get('https://api.ipify.org?format=json', timeout=5)
        response.raise_for_status()
        
        ip_data = response.json()
        print(f"[SUCCESS] 現在のアウトバウンドIPアドレス: {ip_data['ip']}")
        
    except requests.exceptions.RequestException as e:
        print(f"[ERROR] ネットワーク接続または名前解決に失敗しました: {e}")

if __name__ == '__main__':
    check_outbound_ip()

—

4. 現場でありがちなトラブルとシニアからの教訓

最後に、実際の現場で遭遇しがちなトラブルシューティングの知見をいくつかシェアします。

トラブル1: 外部APIの接続元IP制限に弾かれる

  • 原因: インスタンスをメンテナンスのために一度Stop/Startした際、パブリックIPアドレスが変わってしまった。
  • 対策: 外部APIベンダーから「IPアドレス制限をかける」と言われたら、必ずElastic IPを採用し、そのIPをホワイトリストに登録してもらうこと。通常のパブリックIPを信用してはいけません。

トラブル2: EIPを使っているのに、外部と通信できない

  • 原因: EIPはあくまで「IPの紐づけ」であり、ルーティングを保証するものではありません。VPCのルートテーブルにインターネットゲートウェイ(igw-xxxxxxxx)へのデフォルトルート(0.0.0.0/0)が設定されているか、およびセキュリティグループの送信(Egress)ルールが閉じられていないかを確認する必要があります。
  • デバッグ手順: まず traceroute や nc コマンドでどこまでパケットが飛んでいるかを確認し、セキュリティグループのインバウンド/アウトバウンドを疑うのが定石です。

—

まとめ

Elastic IPとパブリックIPの違いは、単なる「仕様の暗記」ではありません。システムが外部のサードパーティAPIと連携する際の「信頼性の担保」であり、クラウドコストを最適化するための「リソース管理の要」です。

「いつ、どのタイミングでIPが変わるべきか、あるいは変わってはいけないのか」――この視点を持つだけで、あなたのVPC設計の品質は一段とプロフェッショナルなものになります。日々のインフラ運用の現場で、ぜひこの知見を役立ててください。

コメント

タイトルとURLをコピーしました