我有两个 Cloudformation 文件用于制作两个不同的堆栈,每个堆栈都包含一个 VPC。一个是管理 VPC,它将用于通过 ssh 访问另一个 VPC 以及所有这些,典型的堡垒用例。
我启动了管理 VPC,然后将其 ID 作为参数传递到第二个 CF 文件中,具体使用 VPC Id 类型:
"AdminVPC": {
"Description": "ID of the admin VPC",
"Type": "AWS::EC2::VPC::Id"
}
但是当我尝试设置 VPC 的网络 ACL 时,我正在做
"Type": "AWS::EC2::NetworkAclEntry",
"Properties": {
"CidrBlock": {
"Fn::GetAtt": [
{
"Ref": "AdminVPC"
},
"CidrBlock"
]
},
其中,当我运行 ecs cf validate 时,只产生消息
An error occurred (ValidationError) when calling the ValidateTemplate operation: Internal Failure
如果我只是在 CIDR 块中硬编码,它就可以正常工作
"CidrBlock": "0.0.0.0/0",
但是文档声称:
- 使用 GetAtt 从 vpc ID 中获取 CIDR 块应该可以工作
- 对于 Fn::GetAtt 属性名称,您可以使用 Ref 函数。
所以我不确定这种用法有什么问题......
的第一个参数
Fn::GetAtt
必须是模板中定义的逻辑资源的名称,因此字符串必须是模板中创建的资源之一。使用 AWS 参数类型时,传递给模板的所有参数都是该资源的 id,因此其中包含的唯一值
{"Ref": "AdminVPC"}
是vpc-abc123
. 您不会将 VPC 传递给模板,只需将其 id 传递给模板。您的问题的解决方案是将 CIDR 作为参数接受到模板中,创建 VPC 的模板应该具有使用的输出
{"Fn::GetAtt": ["AdminVPC", "CidrBlock"]}