簡體   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