当前位置: 首页 > 知识库问答 >
问题:

AWS SAM-通过SAM模板在API网关方法中执行请求验证

邵锐
2023-03-14

我正在开发一个SAM应用程序,它有一个lambda函数,API网关是事件源。APIendpoint是一种POST方法,要求在请求体中有一组参数。API网关通过使用AWS控制台指定请求模型,为我们提供了验证请求体的能力。

请参阅以下AWS控制台选项的屏幕截图:

我需要通过SAM模板设置类似的选项,能够将模型与请求主体链接,但无法设置请求验证程序选项,也无法找到任何文档或示例。

下面是我的SAM模板

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Description: SAM Template

Parameters: 
  Stage: 
    Type: String
    Default: dev

Resources:
  MyApiGateway:
    Type: AWS::Serverless::Api
    Properties:
      Name: My AWS Serverless API
      StageName: !Ref Stage
      Models: 
        ExchangeRate: 
          $schema: "http://json-schema.org/draft-04/schema#"
          properties: 
            base: 
              type: string
            target: 
              type: string
          required: 
            - base
            - target
          title: User
          type: object

  ExchangeRateFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: functions/exchange-rate/
      Handler: index.handler
      Runtime: nodejs12.x
      Description: Function to Get Currency Exchange Rate
      MemorySize: 128
      Timeout: 3
      Policies:
        - AWSLambdaBasicExecutionRole
      Events:
        HelloWorld:
          Type: Api
          Properties:
            RestApiId: !Ref MyApiGateway
            Path: /exchange
            Method: POST
            RequestModel:
              Model: ExchangeRate
              Required: true

Outputs:
  ExchangeRateFunction:
    Description: "Exchange Rate Lambda Function ARN"
    Value: !GetAtt ExchangeRateFunction.Arn
  MyApiGateway:
    Description: "My Seed API EndPoint"
    Value: !Sub "https://${MyApiGateway}.execute-api.${AWS::Region}.amazonaws.com/${Stage}"

参考文件

  • https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-api.html
  • https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-api.html

请让我知道如何使用SAM模板将“请求验证器”设置为“验证正文”选项。谢谢你的帮助

共有2个答案

壤驷深
2023-03-14

添加ValidateBody:true,即。

RequestModel:
 Model: ExchangeRate
 Required: true
 ValidateBody: true
暨修洁
2023-03-14

我也遇到了同样的问题,很明显,SAM有一段时间没有这个功能,正如你从前面的问题中看到的:

如何在AWS SAM模板中为AWS::无服务器::Api添加请求验证器?

此外,GitHub中还存在一些问题,最后一个问题是:

https://github.com/awslabs/serverless-application-model/issues/1403

我已经破解了一个解决方案,该解决方案在SAM规范中包含两个附加属性以解决此问题,但我不希望它实际成为PR。如果您希望使用我的分叉回购从开发分支部署,我可以提供进一步的说明。

 类似资料:
  • 我是AWS SAM的新手。我已经使用AWS web控制台实现了一个API网关,并在API方法请求中指定了主体验证,我希望使用SAM模板实现同样的功能。我对如何在API网关SAM模板中指定方法请求的搜索与此无关。需要帮忙吗?

  • 我试图使用AWS SAM将请求验证器资源链接到SAM模板中的无服务器API。我已经创建了请求验证器,并在其RestApiId中引用了API,但是验证器没有在AWS控制台中设置为API默认验证器选项。 验证程序被创建,如果我点击API上的RequestValidator下拉菜单,我可以看到它。但是,请求验证器并不默认为我定义的验证器。它只是将“无”作为所选选项的一个选项

  • 我想通过无服务器设置API网关的Request Validator。我尝试了两种不同的Request Validator设置。但是,两种方法都失败了。我已经总结了我所做的,所以如果有问题请告诉我。 我用swagger(OAS3.0)编写了API规范。因此,我尝试使用OAS扩展实现Request Validator的设置。在我使用下面的和部署了

  • 我试图向google calendar api发出POST请求,但我不知道如何对其进行身份验证。 我采取了以下步骤尝试并使用服务帐户执行此操作: > <代码>{“error”:{“errors”:[{“domain”:“global”,“reason”:“authError”,“message”:“Invalid Credentials”,“locationType”:“header”,“loca

  • 当我发送一个带有POST请求的正文时,我的模板映射似乎被有效负载覆盖了。 我有一个调用Lambda函数的API网关资源。Lambda函数很简单,它只是回显它接收到的内容。 这个名为echo的Lambda函数通过POST调用Lambda函数。POST方法有一个集成请求映射模板(直接来自文档): 当我在没有尸体的情况下提出请求时,我会得到我期望的答复: 但是,当我用主体发出请求时,模板映射不再工作:

  • 在AWS文档之后,我尝试使用以下http请求从api网关导出api定义。知道它为什么不起作用吗?