我有两个 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 verify 时,只会产生以下消息
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 函数。
所以我不确定这种用法有什么问题......
答案1
第一个参数必须Fn::GetAtt
是模板中定义的逻辑资源的名称,因此该字符串必须是模板内创建的资源之一。
使用 AWS 参数类型时,传递给模板的都是该资源的 id,因此 中包含的唯一值{"Ref": "AdminVPC"}
将是类似 的值vpc-abc123
。您不会将 VPC 传递给模板,而只是将其 id 传递给模板。
解决问题的方法是接受 CIDR 作为模板中的参数,创建 VPC 的模板应该有一个使用的输出{"Fn::GetAtt": ["AdminVPC", "CidrBlock"]}