我使用了cloudformation模板来创建MyAPI
,MyAPIGetMethod
,MyAPIDeployment
。
现在,我有一个单独的脚本,我将用它来创建阶段。像这样的东西。该脚本引发了一个错误,它不知道我在DeploymentId
和RestApiId
中使用了哪些资源。确切的错误是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
}]
}
}
}
}
答案 0 :(得分:0)
要更好地理解为什么它不起作用,是因为您不能引用CloudFormation模板中不属于该模板的资源。由于资源MyAPI
,MyAPIGetMethod
,MyAPIDeployment
不是创建阶段的模板的一部分,因此您无法引用它们。您只能引用参数,其他资源,条件,映射等,而不能引用在其他堆栈中创建的资源。
我的建议是在您创建了MyAPI
,MyAPIGetMethod
,MyAPIDeployment
的示例模板上创建阶段,或者使用{ {1}}和DeploymentId
值,然后使用RestApiId
。
我从您的模板中注意到的另一个错误是,Ref
和DeploymentId
的期望值是对应的id,而不是arn,因此请确保尝试使用id而不是arn在上面的代码段中执行。另请注意,未为RestApiId
,AWS::ApiGateway::RestApi
或AWS::ApiGateway::RestApi
定义函数GetAtt。从此资源返回值的唯一函数是AWS::ApiGateway::RestApi
,它将返回其ID。