AWS Learning
Networking

Elastic Network Interface (ENI)

Elastic Network Interface, Private/Public IPs, Multiple ENIs, Failover

ENI là gì?

ENI (Elastic Network Interface) = "Card mạng ảo" gắn vào EC2 instance.

Card mạng ảo (Virtual Network Card) là gì?

Card mạng vật lý (Laptop)Card mạng ảo (ENI)
Là gìPhần cứng thật (chip WiFi, cổng Ethernet)Phần mềm mô phỏng card mạng
Ở đâuLaptop/Server vật lýEC2/VM trên cloud
MACIn sẵn trên chipAWS generate
IPRouter cấpAWS/VPC cấp
Di chuyểnTháo ra cắm máy khácDetach rồi attach EC2 khác

Tại sao cần ENI?

Không có ENI = Không kết nối được gì cả!

KHÔNG CÓ ENI:                      CÓ ENI:
├── ❌ Không có IP                 ├── ✅ Có IP: 10.0.1.50
├── ❌ Không SSH được              ├── ✅ SSH được
├── ❌ Không gọi API được          ├── ✅ Gọi API được
├── ❌ Không connect DB            ├── ✅ Connect RDS được
└── ❌ Máy bị cô lập               └── ✅ Ra Internet được

💡 Tóm lại: ENI cho phép EC2 có IP và kết nối mạng. Giống như laptop cần card WiFi để lên mạng, EC2 cần ENI để kết nối trong VPC!

┌─────────────────────────────────────────────────────────────────┐
│                        EC2 Instance                             │
│                                                                 │
│   ┌─────────────────────────────────────────────────────────┐   │
│   │                   ENI (Network Interface)               │   │
│   │                                                         │   │
│   │   ├── Private IP: 10.0.1.50                             │   │
│   │   ├── Public IP: 54.123.45.67 (optional)                │   │
│   │   ├── Elastic IP: 52.1.2.3 (optional)                   │   │
│   │   ├── MAC Address: 02:xx:xx:xx:xx:xx                    │   │
│   │   ├── Security Groups: [sg-web, sg-ssh]                 │   │
│   │   └── Subnet: subnet-12345                              │   │
│   │                                                         │   │
│   └─────────────────────────────────────────────────────────┘   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

💡 Quan trọng: Mọi thứ về network (IP, Security Group, MAC) đều gắn vào ENI, không phải EC2 trực tiếp!


Thuộc tính của ENI

Thuộc tínhMô tả
Private IP(s)1 primary + nhiều secondary IPs (bắt buộc có)
Public IPAuto-assigned hoặc Elastic IP (optional)
Elastic IPStatic public IP gắn vào ENI
MAC AddressĐịa chỉ MAC duy nhất
Security Groups1 hoặc nhiều SG gắn vào ENI
SubnetENI thuộc về 1 subnet cụ thể
Source/Dest CheckEnable/Disable (disable cho NAT instance)
┌─────────────────────────────────────────────────────────────────┐
│                    ENI = "Network Identity"                     │
│                                                                 │
│   Mọi thứ về network đều gắn vào ENI:                           │
│                                                                 │
│   ┌─────────────────────────────────────────────────────────┐   │
│   │                        ENI                              │   │
│   │                                                         │   │
│   │   ├── Private IP(s)     ← Gắn vào ENI                   │   │
│   │   ├── Public IP         ← Gắn vào ENI                   │   │
│   │   ├── Elastic IP        ← Gắn vào ENI                   │   │
│   │   ├── MAC Address       ← Thuộc về ENI                  │   │
│   │   ├── Security Groups   ← Gắn vào ENI                   │   │
│   │   └── Subnet            ← ENI thuộc về subnet           │   │
│   │                                                         │   │
│   └─────────────────────────────────────────────────────────┘   │
│                         │                                       │
│                          ▼                                      │
│                    EC2 Instance                                 │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Private IP và Public IP

Private IP: Luôn có (bắt buộc)

┌─────────────────────────────────────────────────────────────────┐
│                         ENI                                     │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   Private IP:  ✅ BẮT BUỘC (luôn có)                            │
│                Ví dụ: 10.0.1.50                                 │
│                                                                 │
│   1 ENI có thể có NHIỀU Private IPs:                            │
│   ├── Primary:   10.0.1.50 (không thể xóa)                      │
│   ├── Secondary: 10.0.1.51                                      │
│   └── Secondary: 10.0.1.52                                      │
│                                                                 │
│   Use case: Host nhiều websites trên 1 EC2                      │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Public IP: Tùy chọn (optional)

LoạiMô tảKhi nào có
Auto-assigned Public IPAWS tự gán, thay đổi khi restartSubnet có auto-assign = ON
Elastic IPStatic, không thay đổiBạn tự gán vào ENI
ENI ở Public Subnet (auto-assign ON):
├── Private IP: 10.0.1.50 ✅
└── Public IP:  54.1.2.3  ✅ (auto)

ENI ở Private Subnet:
├── Private IP: 10.0.2.50 ✅
└── Public IP:  ❌ Không có

ENI ở Private Subnet + Elastic IP:
├── Private IP: 10.0.2.50 ✅
└── Elastic IP: 54.4.5.6  ✅ (static)

⚠️ Lưu ý: 1 ENI chỉ có thể có 1 Public IP hoặc 1 Elastic IP, nhưng có thể có nhiều Private IPs.


Nhiều ENI trên 1 EC2

1 EC2 có thể gắn nhiều ENIs, số lượng tùy thuộc instance type.

┌──────────────────────────────────────────────────────────────────┐
│                    EC2 VỚI NHIỀU ENIs                            │
│                                                                  │
│   ┌─────────────────────────────────────────────────────────┐    │
│   │                    EC2 Instance                         │    │
│   │                                                         │    │
│   │   eth0 (Primary ENI)          eth1 (Secondary ENI)      │    │
│   │   ├── 10.0.1.50               ├── 10.0.2.50             │    │
│   │   ├── Public Subnet           ├── Private Subnet        │    │
│   │   └── SG: web-sg              └── SG: db-sg              │   │
│   │                                                         │    │
│   │   ⚠️ eth0 không thể detach                              │    │
│   │   ✅ eth1, eth2... có thể detach/attach                 │    │
│   │                                                         │    │
│   └─────────────────────────────────────────────────────────┘    │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

Giới hạn theo Instance Type

Instance TypeMax ENIsMax Private IPs/ENI
t2.micro22
t3.medium36
m5.large310
m5.xlarge415
m5.4xlarge830
c5.18xlarge1550

Cách tạo và attach ENI

Qua AWS Console

EC2 Dashboard → Network Interfaces → Create network interface

1. Tạo ENI mới:
   ├── Chọn Subnet (⚠️ cùng AZ với EC2!)
   ├── Chọn Security Groups
   └── (Optional) Assign Private IP

2. Attach vào EC2:
   ├── Chọn ENI vừa tạo
   ├── Actions → Attach
   └── Chọn EC2 Instance

Qua AWS CLI

# 1. Tạo ENI
aws ec2 create-network-interface \
  --subnet-id subnet-12345 \
  --groups sg-12345 \
  --description "Secondary ENI"
 
# Output: eni-abc123
 
# 2. Attach vào EC2
aws ec2 attach-network-interface \
  --network-interface-id eni-abc123 \
  --instance-id i-12345 \
  --device-index 1
 
# 3. Kiểm tra trong EC2
ssh ec2-user@<ip>
ip addr show
# eth0: 10.0.1.50 (Primary)
# eth1: 10.0.2.50 (Secondary - mới attach)

Lưu ý quan trọng

Lưu ýChi tiết
Cùng AZENI và EC2 phải ở cùng Availability Zone
Device Indexeth0 = 0 (primary), eth1 = 1, eth2 = 2...
Hot-attachCó thể attach ENI khi EC2 đang chạy
Primary ENIeth0 không thể detach, chỉ secondary mới được
OS configCó thể cần config thêm routing trong OS

Use Cases

1. Dual-homed Instance

┌─────────────────────────────────────────────────────────────────┐
│                    EC2 Instance                                 │
│                                                                 │
│   eth0 (Public)               eth1 (Private)                    │
│   ├── 10.0.0.10               ├── 10.0.1.10                     │
│   ├── EIP: 54.1.2.3           └── Connect to RDS                │
│   └── Web traffic                                               │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

→ Web traffic qua eth0, Database traffic qua eth1
→ Security Groups riêng cho từng ENI

2. Management Network

eth0: Production traffic (app, api)
eth1: Management traffic (SSH, monitoring)
      → Chỉ cho phép IP của admin team

3. Failover - Move ENI

TRƯỚC:
EC2-A ──► ENI (IP: 10.0.1.50, EIP: 54.1.2.3)

EC2-A chết!

SAU (move ENI sang EC2-B):
EC2-B ──► ENI (IP: 10.0.1.50, EIP: 54.1.2.3)

→ Client không cần đổi IP kết nối!
→ Phù hợp cho HA setup

4. Network/Security Appliance

NAT Instance với 2 ENIs:

eth0 (Public)        eth1 (Private)
├── EIP              ├── Route từ private subnets
└── Internet         └── nhận traffic từ private EC2

Traffic: Private EC2 → eth1 → NAT → eth0 → Internet

Giới hạn

Giới hạnGiá trị
Max ENIs per instanceTùy instance type (2-15)
Max IPs per ENITùy instance type (2-50)
ENI và EC2 cùng AZBắt buộc
Primary ENI (eth0)Không thể detach
Security Groups per ENIMax 5

ENI dùng cho service nào?

Quy tắc đơn giản

💡 Trong VPC + cần IP = cần ENI

ENI là cầu nối giữa AWS resource và network (VPC). Không có ENI = Không có IP trong VPC = Không kết nối được!

Phân loại Services

┌─────────────────────────────────────────────────────────────────┐
│  1️⃣  VPC-BASED SERVICES (Cần ENI trong VPC của BẠN)             │
│                                                                 │
│      EC2, RDS, Lambda (VPC), ECS, EKS, ElastiCache,             │
│      NAT Gateway, ALB/NLB, VPC Endpoints (Interface)...         │
│                                                                 │
│      → Nằm TRONG VPC của bạn                                    │
│      → IP thuộc subnet của bạn (vd: 10.0.1.50)                  │
│      → BẠN quản lý network                                      │
│      → Cần ENI để có IP trong VPC                               │
│                                                                 │
├─────────────────────────────────────────────────────────────────┤
│  2️⃣  PUBLIC/REGIONAL SERVICES (AWS quản lý IP)                  │
│                                                                 │
│      S3, DynamoDB, SQS, SNS, Lambda (không VPC)...              │
│                                                                 │
│      → Nằm NGOÀI VPC của bạn                                    │
│      → Connect qua URL: s3.amazonaws.com                        │
│      → AWS quản lý IP (bạn không thấy, không control)           │
│      → KHÔNG cần ENI trong VPC của bạn                          │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Chi tiết theo Service

ServiceLoạiENIGhi chú
EC2VPC-based✅ Bạn quản lýCó thể tạo/attach/detach ENI
RDSVPC-based✅ AWS tạo ngầmENI trong DB Subnet Group
Lambda (VPC)VPC-based✅ AWS tạo ngầmENI để access VPC resources
ECS (awsvpc)VPC-based✅ AWS tạo ngầmMỗi task có ENI riêng
ALB/NLBVPC-based✅ AWS tạo ngầmENI trong mỗi subnet
NAT GatewayVPC-based✅ AWS tạo ngầm1 ENI với Elastic IP
VPC Endpoint (Interface)VPC-based✅ AWS tạo ngầmENI trong subnet bạn chọn
S3PublicConnect qua URL/VPC Endpoint
DynamoDBPublicConnect qua URL/VPC Endpoint
SQS/SNSPublicConnect qua URL
Lambda (không VPC)PublicChạy trong AWS network

Ví dụ kết nối

Bạn connect S3:
   App → Internet/VPC Endpoint → S3 (IP của AWS, không phải VPC bạn)

Bạn connect RDS:
   App → ENI → RDS (IP 10.0.x.x trong VPC của bạn)

Liên kết

Nguồn: AWS ENI Documentation