Шаблон AWS SAM - локальное тестирование - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть шаблон AWS SAM, который я пытаюсь проверить локально, а затем развернуть.Локальный тест выполняется (sam local start-api), но полезная нагрузка не проверена.Это означает, что у меня есть RequestValidator, но он ничего не проверяет.

Затем я пытаюсь развернуть файл YAML в AWS для тестирования там, и я получаю сообщение об ошибке:

"Не удалось создать набор изменений: Сбой Waiter ChangeSetCreateComplete: Официант обнаружил состояние сбоя терминала. Состояние: СБОЙ. Причина: Сбой преобразования AWS :: Serverless-2016-10-31 с: Недопустимый документ спецификации приложения без сервера. Номернайденных ошибок: 1. Недопустимый ресурс с идентификатором [BoilerPlateFunction]. Недопустимое событие с идентификатором [ApiEvent]. Свойство RestApiId события Api должно ссылаться на действительный ресурс в том же шаблоне. "

Thisмой файл yaml, поэтому сначала я хочу, чтобы у меня была возможность заставить RequestValidator работать в моем локальном компьютере, и когда это будет сделано, узнать, что я делаю неправильно и почему я не могу развернуть:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-app

  Sample SAM Template for sam-app

Globals:
  Function:
    Timeout: 20
Parameters:
  operationName:
    Type: String
    Default: testoperationName
  restApiName:
    Type: String
    Default: testrestApiName
  validatorName:
    Type: String
    Default: testvalidatorName
  validateRequestBody:
    Type: String
    Default: testvalidateRequestBody
  validateRequestParameters:
    Type: String
    Default: true
Resources:
  BoilerPlateApi:
    Type: AWS::ApiGateway::Api
    Properties:
      Name: !Ref restApiName
  BoilerPlateFunctionMethod:
    Type: AWS::ApiGateway::Method
    Properties:
      HttpMethod: ANY
      RestApiId: !Ref BoilerPlateApi
      RequestValidatorId: !Ref RequestValidator
      RequestParameters:
        method.request.querystring.test: true
  RequestValidator:
    Type: AWS::ApiGateway::RequestValidator
    Properties:
      Name: !Ref validatorName
      RestApiId: !Ref BoilerPlateApi
      ValidateRequestParameters: !Ref validateRequestParameters
  BoilerPlateFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: boilerplate/apiName
      Handler: index.handler
      Runtime: nodejs8.10
      Events:
        ApiEvent:
          Type: Api
          Properties:
            RestApiId: !Ref BoilerPlateApi
            Path: /hello
            Method: GET

Итак, опять же, он запускается с использованием sam local start-api, я могу попасть в конечную точку, и Lambda выполняется.Но я ожидаю, что API-шлюз выдаст ошибку, если я не включу параметр «test» в строку запроса, но он этого не сделает, он пропустит его.

Спасибо, ребята!

1 Ответ

0 голосов
/ 04 июня 2019

Функция была создана до API-шлюза.Вы можете использовать параметр DependsOn для создания API перед методом

Итак, просто измените следующее в ресурсе BoilerPlateFunction на:

  BoilerPlateFunction:
    DependsOn:
      - BoilerPlateApi
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: boilerplate/apiName
      Handler: index.handler
      Runtime: nodejs8.10
      Events:
        ApiEvent:
          Type: Api
          Properties:
            RestApiId: !Ref BoilerPlateApi
            Path: /hello
            Method: GET
...