Amazon cloudformation CloudFormation-访问子嵌套堆栈中父堆栈的输出

Amazon cloudformation CloudFormation-访问子嵌套堆栈中父堆栈的输出,amazon-cloudformation,Amazon Cloudformation,我有一个主Cloudformation模板,它调用两个子模板。我运行了第一个模板,并在资源的Outputs部分捕获了输出。在嵌套的第二个模板中使用ChildStack01输出值时,我做了很多尝试,我不确定为什么会在模板的Resources块中出现模板格式错误:未解析的资源依赖项[XYZ]。这是我的主模板 { "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "LambdaStack": { "Type": "

我有一个主
Cloudformation
模板,它调用两个子模板。我运行了第一个模板,并在资源的
Outputs
部分捕获了输出。在嵌套的第二个模板中使用ChildStack01输出值时,我做了很多尝试,我不确定为什么会在模板的Resources块中出现
模板格式错误:未解析的资源依赖项[XYZ]。这是我的主模板

{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
    "LambdaStack": {
        "Type": "AWS::CloudFormation::Stack",
        "Properties": {
            "TemplateURL": "https://s3.amazonaws.com/bucket1/cloudformation/Test1.json",
            "TimeoutInMinutes": "60"
        }
    },
    "PermissionsStack": {
        "Type": "AWS::CloudFormation::Stack",
        "Properties": {
            "TemplateURL": "https://s3.amazonaws.com/bucket1/cloudformation/Test2.json",
            "Parameters": {
                "LambdaTest": {
                    "Fn::GetAtt": ["LambdaStack", "Outputs.LambdaTest"]
                }
            },
            "TimeoutInMinutes": "60"
        }
    }
}
}
这是我的Test1.json模板

{
"Resources": {
    "LambdaTestRes": {
        "Type": "AWS::Lambda::Function",
        "Properties": {
            "Description": "Testing AWS cloud formation",
            "FunctionName": "LambdaTest",
            "Handler": "lambda_handler.lambda_handler",
            "MemorySize": 128,
            "Role": "arn:aws:iam::3423435234235:role/lambda_role",
            "Runtime": "python2.7",
            "Timeout": 300,
            "Code": {
                "S3Bucket": "bucket1",
                "S3Key": "cloudformation/XYZ.zip"
            }
        }
    }
},
"Outputs": {
    "LambdaTest": {
        "Value": {
            "Fn::GetAtt": ["LambdaTestRes", "Arn"]
        }
    }
}
}
下面是我的Test2.json,它必须使用Test1.json的输出

{
"Resources": {
    "LambdaPermissionLambdaTest": {
        "Type": "AWS::Lambda::Permission",
        "Properties": {
            "Action": "lambda:invokeFunction",
            "FunctionName": {
                "Ref": "LambdaTest"
            },
            "Principal": "apigateway.amazonaws.com",
            "SourceArn": {
                "Fn::Join": ["", ["arn:aws:execute-api:", {
                    "Ref": "AWS::Region"
                }, ":", {
                    "Ref": "AWS::AccountId"
                }, ":", {
                    "Ref": "TestAPI"
                }, "/*"]]
            }
        }
    }
},
"Parameters": {
   "LambdaTest": {
       "Type": "String"
   }
}
}

错误来自test1.json(LambdaStack)


似乎您有两个同名的逻辑ID“LambdaTest”,一个在资源部分,另一个在输出部分。

错误来自test1.json(LambdaStack)

您似乎有两个同名的逻辑ID“LambdaTest”,一个在资源部分,另一个在输出部分。

您在
Test2.json
中有两个未解析的资源依赖项,一个到
LambdaTest
,一个到
TestAPI

对于
LambdaTest
,您似乎试图将其作为父堆栈中的参数传递,但尚未将其指定为子
Test2.json
模板中的输入参数。在
Test2.json
的部分中添加一个条目,如下所示:

"Parameters": {
  "LambdaTest": {
    "Type": "String"
  }
},
关于
TestAPI
,此引用似乎不会出现在模板中的任何其他地方,因此您应该直接将其指定为固定字符串,或者在
Test2.json
堆栈中添加另一个输入参数(见上文)然后从父堆栈提供它。

Test2.json
中有两个未解析的资源依赖项,一个到
LambdaTest
,一个到
TestAPI

对于
LambdaTest
,您似乎试图将其作为父堆栈中的参数传递,但尚未将其指定为子
Test2.json
模板中的输入参数。在
Test2.json
的部分中添加一个条目,如下所示:

"Parameters": {
  "LambdaTest": {
    "Type": "String"
  }
},

关于
TestAPI
,此引用似乎不会出现在模板中的任何其他地方,因此您应该直接将其指定为固定字符串,或者在
Test2.json
堆栈(见上文)中添加另一个输入参数,然后从父堆栈提供它。

仅具有输出是不够的,您需要导出该输出。 看这里: 所以你需要一些类似的东西:

"Outputs": {
    "LambdaTest": {
        "Value": {
            "Fn::GetAtt": ["LambdaTestRes", "Arn"]
        }
        "Export": {
            "Name": "LambdaTest"
        }
    }
}

仅仅有输出是不够的,您需要导出该输出。 看这里: 所以你需要一些类似的东西:

"Outputs": {
    "LambdaTest": {
        "Value": {
            "Fn::GetAtt": ["LambdaTestRes", "Arn"]
        }
        "Export": {
            "Name": "LambdaTest"
        }
    }
}

看不出错误是从哪里来的。为了再次检查,您已经在参数部分的test2.json中包含了参数LambdaTest?虽然通常也使用输出。自动在该模板中包含依赖项,但是您可以尝试在test2.json中使用DependsOn来确保吗?这取决于工作情况,但是如果我们使用嵌套模板格式,则会动态创建堆栈名,并在其中嵌入一些资源ID。因此,我们不知道前面的模板名称是什么。看不到错误来自何处。为了再次检查,您已经在参数部分的test2.json中包含了参数LambdaTest?虽然通常也使用输出。自动在该模板中包含依赖项,但是您可以尝试在test2.json中使用DependsOn来确保吗?这取决于工作情况,但是如果我们使用嵌套模板格式,则会动态创建堆栈名,并在其中嵌入一些资源ID。所以,我们不知道前面的模板名是什么,我知道TestAPI,但是,我将LambdaTest作为参数从父堆栈传递,并在子堆栈中访问它。否则我应该如何引用该参数。如何在Test2.json中声明参数。@Zzz您在子堆栈中声明一个输入参数,就像在任何CloudFormation模板中一样,使用一个部分-参见编辑。添加了这个参数,但仍然没有成功。真的不知道引用有什么问题。我现在得到了“模板错误:Fn::GetAtt引用未定义的资源LambdaTest的实例”@Zzz我已经自己测试了你问题中的当前代码,它成功地创建了所有3个堆栈,因此你正在运行的代码一定与你在这里发布的不同。检查您使用的模板是否与问题中的源代码完全匹配,然后再次检查。如果堆栈创建仍然不起作用,请将CloudFormation控制台中“模板”选项卡中的文本以及确切的错误消息复制/粘贴到中,然后粘贴链接。希望这有帮助。我知道TestAPI,但是,我将LambdaTest作为参数从父堆栈传递,并在子堆栈中访问它。否则我应该如何引用该参数。如何在Test2.json中声明参数。@Zzz您在子堆栈中声明一个输入参数,就像在任何CloudFormation模板中一样,使用一个部分-参见编辑。添加了这个参数,但仍然没有成功。真的不知道引用有什么问题。我现在得到了“模板错误:Fn::GetAtt引用未定义的资源LambdaTest的实例”@Zzz我已经自己测试了你问题中的当前代码,它成功地创建了所有3个堆栈,因此你正在运行的代码一定与你在这里发布的不同。检查您使用的模板是否与问题中的源代码完全匹配,然后再次检查。如果堆栈创建仍然不起作用,请将CloudFormation控制台中“模板”选项卡中的文本以及确切的错误消息复制/粘贴到中,然后粘贴链接。希望这有帮助。