微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AWS 文档模型和响应处理?

如何解决AWS 文档模型和响应处理?

我正在尝试找出为我的 Lambda 函数和 API 网关定义响应/请求模型的最佳方法

我想达到什么目的?

我想要的是将我的所有模型存储在我的 git 存储库中以用于请求和响应,这些将使用 serverless-aws-documentation 插件部署到 API Gateway。

假设存在 500/400 错误,响应将使用此模型而非代码进行格式化。让我们专注于错误响应,这应该是这样的:

"Error": {
  "type": "object","properties": {
    "message": {
      "type": "string"
    },"type": {
      "type": "string"
    },"request-id": {
      "type": "string"
    }
  }
}

我目前拥有的

下面是我现在拥有的,它在我的 API 网关上创建模型就好了,但是我目前正在代码中格式化响应,理想情况下我会在这里抛出异常并让模型处理格式化?

unresolvedVariablesNotificationMode: error
useDotenv: true

provider:
  name: aws
  profile: ${opt:aws-profile,'sandBox'}
  region: eu-west-2
  stage: ${opt:stage,'dev'}
  lambdaHashingVersion: 20201221
  environment:
    TABLE_PREFIX: ${self:provider.stage}-${self:service}-
    API_ROOT: ${self:custom.domains.${self:provider.stage}}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:DescribeTable
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource:
        - Fn::GetAtt:
          - enquiriesTable
          - Arn
        - Fn::GetAtt:
          - vehiclesTable
          - Arn
plugins:
  - serverless-api-gateway-throttling
  - serverless-associate-waf
#  - serverless-domain-manager
  - serverless-reqvalidator-plugin
  - serverless-aws-documentation
  - serverless-webpack
  - serverless-dynamodb-local
  - serverless-offline

custom:
  apiGatewayThrottling:
    maxRequestsPerSecond: 10
    maxConcurrentRequests: 5
  webpack:
    includeModules: true
  dynamodb:
    stages: [ dev ]
    start:
      migrate: true
  documentation:
    models:
      -
        name: "ErrorResponse"
        description: "This is how an error would return"
        contentType: "application/json"
        schema: ${file(models/Error.json)}

functions:
  createEnquiry:
    handler: src/services/enquiries/create.handler
    environment:
      API_ROOT: ${self:custom.domains.${self:provider.stage}}
    events:
      - http:
          path: /
          method: POST
          reqvalidatorName: onlyParameters
          documentation:
            requestModels:
              "application/json": "CreateRequest"
            methodResponses:
              -
                statusCode: "400"
                responseModels:
                  "application/json": "ErrorResponse"
resources:
  Resources:
    onlyParameters:
      Type: "AWS::ApiGateway::RequestValidator"
      Properties:
        Name: "only-parameters"
        RestApiId:
          Ref: ApiGatewayRestApi
        ValidateRequestBody: true
        ValidateRequestParameters: true
    enquiriesTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${self:provider.stage}-${self:service}-enquiries
        AttributeDeFinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        BillingMode: PAY_PER_REQUEST
    vehiclesTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${self:provider.stage}-${self:service}-vehicles
        AttributeDeFinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        BillingMode: PAY_PER_REQUEST

有人能指出我正确的方向来实现我正在尝试的目标吗?因此,要在存储库中定义模型,并让这些模型定义响应而不是节点。

更新

刚刚尝试了以下from this link

functions:
  createEnquiry:
    handler: src/services/enquiries/create.handler
    environment:
      API_ROOT: ${self:custom.domains.${self:provider.stage}}
    events:
      - http:
          path: /
          method: POST
          reqvalidatorName: onlyParameters
          x-amazon-apigateway-integration:
            responses:
              ".*httpStatus\\\":404.*":
                statusCode: 404,responseTemplates:
                  application/json: "#set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage')))\n#set ($bodyObj = $util.parseJson($input.body))\n{\n  \"type\" : \"$errorMessageObj.errorType\",\n  \"message\" : \"$errorMessageObj.message\",\n  \"request-id\" : \"$errorMessageObj.requestId\"\n}"
export const handler: APIGatewayProxyHandler = async (event) => {
  return {
    statusCode: 400,body: 'Enquiry already exists'
  }

这仍然只是以字符串形式返回以下响应:

Enquiryalreadyexists

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。