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