如何在使用LaunchConfig时在CloudFormation模板中获取实例的公有IP

我有一个LaunchConfig模板。 在UserData我需要引用正在创build的实例的公共IP。 我想使用Fn::GetAtt ,但它需要逻辑名称,我不知道如何使用LaunchConfig定义它。

 "LaunchConfig": { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Metadata" : {"..."}, "Properties": { "ImageId" : "...", "InstanceType" : { "Ref" : "InstanceType" }, "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], "KeyName" : { "Ref" : "KeyName" }, "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "..." ]]}} } }, 

如果您的UserData包含一个shell脚本,并且您只需在该脚本中引用该实例的公有IP,则可以通过使用curl或任何其他http实用程序查询实例元数据的public-ipv4类别来获取此值:

 curl http://169.254.169.254/latest/meta-data/public-ipv4 

无法直接检索由Auto Scaling组生成的EC2实例的公有IP地址。 原因是EC2实例不是由CloudFormation模板pipe理的。 该模板不知道EC2实例。

虽然有一些解决方法。

选项1:分配并分配一个弹性IP地址。

分配弹性IP地址并将其分配到您的EC2实例的用户数据中,并让EC2实例通过其启动脚本将其分配给自己,而不是检测自动分配的IP地址。

如果您的Auto Scaling组仅创build一个EC2实例,那么做下一步就很简单。 它仍然可以使用2个或更多EC2实例完成,但是您将不得不创build一个弹性IP地址池以从中拉取。

选项2:对包含EC2实例IP地址的自定义数据使用WaitCondition。

创build一个CloudFormation模板等待的WaitCondition。 在您的EC2实例中,让它检索自己的公共IP地址,然后在准备就绪时发出WaitCondition信号。 在信号的“数据”字段中包含IP地址。

参考文献: http : //docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-waitcondition.html