AWS SAM / Cloudformation“路径集成错误”错误

时间:2018-06-23 16:20:44

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

尝试部署lambda和API网关配置时出现以下错误

  

”路径/ profile / v1处的集成格式错误。(服务:   AmazonApiGateway;状态码:400;错误代码:BadRequestException”

什么会导致此错误以及如何解决。


swagger: '2.0'
info:
  version: v1
  title: ProfileAPI
paths:
  "/profile/v1":
    get:
      tags:
      - Values
      operationId: ProfileV1Get
      consumes: []
      produces:
      - text/plain
      - application/json
      - text/json
      parameters: []
      responses:
        '200':
          description: Success
          schema:
            type: array
            items:
              type: string
      x-amazon-apigateway-integration:
        httpMethod: post
        type: aws_proxy
        uri:
          Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ProfileFunction.Arn}/invocations
definitions: {}

1 个答案:

答案 0 :(得分:1)

获得了大家都可能感兴趣的与AWS Support一起使用的最终工作设置:

  

当我们在外部swagger模板中引用cloudformation资源详细信息时,我们没有获得资源详细信息,因此收到上述错误。例如:“ Fn :: Sub:arn:aws:apigateway:$ {AWS :: Region}:lambda:path / 2015-03-31 / functions / $ {LambdaFunction.Arn} / invocations“在您尝试时不起作用

使用资源:“ LambdaFunction.Arn”(这是CloudFormation资源)以大体上的定义创建API网关集成端点uri。

     

为了解决这些问题,我在cloudformation模板中进行了以下更改:

     

要在cloudformation模板中引用swagger文件,我在s3存储桶中上载了swagger模板,然后使用以下定义。我用过:

    ZazzoAPI:
        Type: AWS::Serverless::Api
        Properties:
            StageName: Prod
            Variables:
                LambdaFunctionName: !Ref LambdaFunction
            #Configure API settings and options
            MethodSettings: [{
                LoggingLevel: "INFO",
                MetricsEnabled: True ,
                HttpMethod: "GET",
                ResourcePath: "/"
            }]
            DefinitionBody:
                'Fn::Transform':
                  Name: 'AWS::Include'
                  Parameters:
                        Location: "s3://s3.code-deploy/swagger_SAM.yaml"
  

通过AWS :: Include转换,您可以创建对Amazon S3存储桶中转换片段的引用。它允许在外部swagger文件中引用cloudformation资源的详细信息。您可以参考[1]的文档,以获取有关“ AWS :: Include”转换的更多详细信息。

     

然后我检查了swagger模板,发现您使用的是简写形式来指定积分uri。但是,“ AWS :: Include”目前不支持使用文档[2]中提到的YAML代码片段的简写形式。因此,我使用了内在函数“ Fn :: Sub”,并且能够在其中引用所需的cloudformation参数。招摇模板。


先前的定义:

uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaFunction.Arn}/invocations”

新定义:

uri: 
      Fn::Sub: "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaFunction.Arn}/invocations"

参考文献:

  1. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/create-reusable-transform-function-snippets-and-add-to-your-template-with-aws-include-transform.html
  2. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/create-reusable-transform-function-snippets-and-add-to-your-template-with-aws-include-transform.html#aws-include-transform-remarks
  3. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html