我使用以下函数可以获取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
....
]
]
}
}
}
}
}
}
答案 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"
]
}
}
}