Указан неверный параметр ключа кэша при включении кэширования для параметра пути в AWS API Gateway - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть серверный веб-API (API Gateway + Lambda), который я встроил в C # и развернул через Visual Studio.Это достигается с помощью файла serverless.yml, который автоматически создает шаблон CloudFormation, а затем этот шаблон применяется для создания стека API.

После развертывания моего стека я вошел в консоль AWS, чтобы включить кэширование для одного из параметров пути, но получаю эту ошибку:

! https://ibb.co/B4wmRRj

Мне известно об этом посте https://forums.aws.amazon.com/thread.jspa?messageID=711315&#711315, в котором подробно описана похожая, но другая проблема, когда пользователь не может снять кеширование.Моя проблема в том, что я не могу включить его с самого начала.Я также не понимаю, какие шаги были предприняты для решения проблемы в этом посте.Упоминается об использовании интерфейса командной строки AWS, но не указано, какие команды нужно использовать или что именно нужно делать.Я также немного читал о том, как включить кэширование через сам шаблон 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 голосов
/ 01 января 2019

- Начало обновления -

Причина, по которой вы получаете ошибку Invalid cache key parameter specified, потому что вы явно не выделили раздел параметров пути.

Это потому, что, хотя пользовательский интерфейс каким-то образом экстраполировал наличие параметра пути, он не был явно вызван в конфигурации шлюза 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, чтобы включить его, сообщите мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...