AWS CloudFormation: 如何输出一台机器的PublicIP?

12

我编写了一个CloudFormation模板,可以创建一个Linux Docker主机。

我希望在“Outputs”部分显示该机器的PublicIP。

以下是模板的相关部分:

"Outputs" : {
    "ServerAddress" : {
      "Value" : { "Fn::GetAtt" : [ "Server", "PublicDnsName" ] },
      "Description" : "Server Domain Name"
    },
    "SecurityGroup" : {
      "Value" : { "Fn::GetAtt" : [ "ServerSecurityGroup", "GroupId" ] },
      "Description" : "Server Security Group Id"
    },
    "PublicIp" : {
      "Value" : { "Fn::GetAtt" : [ "ServerPublicIp", "PublicIp" ]},
      "Description" : "Server's PublicIp Address"
    },
  }

我在AWS官方文档中读到关于使用“Fn :: GetAtt”的内容,并尝试在我的模板中实现它,但是当我尝试创建堆栈时,出现以下错误:

Error
Template validation error: Template error: instance of Fn::GetAtt references undefined resource ServerPublicIp

据我所知,GetAtt行中的第一部分是一个逻辑名称(我可以选择?),第二部分是上面链接中显示的实际属性。

那么我的问题是如何在Outputs部分中显示服务器的PublicIP?


ServerPublicIp 应该是您的 EC2 实例资源的名称,就像 Server 是您的 ServerAddress 输出的名称一样。 - Matt Houser
2个回答

18

假设您的模板中有一个名为Server的EC2实例资源:

"Server" : {
    "Type" : "AWS::EC2::Instance",
    "Properties" : {
    }
}
你需要引用资源名称来输出公共IP地址:
"Outputs" : {
    "PublicIp" : {
      "Value" : { "Fn::GetAtt" : [ "Server", "PublicIp" ]},
      "Description" : "Server's PublicIp Address"
    }
}

10

正如文档中所提到的,输出可以选择性地导出以进行跨堆栈引用。如果这是您的使用情况:

JSON:

"Outputs" : {
  "PublicIp" : {
    "Value" : { "Fn::GetAtt" : ["Server", "PublicIp"]},
    "Description" : "Server Public IP"
    "Export" : {
      "Name" : {"Fn::Sub": "${AWS::StackName}-PublicIP"}
    }
  }
}

YAML:

Outputs:
  PublicIp:
    Description: Server Public IP
    Value: !GetAtt Server.PublicIp
    Export:
      Name: !Sub "${AWS::StackName}-PublicIp"

另请参阅:

  • 文档中 AWS::EC2::Instance 属性和返回值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接