在AWS API Gateway中启用路径参数的缓存时指定了无效的缓存键参数

时间:2018-12-30 23:10:03

标签: c# amazon-web-services caching aws-api-gateway

我有一个无服务器Web API(API网关+ Lambda),我已经用C#内置并通过Visual Studio进行了部署。这是通过serverless.yml文件实现的,该文件自动创建CloudFormation模板,然后将该模板应用于创建API堆栈。

部署完堆栈后,我进入了AWS控制台以对其中一个路径参数启用缓存,但是出现此错误:

https://ibb.co/B4wmRRj

我知道这篇帖子https://forums.aws.amazon.com/thread.jspa?messageID=711315&#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/" }
    }
  }

1 个答案:

答案 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}

enter image description here

-更新结束-

您在这里。我仍然没有您确切的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://medium.com/@dougmoscrop/i-set-up-api-gateway-caching-here-are-some-things-that-surprised-me-7526d954fbe6

https://serverless.com/framework/docs/providers/aws/events/apigateway#request-parameters

PS-如果您仍然需要CLI步骤来启用它,请告诉我。