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控制台中“模板”选项卡中的文本以及确切的错误消息复制/粘贴到中,然后粘贴链接。希望这有帮助。