如何在cloudformation中访问EC2实例的IP

时间:2019-07-17 11:49:03

标签: amazon-web-services amazon-ec2 amazon-cloudformation

之前曾问过类似的问题,但我找不到我的问题的确切答案...

我在UserData部分中定义了一个需要访问其自己的公共IP的EC2实例:

  "MyEC2Instance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      "SubnetId": {
        "Fn::ImportValue": {
          "Fn::Sub": "${NetworkStackName}-SubnetID"
        }
      },
      "ImageId": "ami-xxxx",
      "InstanceType": { "Ref": "InstanceTypeParameter" },
      "IamInstanceProfile": { "Ref": "MasterInstanceProfile" },
      "UserData": {
        "Fn::Base64": {
          "Fn::Join": [
            "",
            [
              "#!/bin/bash -v\n",
              " PUBLIC_IP=",
              {
                "Fn::GetAtt": ["MyEC2Instance", "PublicIp"]
              },
              " /usr/local/bin/docker-compose -f /docker-compose.yml up -d\n"
            ]
          ]
        }
      }
    }

通常可以很容易地通过"Fn::GetAtt": ["MyEC2Instance", "PublicIp"]访问它,但是在这种情况下,这会引发“循环依赖错误”-确保这样做确实有意义,但是我该如何解决呢?

1 个答案:

答案 0 :(得分:6)

公共ip在创建后已分配给EC2实例,因此无法在其用户数据中呈现它。
您可以使用instance metadata获取公共ipv4以及其他实例属性。

PUBLIC_IP=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4)