繁体   English   中英

AWS EC2 - 多个(公共/私有)网络接口

[英]AWS EC2 - multiple (public / private) network interfaces

AWS新手在这里。 我正在尝试创建一个包含多个 EC2 节点的堆栈,每个节点都应该有两个网络接口。

一个接口应该是公共的并连接到 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 人,但我想我在这里看到了问题。 只指定了一个实例。 正确的? 但是您指定了两个子网。 一个实例只能在一个子网中。

所有实例,无论它们位于公共子网还是私有子网中,都将具有私有 IP 地址。 如果它们在公共子网中,它们也将具有公共 IP。 但是,公共 IP 在 O/S 级别将可见,即ifconfig或 ip 不可见。 公共 IP 由 AWS 在网络级别处理,您或操作系统看不到。

因此,首先设计一个 VPC,该 VPC 将同时具有公有子网和私有子网。 在私有子网中启动的任何实例都将自动获得一个私有 IP 地址。 在公共子网中启动的实例将自动分配一个私有 IP 地址一个公共 IP 地址。 此外,对于您的公共 IP 地址,如果您愿意,您可以分配一个弹性 IP,这将允许您拥有一个静态公共 IP 地址。 如果您没有分配弹性 IP,那么每次停止/启动实例时,它都会获得一个新的公共 IP 地址,但私有 IP 地址将保持静态。

最后,如前所述,公共子网中的实例将同时具有公共和私有 IP 地址。 因此,如果您要将文件从一个实例复制到同一 VPC 中的另一个实例,只需使用私有 IP 地址。 例如,要为来自 Internet 的 Web 流量提供服务,您可以使用公共 IP 地址。 最后,您可以通过定义所有传入的 SSH 流量必须进入私有 IP 地址来增强安全性。 这样,您要么需要在本地办公室(大概有点对点 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 分配。

这是创建实例后的路由表:

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 

这非常接近我的需要,只需要使用 Instance UserData 稍微调整一下。

完整的 YAML 脚本: https ://gist.github.com/kmansoft/c490e7958b8ff8f1d2eb14a6cd115f08

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM