如何引用现有资源

时间:2017-03-02 16:21:34

标签: amazon-web-services amazon-cloudformation

我使用了cloudformation模板来创建MyAPIMyAPIGetMethodMyAPIDeployment

现在,我有一个单独的脚本,我将用它来创建阶段。像这样的东西。该脚本引发了一个错误,它不知道我在DeploymentIdRestApiId中使用了哪些资源。确切的错误是Template validation error: Template error: instance of Fn::GetAtt references undefined resource MyAPIDeployment

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters" : {
        "EnvType": {
            "Type": "String",
            "Default": "test",
            "AllowedValues": ["test", "prod"],
            "Description": "Select what stage need to be created"
        }
    },
    "Conditions":{
        "CreateProdStage" : {"Fn::Equals": [{"Ref":"EnvType"}, "prod"]},
        "CreateTestStage" : {"Fn::Equals": [{"Ref":"EnvType"}, "test"]}
    },
    "Resources": {
        "TestStage" : {
            "Type" : "AWS::ApiGateway::Stage",
            "Condition":"CreateTestStage",
            "Properties" : {
                "DeploymentId" : {"Fn::GetAtt" : ["MyAPIDeployment", "Arn"]},
                "Description" : "Test Stage",
                "RestApiId" : {"Fn::GetAtt" : ["MyAPI", "Arn"]},
                "StageName" : "test"
            }
        },
        "ProdStage" : {
            "Type" : "AWS::ApiGateway::Stage",
            "Condition":"CreateProdStage",
            "Properties" : {
                "DeploymentId" : {"Fn::GetAtt" : ["MyAPIDeployment", "Arn"]},
                "Description" : "Prod Stage",
                "RestApiId" : {"Fn::GetAtt" : ["MyAPI", "Arn"]},
                "StageName" : "prod",
                "MethodSettings":[{
                    "CachingEnabled":"true",
                    "HttpMethod":"GET",
                    "ResourcePath":"/",
                    "CacheTtlInSeconds":300,
                    "ThrottlingBurstLimit" : 2000,
                    "ThrottlingRateLimit" : 1000
                }]
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

要更好地理解为什么它不起作用,是因为您不能引用CloudFormation模板中不属于该模板的资源。由于资源MyAPIMyAPIGetMethodMyAPIDeployment不是创建阶段的模板的一部分,因此您无法引用它们。您只能引用参数,其他资源,条件,映射等,而不能引用在其他堆栈中创建的资源。

我的建议是在您创建了MyAPIMyAPIGetMethodMyAPIDeployment的示例模板上创建阶段,或者使用{ {1}}和DeploymentId值,然后使用RestApiId

我从您的模板中注意到的另一个错误是,RefDeploymentId的期望值是对应的id,而不是arn,因此请确保尝试使用id而不是arn在上面的代码段中执行。另请注意,未为RestApiIdAWS::ApiGateway::RestApiAWS::ApiGateway::RestApi定义函数GetAtt。从此资源返回值的唯一函数是AWS::ApiGateway::RestApi,它将返回其ID。