我有一个无服务器Web API(API网关+ Lambda),我已经用C#内置并通过Visual Studio进行了部署。这是通过serverless.yml文件实现的,该文件自动创建CloudFormation模板,然后将该模板应用于创建API堆栈。
部署完堆栈后,我进入了AWS控制台以对其中一个路径参数启用缓存,但是出现此错误:
我知道这篇帖子https://forums.aws.amazon.com/thread.jspa?messageID=711315򭪓详细介绍了一个类似但不同的问题,用户无法取消选中缓存。我的问题是我无法使其开始。我也不理解提供的解决该帖子中问题的步骤。这里提到了使用AWS CLI的方法,但没有提到要使用的命令或要执行的操作。我还读了一些有关如何通过serverless.yml模板本身或云形成启用缓存的内容,但是我在网上发现的示例似乎与我的无服务器文件或生成的CF模板的结构没有任何关系。 。 (如果需要,我可以提供示例)。我只希望能够对路径参数启用缓存。我已经能够在API阶段全局启用缓存,但是除非我可以使缓存对不同的路径参数敏感,否则这将无济于事。
serverless.yml
"GetTableResponse" : {
"Type" : "AWS::Serverless::Function",
"Properties": {
"Handler": "AWSServerlessInSiteDataGw::AWSServerlessInSiteDataGw.Functions::GetTableResponse",
"Runtime": "dotnetcore2.0",
"CodeUri": "",
"MemorySize": 256,
"Timeout": 30,
"Role": null,
"Policies": [ "AWSLambdaBasicExecutionRole","AWSLambdaVPCAccessExecutionRole","AmazonSSMFullAccess"],
"Events": {
"PutResource": {
"Type": "Api",
"Properties": {
"Path": "kata/table/get/{tableid}",
"Method": "GET"
}
}
}
}
}
},
"Outputs" : {
"ApiURL" : {
"Description" : "API endpoint URL for Prod environment",
"Value" : { "Fn::Sub" : "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/" }
}
}
答案 0 :(得分:0)
原因是您得到Invalid cache key parameter specified
错误,因为您没有明确突出显示路径参数部分。
这是因为,尽管UI以某种方式推断存在一个 路径参数,尚未在API中明确调用 网关配置。
我在下面进行了测试,并能够在控制台上复制行为。要解决此问题,请按照我的Point 1
部分的完整答案。
functions:
katatable:
handler: handler.katatable
events:
- http:
method: get
path: kata/table/get/{tableid}
您在这里。我仍然没有您确切的serverless.yml,因此我创建了一个与您相似的样本并进行了测试。
serverless.yml
functions:
katatable:
handler: handler.katatable
events:
- http:
method: get
path: kata/table/get/{tableid}
request:
parameters:
paths:
tableid: true
resources:
Resources:
ApiGatewayMethodKataTableGetTableidVarGet:
Properties:
Integration:
CacheKeyParameters:
- method.request.path.tableid
上面应该使tableid
路径参数被缓存。
说明:
第1点。您必须确保在方法和路径之后的事件中创建了以下部分,否则CacheKeyParameters的下一个资源部分将失败。注意-布尔值true
表示必须使用path参数。明确突出显示路径参数后,您也应该能够通过控制台启用缓存,而无需使用resources
部分。
request:
parameters:
paths:
tableid: true
第2点。资源部分告诉API网关对tableid
路径参数启用缓存。这无非是CloudFormation模板语法的无服务器解释。我如何得知必须使用ApiGatewayMethodKataTableGetTableidVarGet
才能使其正常工作?只需阅读以下指南并提示即可获得名称。
https://serverless.com/framework/docs/providers/aws/guide/resources/
提示:如果不确定如何命名资源,则要 从您的自定义资源中引用,您可以发出无服务器 包。这将为您的服务创建CloudFormation模板 在.serverless文件夹中(名为 cloudformation-template-update-stack.json)。只需打开文件并 检查生成的资源名称。
以上是什么意思? -首先运行serverless package
(不带资源)部分,并在目录中找到.serverless
文件夹并打开上述json文件。寻找AWS::ApiGateway::Method
。您将获得可以在资源部分中使用的确切的规范化名称(ApiGatewayMethodKataTableGetTableidVarGet
)语法。
这是我使用的一些参考文献。
https://serverless.com/framework/docs/providers/aws/events/apigateway#request-parameters
PS-如果您仍然需要CLI步骤来启用它,请告诉我。