AWS SAM: REST API не содержит никаких методов - PullRequest
1 голос
/ 09 марта 2019

Я пытаюсь использовать AWS SAM для развертывания простого API.Когда API прост (то есть не указывает явно API-шлюз).развертывание выполнено успешно.

Однако следующее развертывание завершается неудачно:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Sample API

Parameters: 
  Stage:
    Type: String
    AllowedValues: 
      - dev
      - sat
      - demo
      - staging
      - prod
    Description: Enter dev, sat, demo, staging or prod

Resources:

  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: !Ref Stage
      EndpointConfiguration: PRIVATE
      DefinitionBody:
        swagger: '2.0'
        x-amazon-apigateway-policy:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Principal: "*"
              Action: execute-api:Invoke
              Resource:
                - !Sub arn:aws:execute-api:*:*:*/${Stage}/*

  ThumbnailFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Runtime: nodejs8.10
      Handler: get-config.handler
      CodeUri: ./functions
      Events:
        ThumbnailApi:
          Type: Api
          Properties:
            RestApiId: !Ref MyApi
            Path: /thumbnail
            Method: GET

Сообщение об ошибке выглядит следующим образом:

The REST API doesn't contain any methods (Service: AmazonApiGateway;
Status Code: 400; Error Code: BadRequestException

Глядя на Google, я нахожу упоминанияэтой ошибки при указании развертывания вручную ( здесь или здесь ).В моем случае развертывание неявное, поэтому я предполагаю, что моя проблема в другом.

Код, который я использую, основан на примере SAM ( здесь ).Я ломаю голову, чтобы понять, что не так с моим стеком.

Есть какие-нибудь указатели на решение?

1 Ответ

2 голосов
/ 09 марта 2019

Как и в сообщении об ошибке, вы не определили никаких методов в своем Swagger.Я думаю, что ваша путаница здесь:

В моем случае развертывание неявное, поэтому я предполагаю, что моя проблема в другом.

SAM создает неявные API типа AWS:: Serverless :: Api из объединения событий Api, определенных в AWS :: Serverless :: Function resources - но только если они не ссылаются (через свойство RestApiId) на ресурс AWS :: Serverless :: Api, который вы определили явнов шаблоне.И в вашем случае это так.

Кроме того, вы упоминаете, что ваш шаблон основан на примере шаблона SAM "api_swagger_cors" здесь , но на самом деле между вами иэтот пример, а именно: в этом примере файл YAML Swagger извлекается из корзины S3;тогда как в вашем, ваш Swagger определен встроенным, но он не определяет никаких методов.

Для получения дополнительной информации:

  • См. этот ответ на неявный vявные API (я тоже это писал).
  • См. эту страницу для структуры Swagger.
...