ENI - elastic network interface
是VPC中虚拟网卡,它可以跟以下组件做关联:
private IP
、一个或多个secondary private IP
Public IP
ENI
存在于特定的AZ,可以将它解绑然后挂到同AZ的其他实例,这样流量就到达了新的实例上:
每个EC2都有一个默认的ENI,也叫primary network interface
,这个ENI不能从实例上解绑下来。但实例上可以挂额外的ENI,每种实例可以挂的ENI数量不同,参考: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI
如果实例上被分配 Public IP
,那么这个Public IP
和primary network interface
进行关联
虽然EC2上可以挂多个ENI,但是挂多个ENI并不能增加EC2的总带宽。所有ENI共享EC2的最大带宽
EC2上绑两块ENI,一个ENI在公网,一个ENI在私网,这样EC2既能跟公网通讯,又能跟私网通讯:
之所以托管的AWS服务能够被用户自己的vpc访问到,是因为这些服务的机器上有两块ENI,一块在服务自身的VPC,另一块在用户的VPC
Requester-managed ENI
是指AWS服务在用户VPC创建的ENI,用户并不能自己管理这些ENI。这些ENI与AWS托管服务关联,例如RDS、NAT Gateway、Interface VPC Endpoint、MSK
1.你可以在AWS帐号中看到这些Requester-managed ENI
,并且可以添加tag,但不能做任何的属性更改
2.不可以对Requester-managed ENI
做detach操作
3.当这些托管服务被删除时,Requester-managed ENI
会一起被删除;如果没有被删除,这时可以手动删除
Requester-managed ENI
在Network Interface
页面,点击具体的ENI,有一个属性叫Requester-managed
,如果为True则表示是AWS服务在用户VPC里创建的ENI:
Requester-managed ENI
aws ec2 describe-network-interfaces --filters Name=requester-managed,Values=true --region ap-southeast-1 | jq '.NetworkInterfaces[] | {Description:.Description, PrivateIpAddress:.PrivateIpAddress, RequesterId:.RequesterId}'
从中可以看到,每个托管服务的RequesterID
都不同,但它们的实现原理都一样——强行在用户的VPC里创建一个ENI,这样用户就能跟它通讯了。例如Lambda in VPC
, 其实是Lambda在用户的VPC里创建ENI,这样Lambda就能访问VPC内的资源了:
再比如EKS的控制平面,它的master节点本身存在于AWS管理的VPC,但它在用户的VPC里创建了ENI,所以Worker节点能和它通讯。