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

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

我有一个带有 的 CloudFormation 模板LaunchConfigUserData我需要在 中引用正在创建的实例的公共 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

相关内容