如何使用SAM通过API网关配置异步lambda调用?

时间:2018-11-14 08:07:51

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

我已使用SAM规范配置了与API Gateway的lambda代理集成,并通过传递X-Amz-Invocation-Type:“'Event'”标头异步调用了lambda

  ApiGateway:
      Type: AWS::Serverless::Api
      Properties:
        StageName: prod
        DefinitionBody:
          swagger: "2.0"
          info:
            title:
              Ref: AWS::StackName
            description: API endpoint for invoking LambdaFunction
            version: 1.0.0
          paths:
            /items:
              post:
                consumes: ["application/json"]
                produces: ["application/json"]
                responses: {}
                x-amazon-apigateway-integration:
                  type: "aws_proxy"
                  uri:
                    Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaFunction.Arn}/invocations
                  passthroughBehavior: "when_no_match"
                  httpMethod: "POST"
                  requestParameters:
                      integration.request.header.X-Amz-Invocation-Type: "'Event'"

问题是lambda返回空响应(调用异步),因此API Gateway引发以下错误

UTC 2018年11月14日星期三08:03:14:由于配置错误,执行失败:Lambda代理响应格式错误 UTC 2018年11月14日星期三08:03:14:方法完成,状态为502

这是预期的行为吗?我必须明确定义响应吗?我不想总是抛出200,因为我也想发送错误的请求和未授权的错误。如何避免此问题的解决方案是什么?

2 个答案:

答案 0 :(得分:0)

AWS Api Gateway 不允许这样做。

在使用异步集成时,必须取消选中此项才能非常具体。 enter image description here

另外,您不需要在请求中实际传递 X-Amz-Invocation-Type 标头。

遗憾的是,异步调用不适用于 lambda 代理 (aws_proxy) 集成类型。

答案 1 :(得分:-1)

SAM模板正在部署具有Lambda代理集成的API,将无法异步调用集成了Lambda的代理,因为响应为空,不在有效的return format for Lambda proxy integration中。

因此,要从API Gateway异步调用Lambda,请使用aws(自定义或非代理)类型集成,并设置X-Amz-Invocation-Type:“事件”标头。

您还可以authorize access to your API Gateway返回未经授权的访问错误。