AWS SAM:REST API不包含任何方法

时间:2019-03-09 03:48:00

标签: amazon-web-services aws-lambda amazon-cloudformation aws-api-gateway aws-sam

我正在尝试使用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上,我确实在手动指定部署(herehere)时提到了此错误。就我而言,部署是隐式的,因此我认为我的问题有所不同。

我正在使用的代码基于SAM示例(here)。我挠头想了解我的堆栈出了什么问题。

是否有解决方案的指针?

1 个答案:

答案 0 :(得分:1)

正如错误消息所述,您尚未在Swagger中定义任何方法。我认为您的困惑在这里:

  

就我而言,部署是隐式的,因此我认为我的问题有所不同。

SAM确实会从在AWS :: Serverless :: Function资源上定义的Api事件的联合创建类型为AWS :: Serverless :: Api的隐式API,但前提是它们没有(通过RestApiId属性)引用到AWS您在模板中明确定义的:: Serverless :: Api资源。而就您而言,确实如此。

此外,您还提到您的模板基于“ api_swagger_cors”示例SAM模板here,但实际上您的模板与该示例之间有一个关键区别,即:在该示例中,Swagger YAML文件正在从S3存储桶中拉出;而在您的Swagger中,它是内联定义的,但未定义任何方法。

有关更多信息:

  • 请参见this关于隐式v显式API的答案(我也写过)。
  • 请参阅this页以了解Swagger的结构。