如果设置了弹性IP,CloudFormation PublicDnsName将返回错误的值

时间:2013-11-06 03:52:39

标签: amazon-web-services amazon-cloudformation

我使用以下函数可以获取PublicDnsName:

        {
         "Fn::GetAtt": [
           "EC2Instance",
           "PublicDnsName"
         ]
       }

但是,在我将静态ip分配给实例后,上面的函数 SOMETIMES 返回新的PublicDnsName,有时它返回 PublicDnsName(在我们分配静态IP之前的dns名称。

你以前见过这个问题吗?我正在试图找出原因。请让我知道似乎是什么问题或我应该如何解决它。感谢。

以下是我的部分CloudFormation模板:

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "Graphite and StatsD",
  "Parameters": {
    "InstanceType": {
      "Type": "String",
      "Default": "m1.xlarge"
    }
  },
  "Mappings": {
    "RegionMap": {
      "us-east-1": {
        "AMI": "ami-5ffaa636",
        "RecordSetName": "ue1"
      },
      "us-west-1": {
        "AMI": "ami-4ad8ef0f",
        "RecordSetName": "uw1"
      },
      "us-west-2": {
        "AMI": "ami-66049d56",
        "RecordSetName": "uw2"
      },
      "eu-west-1": {
        "AMI": "ami-861bfbf1",
        "RecordSetName": "ew1"
      },
      "ap-southeast-1": {
        "AMI": "ami-42134610",
        "RecordSetName": "as1"
      },
      "ap-southeast-2": {
        "AMI": "ami-c98b17f3",
        "RecordSetName": "as2"
      },
      "ap-northeast-1": {
        "AMI": "ami-0733a806",
        "RecordSetName": "an1"
      },
      "sa-east-1": {
        "AMI": "ami-2bac0a36",
        "RecordSetName": "se1"
      }
    }
  },
  "Resources": {
    "ElasticIP": {
      "Type": "AWS::EC2::EIP"
    },
    "EIPAssociation": {
      "Type": "AWS::EC2::EIPAssociation",
      "Properties": {
        "InstanceId": {
          "Ref": "EC2Instance"
        },
        "EIP": {
          "Ref": "ElasticIP"
        }
      }
    },
    "DNSRecords": {
      "Type": "AWS::Route53::RecordSetGroup",
      "Properties": {
        "HostedZoneName": "mydomain.com.",
        "RecordSets": [
          {
            "Name": {
              "Fn::Join": [
                "",
                [
                  "graphite-",
                  {
                    "Fn::FindInMap": [
                      "RegionMap",
                      {
                        "Ref": "AWS::Region"
                      },
                      "RecordSetName"
                    ]
                  },
                  ".mydomain.com"
                ]
              ]
            },
            "Type": "CNAME",
            "TTL": "300",
            "ResourceRecords": [
              {
                "Fn::GetAtt": [
                  "EC2Instance",
                  "PublicDnsName"
                ]
              }
            ]
          }
        ]
      }
    },
    "EC2Instance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "KeyName": "MyKeyName",
        "SecurityGroups": [
          "MySecurityGroup"
        ],
        "ImageId": {
          "Fn::FindInMap": [
            "RegionMap",
            {
              "Ref": "AWS::Region"
            },
            "AMI"
          ]
        },
        "InstanceType": {
          "Ref": "InstanceType"
        },
        "Tags": [
          {
            "Key": "Name",
            "Value": "graphite-statsd"
          }
        ],
        "UserData": {
          "Fn::Base64": {
            "Fn::Join": [
              "",
              [
                ....
                VERY LONG SHELL INSTALL SCRIPT
                ....
              ]
            ]
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:5)

我发现我必须使用http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html来确保首先要创建哪些资源。

在这种情况下,我想确保在调用DNSRecords资源之前首先创建我的ElasticIP资源,EC2Instance资源和EIPAssociation资源。

  {
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Graphite and StatsD",
    "Parameters": {
      "InstanceType": {
        "Type": "String",
        "Default": "m1.xlarge"
      }
    },
    "Mappings": {
      "RegionMap": {
        "us-east-1": {
          "AMI": "ami-5ffaa636",
          "ShortName": "ue1"
        },
        "us-west-1": {
          "AMI": "ami-4ad8ef0f",
          "ShortName": "uw1"
        },
        "us-west-2": {
          "AMI": "ami-66049d56",
          "ShortName": "uw2"
        },
        "eu-west-1": {
          "AMI": "ami-861bfbf1",
          "ShortName": "ew1"
        },
        "ap-southeast-1": {
          "AMI": "ami-42134610",
          "ShortName": "as1"
        },
        "ap-southeast-2": {
          "AMI": "ami-c98b17f3",
          "ShortName": "as2"
        },
        "ap-northeast-1": {
          "AMI": "ami-0733a806",
          "ShortName": "an1"
        },
        "sa-east-1": {
          "AMI": "ami-2bac0a36",
          "ShortName": "se1"
        }
      }
    },
    "Resources": {
      "ElasticIP": {
        "Type": "AWS::EC2::EIP"
      },
      "EC2Instance": {
        "Type": "AWS::EC2::Instance",
        "Properties": {
          "KeyName": "MyKeyName",
          "SecurityGroups": [
            "MySecurityGroup",
          ],
          "ImageId": {
            "Fn::FindInMap": [
              "RegionMap",
              {
                "Ref": "AWS::Region"
              },
              "AMI"
            ]
          },
          "InstanceType": {
            "Ref": "InstanceType"
          },
          "Tags": [
            {
              "Key": "Name",
              "Value": "graphite-statsd"
            }
          ],
          "UserData": {
            "Fn::Base64": {
              "Fn::Join": [
                "",
                [
                  ....
                  VERY LONG SHELL INSTALL SCRIPT
                  ....
                ]
              ]
            }
          }
        },
        "DependsOn": [
          "ElasticIP"
        ]
      },
      "EIPAssociation": {
        "Type": "AWS::EC2::EIPAssociation",
        "Properties": {
          "InstanceId": {
            "Ref": "EC2Instance"
          },
          "EIP": {
            "Ref": "ElasticIP"
          }
        },
        "DependsOn": [
          "ElasticIP",
          "EC2Instance"
        ]
      },
      "DNSRecords": {
        "Type": "AWS::Route53::RecordSetGroup",
        "Properties": {
          "HostedZoneName": "mydomain.com.",
          "RecordSets": [
            {
              "Name": {
                "Fn::Join": [
                  "",
                  [
                    "graphite-",
                    {
                      "Fn::FindInMap": [
                        "RegionMap",
                        {
                          "Ref": "AWS::Region"
                        },
                        "ShortName"
                      ]
                    },
                    ".mydomain.com"
                  ]
                ]
              },
              "Type": "CNAME",
              "TTL": "300",
              "ResourceRecords": [
                {
                  "Fn::GetAtt": [
                    "EC2Instance",
                    "PublicDnsName"
                  ]
                }
              ]
            }
          ]
        },
        "DependsOn": [
          "EIPAssociation"
        ]
      }
    }
  }