【问题标题】:Invalid cache key parameter specified when enabling caching for a path parameter in AWS API Gateway在 AWS API Gateway 中为路径参数启用缓存时指定的缓存键参数无效
【发布时间】:2019-05-27 16:11:40
【问题描述】:

我有一个使用 C# 构建并通过 Visual Studio 部署的无服务器 Web API(API Gateway + Lambda)。这是通过自动创建 CloudFormation 模板的 serverless.yml 文件实现的,然后应用该模板来创建 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/" }
    }
  }

【问题讨论】:

  • 你能分享你的 serverless.yml 文件的 sn-p 吗?我可以通过 cli 给你答案,但想看看 serverless.yml 是否可行。
  • 添加到原始问题。整个模板实际上只是重复了类似于上面的方法,在 url 的末尾有一个输出。

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


【解决方案1】:

--更新开始--

原因,您收到Invalid cache key parameter specified 错误是因为您没有明确突出显示路径参数部分。

这是因为,尽管 UI 以某种方式推断存在 path 参数,在 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 的下一个资源部分将失败。注意 - boolean true 表示路径参数是必需的。明确突出显示路径参数后,您应该也可以通过控制台启用缓存,而无需 resources 部分。

request:
    parameters:
        paths:
            tableid: true

第 2 点。资源部分告诉 API Gateway 在 tableid 路径参数上启用缓存。这不过是对 CloudFormation 模板语法的无服务器解释。我是怎么知道我必须使用ApiGatewayMethodKataTableGetTableidVarGet 才能使它工作的?只需阅读以下指南和提示即可获得名称。

https://serverless.com/framework/docs/providers/aws/guide/resources/

提示:如果您不确定资源的命名方式,您希望 从您的自定义资源中引用,您可以发出无服务器 包裹。这将为您的服务创建 CloudFormation 模板 在 .serverless 文件夹中(它被命名为 cloudformation-template-update-stack.json)。只需打开文件并 检查生成的资源名称。

以上是什么意思? - 首先运行serverless package without resources 部分并在目录中找到.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 步骤来启用它,请告诉我。

【讨论】:

  • 谢谢伊姆兰,我会仔细检查所有这些。不过,我可以问一个问题 - 我通过控制台的方法是错误的吗?或者控制台中是否存在某种错误/缺陷,不允许通过它设置缓存?
  • 原因,控制台失败是因为您没有在 yaml 中指定我的 Point 1 部分。检查我分享的中篇文章,作者得到了同样的错误,他给出了理由。至少我是这么想的。一旦您也能够解决问题。请投票并接受答案!。
  • @JamesMatson 我能够复制控制台错误并更新了我的答案。让我知道!!。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 2018-02-25
  • 2019-03-22
相关资源
最近更新 更多