Amazon-Web-Services

AWS CloudFormation - 兩個網路介面,一個帶有 EIP

  • May 13, 2022

我是 AWS 新手。嘗試創建具有兩個網路介面的 EC2 實例,一個應該是公共的,另一個應該是私有的。

這是我在 YAML 模板中嘗試過的內容:

  1. 創建具有兩個子網的 VPC
  2. 僅使用私有網路介面創建實例
  3. 創建第二個(公共)網路介面作為另一個 YAML 實體
  4. 將第二個網路介面附加到實例
  5. 創建 EIP 並將其與第二個網路介面關聯

公共網路介面必須創建為一個單獨的實體,因為我需要在 EIP 關聯節中引用它。

Properties:
[...]
 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 SubnetPrivate
       DeleteOnTermination: true
       DeviceIndex: '0'
       GroupSet:
       - !Ref SecurityGroup
     Tags:
     - Key: Name
       Value: 'simple - host1'
 Host1Eth1:
   Type: 'AWS::EC2::NetworkInterface'
   Properties:
     SubnetId: !Ref SubnetPublic
     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
 ElasticIP:
   Type: 'AWS::EC2::EIP'
   Properties:
     Domain: vpc
   DependsOn: VPCGatewayAttachment
 ElasticIPAssociation:
   Type: 'AWS::EC2::EIPAssociation'
   Properties:
     EIP: !Ref ElasticIP
     InstanceId: !Ref Host1
     NetworkInterfaceId: !Ref Host1Eth1

完整的 YAML 文件可在此處獲得:https ://gist.github.com/kmansoft/6b90b33bcf91eb0d493414ed6c3d9754

問題:

創建堆棧後,該實例在控制台中將 EIP 列為其公共 IP,並且有一個 DNS 名稱。但是,我無法使用 SSH(通過主機名或 IP)連接到實例。

奇怪的是,如果我從 YAML 文件中省略 EIP 並使用 AWS 控制台手動創建和關聯它,那麼一切正常。

有關如何使用 YAML 使公共 EIP 工作的任何建議?


更新:我嘗試添加DependsOn: Host1Eth1AttachmentElasticIPAssociation, 以確保順序與我在控制台中關聯 EIP 時的順序相同。

得到這個錯誤:

有多個介面附加到實例“i-020622d0cf13e5185”。請改為指定操作的介面 ID。

即使我ElasticIPAssociation確實指定了一個NetworkInterfaceId(和一個InstanceId)。


更新 2:我嘗試將我的更改ElasticIPAssociation為:

 ElasticIPAssociation:
   Type: 'AWS::EC2::EIPAssociation'
   Properties:
     EIP: !Ref ElasticIP
     NetworkInterfaceId: !Ref Host1Eth1
   DependsOn: Host1Eth1Attachment

刪除InstanceId. 得到一個不同的錯誤:

在屬性中找不到 InstanceId

這很奇怪,文件AWS::EC2::EIPAssociationInstanceId“必需:條件”-“對於 EC2-VPC,您可以指定實例 ID 或網路介面 ID,但不能同時指定兩者。”

看起來像 CloudFormation 錯誤?


更新 3

這 - 來自 EC2 文件 - 有效。

 PublicEIPAssociate:
   Type: 'AWS::EC2::EIPAssociation'
   Properties:
     AllocationId: !GetAtt PublicEIP.AllocationId
     NetworkInterfaceId: !Ref InterfacePublic

請注意,這裡沒有InstanceId(因為 Instance 有兩個網路介面,所以它不會起作用)。

還要注意這個用途AllocationId而不是EIP指 EIP。

文件是這樣說的AllocationId:“這是 EC2-VPC 所必需的”。因為EIP它說“這是 EC2-Classic 所必需的”。我正在使用 EC2-VPC,所以切換到AllocationId有意義並最終工作。

經過快速測試,我認為您可能發現了一個錯誤。我可能是錯的,我沒有花很長時間。報告此錯誤的最簡單方法是訪問EIPAssociation CloudFormation 頁面並提供回饋。在您的範例中提供電子郵件,或在 SF 上引用此問題。

您說得對,文件說指定和 InstanceID 或 NetworkInterfaceID 但是當您僅提供介面 ID 時,它會要求提供實例 ID。如果您添加 InstanceID,它會告訴您將其刪除。

小點,根據文件,EIP的NetworkInterfaceID需要參考“網路介面的ID”。!Ref 對 AWS::EC2::NetworkInterface 的返回值是名稱,因此您需要獲取 ID 屬性。如果 CloudFormation 中沒有錯誤,那將很重要。

ElasticIPAssociation:
 Type: 'AWS::EC2::EIPAssociation'
 Properties:
   EIP: !Ref ElasticIP
   InstanceId: !Ref Host1
   NetworkInterfaceId: !GetAtt Host1Eth1.Id

引用自:https://serverfault.com/questions/1100707