API 网关 SAM 指定 HTTP GET:500 内部服务器错误
API Gateway SAM specify HTTP GET: 500 Internal Server Error
当我尝试调用我使用 SAM 定义的 GET 端点时,我总是得到 500 Internal Server Error
。
我能够定义一个有效的 POST 请求。
对于 GET 请求,它向我显示:
Lambda invocation failed with status: 403
Execution failed due to configuration error:
我认为我定义 API 网关的 DefinitionBody 的地方有问题。
Globals:
Api:
Cors:
AllowMethods: "'GET,POST,OPTIONS'"
AllowHeaders: "'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'"
AllowOrigin: "'*'"
Resources:
getFunction:
Type: 'AWS::Serverless::Function'
Properties:
...
Events:
GetApi:
Type: Api
Properties:
Path: /tips
Method: GET
RestApiId: !Ref MyApi
MyApi:
Type: AWS::Serverless::Api
Properties:
StageName: dev
EndpointConfiguration: REGIONAL
DefinitionBody:
swagger: "2.0"
info:
title: "API"
paths:
/tips:
get:
x-amazon-apigateway-integration:
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${getFunction.Arn}/invocations
responses: {}
httpMethod: "POST"
type: "aws_proxy"
我已经尝试将 x-amazon-apigateway-integration 上的 httpMethod 更改为 "GET" 但这并没有解决我的问题。
在 AWS Lambda 控制台中,我看到 Lambda 和 Api 网关已链接,但我无法通过 API 网关调用 Lambda。我可以通过控制台中的测试事件成功执行我的 Lambda。这绝对是 API 网关方面的东西。
有人可以验证我做错了什么吗?
进一步挖掘后,我发现我必须像这样实现 /tips
路径的 GET
方法:
get:
responses:
'200':
description: 200 response
headers:
Content-Type:
type: string
produces:
- application/json
x-amazon-apigateway-integration:
uri:
Fn::Sub: "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${getTipsFunction.Arn}/invocations"
passthroughBehavior: when_no_match
responses:
default:
statusCode: 200
responseParameters:
method.response.header.Content-Type: integration.response.header.content-type
httpMethod: POST
type: aws
这解决了问题。
当我尝试调用我使用 SAM 定义的 GET 端点时,我总是得到 500 Internal Server Error
。
我能够定义一个有效的 POST 请求。
对于 GET 请求,它向我显示:
Lambda invocation failed with status: 403
Execution failed due to configuration error:
我认为我定义 API 网关的 DefinitionBody 的地方有问题。
Globals:
Api:
Cors:
AllowMethods: "'GET,POST,OPTIONS'"
AllowHeaders: "'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'"
AllowOrigin: "'*'"
Resources:
getFunction:
Type: 'AWS::Serverless::Function'
Properties:
...
Events:
GetApi:
Type: Api
Properties:
Path: /tips
Method: GET
RestApiId: !Ref MyApi
MyApi:
Type: AWS::Serverless::Api
Properties:
StageName: dev
EndpointConfiguration: REGIONAL
DefinitionBody:
swagger: "2.0"
info:
title: "API"
paths:
/tips:
get:
x-amazon-apigateway-integration:
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${getFunction.Arn}/invocations
responses: {}
httpMethod: "POST"
type: "aws_proxy"
我已经尝试将 x-amazon-apigateway-integration 上的 httpMethod 更改为 "GET" 但这并没有解决我的问题。
在 AWS Lambda 控制台中,我看到 Lambda 和 Api 网关已链接,但我无法通过 API 网关调用 Lambda。我可以通过控制台中的测试事件成功执行我的 Lambda。这绝对是 API 网关方面的东西。
有人可以验证我做错了什么吗?
进一步挖掘后,我发现我必须像这样实现 /tips
路径的 GET
方法:
get:
responses:
'200':
description: 200 response
headers:
Content-Type:
type: string
produces:
- application/json
x-amazon-apigateway-integration:
uri:
Fn::Sub: "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${getTipsFunction.Arn}/invocations"
passthroughBehavior: when_no_match
responses:
default:
statusCode: 200
responseParameters:
method.response.header.Content-Type: integration.response.header.content-type
httpMethod: POST
type: aws
这解决了问题。