我正在尝试使用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上,我确实在手动指定部署(here或here)时提到了此错误。就我而言,部署是隐式的,因此我认为我的问题有所不同。
我正在使用的代码基于SAM示例(here)。我挠头想了解我的堆栈出了什么问题。
是否有解决方案的指针?
答案 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中,它是内联定义的,但未定义任何方法。
有关更多信息: