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

Ita*_*not 4 amazon-web-services aws-cloudformation

我写了一个CloudFormation模板,它创建了一个linux docker主机.

我想在"输出"部分下显示机器的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"
    },
  }
Run Code Online (Sandbox Code Playgroud)

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

Error
Template validation error: Template error: instance of Fn::GetAtt references undefined resource ServerPublicIp
Run Code Online (Sandbox Code Playgroud)

据我所知,GetAtt行的第一部分是LogicalName(我可以选择?),第二部分是上面链接中显示的真实属性.

所以我的问题是如何在Outputs部分下显示服务器的PublicIP?

Mat*_*ser 12

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

"Server" : {
    "Type" : "AWS::EC2::Instance",
    "Properties" : {
    }
}
Run Code Online (Sandbox Code Playgroud)

您输出引用它的资源名称的公共IP地址:

"Outputs" : {
    "PublicIp" : {
      "Value" : { "Fn::GetAtt" : [ "Server", "PublicIp" ]},
      "Description" : "Server's PublicIp Address"
    }
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*vey 8

文档中所述,可以选择导出输出以进行跨堆栈引用。如果这是您的用例:

JSON:

"Outputs" : {
  "PublicIp" : {
    "Value" : { "Fn::GetAtt" : ["Server", "PublicIp"]},
    "Description" : "Server Public IP"
    "Export" : {
      "Name" : {"Fn::Sub": "${AWS::StackName}-PublicIP"}
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

YAML:

Outputs:
  PublicIp:
    Description: Server Public IP
    Value: !GetAtt Server.PublicIp
    Export:
      Name: !Sub "${AWS::StackName}-PublicIp"
Run Code Online (Sandbox Code Playgroud)

也可以看看: