Fn :: GetAtt中的AWS Cloudformation Fn :: ImportValue

Mik*_*nko 5 amazon-web-services aws-cloudformation

是否可以在Fn :: GetAtt中使用Fn :: ImportValue。目前,我正在尝试执行以下操作

    "ParentId": {
       "Fn::GetAtt": [
          {
            "Fn::ImportValue": {
               "Fn::Sub": "${ParentStack}:RestApi"
             }
          },
          "RootResourceId"
       ]
    }
Run Code Online (Sandbox Code Playgroud)

但是我面临一个错误。“模板错误:每个Fn :: GetAtt对象都需要两个非空参数,即资源名称和资源属性”。

小智 6

就目前而言,不可能在“ Fn :: GetAtt”块中包含“ Fn :: ImportValue”。我对此的最好解释是,您要获取其属性值的资源不在当前模板的范围内。

您可以尝试从“父”模板中导出您感兴趣的所有属性值。

因此,您的父模板将如下所示:

"Outputs" : {
  "RestApi": {
    "Value" : { "Ref": "RestApi" },
    "Export" : { "Name": "RestApi" }
  },
  "RestApiRootResourceId": {
    "Value" : { "Fn::GetAtt": ["RestApi", "RootResourceId"] },
    "Export" : { "Name" : "RestApiRootResourceId" }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,在子模板中,您可以从父模板引用API根资源ID:

"Resources" : {
  "XApiResource": {
    "Type": "AWS::ApiGateway::Resource",
    "Properties": {
      "RestApiId": {"Fn::ImportValue" : "RestApi"},
      "ParentId": {"Fn::ImportValue" : "RestApiRootResourceId"},
      "PathPart": "apiPath"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Mil*_*les 1

尽管它有点复杂,但语法看起来是正确的,因此问题可能是第一个参数解析为空值(因为第二个参数显然是您所说的字符串)。

您可以尝试通过删除堆栈中失败的任何部分、创建堆栈的输出并查看它是否有值来确定是否是这种情况。

就像是:

"Outputs" : {
    "ParentStack" : {
        "Value" : "Fn::Ref": "ParentStack"
    },
    "ParentStackRestAPI" : {
        "Value" : "Fn::Sub": "${ParentStack}:RestApi"
    },
    "ImportedValue" : {
        "Value" : "Fn::ImportValue": {
            "Fn::Sub": "${ParentStack}:RestApi"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)