はじめに
AWSを勉強していると、EC2やRDS、Lambdaなど色々なサービスが出てきますが、それらがどうやってネットワークに繋がっているかを意識したことはありますか?
実は、AWSのリソースがネットワークに接続できるのは、裏側で ENI(Elastic Network Interface) というものが働いているからです。
ENIは普段あまり目立たない存在ですが、AWSのネットワークを理解するうえで欠かせない基本概念です。
本記事では、ENIがつまり何なのかを、身近な例えを交えてまとめました。
ENIを一言でいうと「仮想のLANポート」
物理的なパソコンには、LANケーブルを差し込むLANポートがありますよね。
このLANポートがあるから、パソコンはネットワークに繋がることができます。
ENIは、それのAWS版です。
ENI = AWS上のリソースをVPCネットワークに接続するための「仮想のLANポート」 と考えるとイメージしやすいと思います。
【物理の世界】
パソコン ──[LANポート]── LANケーブル ── ルーター ── インターネット
【AWSの世界】
EC2インスタンス ──[ENI]── サブネット ── VPC ── インターネット
EC2インスタンスを作成すると、自動的にENIが1つアタッチされます。普段意識しなくても通信できているのは、このENIのおかげです。
ENIが持っている情報
ENIは単なる「つなぎ口」ではなく、ネットワークに関するさまざまな情報を保持しています。
| 項目 | 説明 |
|---|---|
| プライベートIPアドレス | VPC内で通信するためのIPアドレス(必須) |
| パブリックIPアドレス | インターネットとの通信に使うIPアドレス(任意) |
| Elastic IPアドレス | 固定のパブリックIPアドレス(任意) |
| MACアドレス | ネットワークインターフェースの一意な識別子 |
| セキュリティグループ | 通信の許可/拒否ルール |
| サブネット | ENIが所属するサブネット |
つまり、「このリソースのIPアドレスは何か」「どのセキュリティグループが適用されているか」といったネットワーク設定の実体はENIが持っているということです。
ENIの特徴
1. 付け外しができる
ENIの面白いところは、EC2インスタンスに対して付けたり外したりできる点です。
物理サーバーのLANポートはサーバーに固定されていますが、セカンダリENI(追加で作成したENI) はEC2インスタンスから取り外して、別のEC2インスタンスにアタッチすることができます。
EC2インスタンス作成時に自動的にアタッチされるプライマリENI(eth0)はデタッチできません。付け替えが可能なのはセカンダリENIのみです。
【付け替えのイメージ】
(1) EC2-A に ENI がアタッチされている
EC2-A ──[ENI: 10.0.1.50]
(2) ENI を EC2-A からデタッチ
EC2-A [ENI: 10.0.1.50]
(3) ENI を EC2-B にアタッチ
EC2-B ──[ENI: 10.0.1.50]
ENIを付け替えると、IPアドレスやセキュリティグループなどの設定もそのまま一緒に移動します。
これを活用すると、障害時にENIを別のインスタンスに付け替えるだけでIPアドレスを引き継げるため、素早いフェイルオーバーが実現できます。
2. 1つのインスタンスに複数のENIをアタッチできる
EC2インスタンスには、複数のENIをアタッチすることもできます。
これは、物理サーバーにLANポートが複数あるのと同じイメージです。
EC2インスタンス
├── ENI-1: 10.0.1.10(管理用ネットワーク)
└── ENI-2: 10.0.2.10(サービス用ネットワーク)
たとえば、管理用の通信とサービス用の通信をネットワーク的に分離したい場合に便利です。
アタッチできるENIの数は、インスタンスタイプによって上限が異なります。小さいインスタンスタイプでは2〜3個程度です。
3. セキュリティグループはENI単位で適用される
「セキュリティグループはEC2インスタンスに設定するもの」と思いがちですが、正確にはENIに対して設定するものです。
1つのインスタンスに複数のENIがアタッチされている場合、ENIごとに異なるセキュリティグループを適用できます。
EC2インスタンス
├── ENI-1 → セキュリティグループA(HTTPのみ許可)
└── ENI-2 → セキュリティグループB(SSHのみ許可)
ENIが使われている場面
ENIはEC2だけのものではありません。AWSの多くのサービスが、裏側でENIを利用しています。
Lambda(VPC Lambda)
LambdaをVPC内で実行する場合、Lambda関数はENIを通じてVPC内のリソースと通信します。VPC設定を構成した時点で、指定したサブネットにHyperplane ENIが作成されます。このENIは同じサブネット・セキュリティグループの組み合わせを持つLambda関数間で共有され、そこを経由してRDSなどのリソースにアクセスできるようになります。
RDS
RDSのデータベースインスタンスも、VPC内に配置される際にENIを通じてネットワークに接続されています。RDSのエンドポイント(接続先ホスト名)は、このENIのIPアドレスに解決されます。
ECS(Fargate)
Fargateで動かすコンテナタスクにも、タスクごとにENIが割り当てられます(awsvpcネットワークモード)。これにより、各タスクが独自のIPアドレスを持ち、セキュリティグループを個別に設定できます。
NAT Gateway / VPCエンドポイント
NAT GatewayやインターフェースタイプのVPCエンドポイントも、サブネット内にENIを作成して動作しています。
AWSのコンソール画面で「ネットワークインターフェース」の一覧を見ると、自分で作った覚えのないENIが並んでいることがあります。これらは上記のようなサービスが自動的に作成したものです。
まとめ
| ポイント | 内容 |
|---|---|
| ENIとは | AWS上の「仮想LANポート」。リソースをVPCネットワークに接続する |
| 持っている情報 | IPアドレス、MACアドレス、セキュリティグループなど |
| 付け外し可能 | 別のインスタンスに付け替えることで、IP設定ごと移行できる |
| 複数アタッチ可能 | 1つのインスタンスに複数のENIをつけてネットワークを分離 |
| 多くのサービスが利用 | EC2以外にも、Lambda・RDS・Fargate・NAT Gatewayなどが裏側でENIを使っている |