AWS EC2 - 多个(public/私有)网络接口
AWS EC2 - multiple (public / private) network interfaces
这里是 AWS 新手。我正在尝试创建一个包含多个 EC2 节点的堆栈,每个节点都应该有两个网络接口。
一个接口应该是 public 并连接到 Internet,另一个接口应该是私有的。接口应属于不同的子网,以便它们可以独立路由(数据平面/控制平面)。
这是我在 CloudFormation 中尝试过的:
Resources:
[.....]
Host1:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: 'ami-02541b8af977f6cdd' # Amazon Linux x86
InstanceType: 't2.micro'
KeyName: !Ref KeyName
NetworkInterfaces:
- SubnetId: !Ref SubnetPublic
AssociatePublicIpAddress: true
DeleteOnTermination: true
DeviceIndex: '0'
GroupSet:
- !Ref SecurityGroup
- SubnetId: !Ref SubnetPrivate
AssociatePublicIpAddress: false
DeleteOnTermination: true
DeviceIndex: '1'
GroupSet:
- !Ref SecurityGroup
然而,这会导致错误:
使用多个网络接口启动时无法指定 associatePublicIPAddress 参数。
此处提供完整的 YAML 文件:https://gist.github.com/kmansoft/39f7be10553195f41b8201e5638073f2
我该如何解决这个问题?
我完全不是 CloudFormation 专家,但我认为我在这里看到了一个问题。仅指定了一个实例。正确的?但是您要指定两个子网。一个实例只能在一个子网中。
所有实例,无论它们是在 public 还是私有子网中,都将有一个私有 IP 地址。如果他们在 public 子网中,他们也会有一个 public IP。但是,public IP 在 O/S 级别 not 可见,即 ifconfig
或 ip 不可见。 public IP 由 AWS 在网络级别处理,在您或 O/S.
的视线之外
所以,先设计一个VPC,VPC既有public又有私有子网。在私有子网中启动的任何实例将自动仅获得一个私有 IP 地址。在 public 子网中启动的实例将自动分配一个私有 IP 地址 和 一个 public IP 地址。此外,对于您的 public IP 地址,如果您愿意,您可以分配一个弹性 IP,这将使您拥有一个静态 public IP 地址。如果您没有分配弹性 IP,则每次实例 stopped/started 时,它都会获得一个新的 public IP 地址,尽管私有 IP 地址将保持静态。
最后,如前所述,public 子网中的实例将同时具有 public 和私有 IP 地址。因此,如果您要将文件从同一 VPC 中的一个实例复制到另一个实例,只需使用私有 IP 地址即可。例如,要服务来自 Internet 的 Web 流量,您可以使用 public IP 地址。最后,您可以通过定义所有传入的 SSH 流量必须进入私有 IP 地址来增强安全性。这样,您要么需要在本地办公室(大概有 point-to-point VPN),要么必须启动 VPN 才能通过 SSH 登录实例。
这一切如何转化为 CloudFormation,我不知道。
一切正常。
诀窍是只在 EC2 实例中指定一个网络接口 - 然后可以设置 AssociatePublicIpAddress: true
- 并单独添加第二个网络接口。
Resources:
[...]
Host1:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: 'ami-02541b8af977f6cdd' # Amazon Linux x86
InstanceType: 't2.micro'
AvailabilityZone: !Select [0, !GetAZs '']
KeyName: !Ref KeyName
NetworkInterfaces:
- SubnetId: !Ref SubnetPublic
AssociatePublicIpAddress: true
DeleteOnTermination: true
DeviceIndex: '0'
GroupSet:
- !Ref SecurityGroup
Tags:
- Key: Name
Value: 'simple - host1'
Host1Eth1:
Type: 'AWS::EC2::NetworkInterface'
Properties:
SubnetId: !Ref SubnetPrivate
GroupSet:
- !Ref SecurityGroup
Tags:
- Key: Name
Value: 'simple - host1 eth1'
Host1Eth1Attachment:
Type: 'AWS::EC2::NetworkInterfaceAttachment'
Properties:
DeleteOnTermination: true
DeviceIndex: 1
NetworkInterfaceId: !Ref Host1Eth1
InstanceId: !Ref Host1
在我的配置中,eth0是从30.0.1.0/24分配的,eth1是从30.0.2.0/24分配的。
这是创建实例后的路由table:
default via 30.0.1.1 dev eth0
default via 30.0.2.1 dev eth1 metric 10001
30.0.1.0/24 dev eth0 proto kernel scope link src 30.0.1.145
30.0.2.0/24 dev eth1 proto kernel scope link src 30.0.2.251
169.254.169.254 dev eth0
这非常接近我的需要,只需要用实例用户数据稍微调整一下。
完整的 YAML 脚本:https://gist.github.com/kmansoft/c490e7958b8ff8f1d2eb14a6cd115f08
这里是 AWS 新手。我正在尝试创建一个包含多个 EC2 节点的堆栈,每个节点都应该有两个网络接口。
一个接口应该是 public 并连接到 Internet,另一个接口应该是私有的。接口应属于不同的子网,以便它们可以独立路由(数据平面/控制平面)。
这是我在 CloudFormation 中尝试过的:
Resources:
[.....]
Host1:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: 'ami-02541b8af977f6cdd' # Amazon Linux x86
InstanceType: 't2.micro'
KeyName: !Ref KeyName
NetworkInterfaces:
- SubnetId: !Ref SubnetPublic
AssociatePublicIpAddress: true
DeleteOnTermination: true
DeviceIndex: '0'
GroupSet:
- !Ref SecurityGroup
- SubnetId: !Ref SubnetPrivate
AssociatePublicIpAddress: false
DeleteOnTermination: true
DeviceIndex: '1'
GroupSet:
- !Ref SecurityGroup
然而,这会导致错误:
使用多个网络接口启动时无法指定 associatePublicIPAddress 参数。
此处提供完整的 YAML 文件:https://gist.github.com/kmansoft/39f7be10553195f41b8201e5638073f2
我该如何解决这个问题?
我完全不是 CloudFormation 专家,但我认为我在这里看到了一个问题。仅指定了一个实例。正确的?但是您要指定两个子网。一个实例只能在一个子网中。
所有实例,无论它们是在 public 还是私有子网中,都将有一个私有 IP 地址。如果他们在 public 子网中,他们也会有一个 public IP。但是,public IP 在 O/S 级别 not 可见,即 ifconfig
或 ip 不可见。 public IP 由 AWS 在网络级别处理,在您或 O/S.
所以,先设计一个VPC,VPC既有public又有私有子网。在私有子网中启动的任何实例将自动仅获得一个私有 IP 地址。在 public 子网中启动的实例将自动分配一个私有 IP 地址 和 一个 public IP 地址。此外,对于您的 public IP 地址,如果您愿意,您可以分配一个弹性 IP,这将使您拥有一个静态 public IP 地址。如果您没有分配弹性 IP,则每次实例 stopped/started 时,它都会获得一个新的 public IP 地址,尽管私有 IP 地址将保持静态。
最后,如前所述,public 子网中的实例将同时具有 public 和私有 IP 地址。因此,如果您要将文件从同一 VPC 中的一个实例复制到另一个实例,只需使用私有 IP 地址即可。例如,要服务来自 Internet 的 Web 流量,您可以使用 public IP 地址。最后,您可以通过定义所有传入的 SSH 流量必须进入私有 IP 地址来增强安全性。这样,您要么需要在本地办公室(大概有 point-to-point VPN),要么必须启动 VPN 才能通过 SSH 登录实例。
这一切如何转化为 CloudFormation,我不知道。
一切正常。
诀窍是只在 EC2 实例中指定一个网络接口 - 然后可以设置 AssociatePublicIpAddress: true
- 并单独添加第二个网络接口。
Resources:
[...]
Host1:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: 'ami-02541b8af977f6cdd' # Amazon Linux x86
InstanceType: 't2.micro'
AvailabilityZone: !Select [0, !GetAZs '']
KeyName: !Ref KeyName
NetworkInterfaces:
- SubnetId: !Ref SubnetPublic
AssociatePublicIpAddress: true
DeleteOnTermination: true
DeviceIndex: '0'
GroupSet:
- !Ref SecurityGroup
Tags:
- Key: Name
Value: 'simple - host1'
Host1Eth1:
Type: 'AWS::EC2::NetworkInterface'
Properties:
SubnetId: !Ref SubnetPrivate
GroupSet:
- !Ref SecurityGroup
Tags:
- Key: Name
Value: 'simple - host1 eth1'
Host1Eth1Attachment:
Type: 'AWS::EC2::NetworkInterfaceAttachment'
Properties:
DeleteOnTermination: true
DeviceIndex: 1
NetworkInterfaceId: !Ref Host1Eth1
InstanceId: !Ref Host1
在我的配置中,eth0是从30.0.1.0/24分配的,eth1是从30.0.2.0/24分配的。
这是创建实例后的路由table:
default via 30.0.1.1 dev eth0
default via 30.0.2.1 dev eth1 metric 10001
30.0.1.0/24 dev eth0 proto kernel scope link src 30.0.1.145
30.0.2.0/24 dev eth1 proto kernel scope link src 30.0.2.251
169.254.169.254 dev eth0
这非常接近我的需要,只需要用实例用户数据稍微调整一下。
完整的 YAML 脚本:https://gist.github.com/kmansoft/c490e7958b8ff8f1d2eb14a6cd115f08