CloudFormation - 在Child Nested堆栈中访问父堆栈的输出

时间:2017-01-12 03:45:49

标签: amazon-cloudformation

我有一个主Cloudformation模板,可以调用两个子模板。我运行了第一个模板,并在资源的Outputs部分中捕获了输出。我已经尝试在嵌套的第二个模板中使用ChildStack01输出值,但我不确定为什么会得到Template format error: Unresolved resource dependencies [XYZ] in the Resources block of the template。这是我的主模板。

{
"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"]
        }
    }
}
}

这是My 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"
   }
}
}

3 个答案:

答案 0 :(得分:2)

仅输出是不够的,您需要输出该输出。 看这里:http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-exports.html 所以你需要这样的东西:

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

答案 1 :(得分:0)

错误来自test1.json(LambdaStack)。

Logical ID
An identifier for the current output. The logical ID must be alphanumeric (a-z, A-Z, 0-9) and unique within the template.

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

答案 2 :(得分:0)

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

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

Test2.json

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

相关问题