我有一个带有LaunchConfig
. 在UserData
我需要引用正在创建的实例的公共 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,您可以通过使用或任何其他 http 实用程序查询实例元数据
public-ipv4
的类别来获取此值:curl
无法直接检索 Auto Scaling 组生成的 EC2 实例的公共 IP 地址。原因是 EC2 实例不受 CloudFormation 模板管理。该模板不了解 EC2 实例。
不过,有几个解决方法。
选项 1:分配和分配弹性 IP 地址。
与其检测自动分配的 IP 地址,不如分配一个弹性 IP 地址并将其分配到您的 EC2 实例的用户数据中,并让 EC2 实例通过其启动脚本将其分配给自己。
如果您的 Auto Scaling 组仅创建一个 EC2 实例,这将非常简单。它仍然可以使用 2 个或更多 EC2 实例来完成,但您必须创建一个弹性 IP 地址池以从中提取。
选项 2:使用包含您的 EC2 实例 IP 地址的自定义数据的 WaitCondition。
创建您的 CloudFormation 模板等待的 WaitCondition。在您的 EC2 实例中,让它检索它自己的公共 IP 地址,然后在它准备好时发出 WaitCondition 信号。让它在信号的“数据”字段中包含 IP 地址。
参考资料:http ://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-waitcondition.html