我有一个带有 的 CloudFormation 模板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" : ["", [
"..."
]]}}
}
},
答案1
如果您的 UserData 包含一个 shell 脚本,而您需要做的只是在该脚本中引用实例自己的公共 IP,则可以通过public-ipv4
查询实例元数据使用curl
或任何其他 http 实用程序:
curl http://169.254.169.254/latest/meta-data/public-ipv4
答案2
无法直接检索 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