AWS CloudFormation - 兩個網路介面,一個帶有 EIP
我是 AWS 新手。嘗試創建具有兩個網路介面的 EC2 實例,一個應該是公共的,另一個應該是私有的。
這是我在 YAML 模板中嘗試過的內容:
- 創建具有兩個子網的 VPC
- 僅使用私有網路介面創建實例
- 創建第二個(公共)網路介面作為另一個 YAML 實體
- 將第二個網路介面附加到實例
- 創建 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: Host1Eth1Attachment
到ElasticIPAssociation
, 以確保順序與我在控制台中關聯 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::EIPAssociation
說InstanceId
“必需:條件”-“對於 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