我对这个很困惑。
99% 的情况下,CloudFormation 都能很好地为您提供一些可用的调试消息,但是“无效的请求”让我很困惑,特别是当资源一开始就很简单的时候。
这就是给我带来问题的资源(模板由 Ansible 生成,因此有 {{ ... }} 符号),
"DatabaseDNSRecord": {
"Type": "AWS::Route53::RecordSet",
"Properties": {
"HostedZoneId": "HOSTED_ZONE_ID",
"Name": "db.{{ item.env_name|lower }}v2.<DOMAIN>.com.",
"ResourceRecords": [
{
"Fn::GetAtt": [ "Database", "Endpoint.Address" ]
}
],
"Type": "CNAME"
},
"DependsOn": "Database"
}
据我从文档中了解,所需的一切都存在、正确且格式正确。
我唯一能想到的是我添加此资源现存的我之前创建的 CloudFormation 堆栈已经创建了Database
资源,根据记录,它是AWS::RDS::DBInstance
(如果需要,也很乐意发布该资源模板,没什么特别的)。
知道为什么我会收到“无效请求”吗?
谢谢。
编辑:我尝试过,有和没有TTL
,都是同样的错误。
答案1
事实证明我没试过TTL
和 DependsOn
。
适用于这两者。
答案2
除了 TTL 和 DependsOn 之外,主要思想是确保系统不会尝试使用不存在的引用来创建记录集。
因此,DependsOn 不仅必须存在,还必须列出 RecordSetGroup 定义中引用的所有资源(负载均衡器、其他 DNS 条目、ENI 等)。这将确保 cloudformation 延迟创建 DNS 记录,直到满足先决条件为止。
答案3
我有类似的问题,我刚刚设置了TTL
属性,它运行良好,似乎TTL
属性对于这样的记录集是必须的。
我没有使用,DependsOn
因为记录集依赖于"ResourceRecords" : [ { "Fn::GetAtt" : [ "ApplicationRds" , "Endpoint.Address" ] } ],
“ApplicationRds”资源,所以我看不出使用有什么好处DependsOn
答案4
如果在创建记录时发生同样的错误做有一TTL
组,检查它们是否不是ALIAS
类型记录,因为它们必须不是有一个 TLL(因为它是从 复制而来的AliasTarget
)。