CloudFormation VPC GetAtt 参数内部失败

CloudFormation VPC GetAtt 参数内部失败

我有两个 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",

文档声称那:

  1. 使用 GetAtt 从 vpc ID 获取 CIDR 块应该可行
  2. 对于 Fn::GetAtt 属性名称,您可以使用 Ref 函数。

所以我不确定这种用法有什么问题......

答案1

第一个参数必须Fn::GetAtt是模板中定义的逻辑资源的名称,因此该字符串必须是模板内创建的资源之一。

使用 AWS 参数类型时,传递给模板的都是该资源的 id,因此 中包含的唯一值{"Ref": "AdminVPC"}将是类似 的值vpc-abc123。您不会将 VPC 传递给模板,而只是将其 id 传递给模板。

解决问题的方法是接受 CIDR 作为模板中的参数,创建 VPC 的模板应该有一个使用的输出{"Fn::GetAtt": ["AdminVPC", "CidrBlock"]}

相关内容