0

API ゲートウェイにモデルを追加しました。(有効な JSON ではなく) 文字列を含む本文で POST 要求を送信すると、モデルは要求を検証します。断られると思っていました。

問題を示す次の 2 つのケースを試しました。

  1. モデルは「A_STRING」を検証します (不正な動作)
  2. モデルは「A_STRING」を検証します{} (不正な動作)
  3. モデルは失敗します {"A_STRING"} (正しい動作)

AWS コンソールから直接 API Gateway をテストしています (添付のスクリーンショットを参照)。1 つの例のログを次に示します。

Execution log for request b2b825b4-4fb2-43e6-935b-0781264eb5df
Mon Aug 17 21:45:42 UTC 2020 : Starting execution for request: b2b825b4-4fb2-43e6-935b-0781264eb5df
Mon Aug 17 21:45:42 UTC 2020 : HTTP Method: POST, Resource Path: /TrainingNotif
Mon Aug 17 21:45:42 UTC 2020 : Method request path: {}
Mon Aug 17 21:45:42 UTC 2020 : Method request query string: {}
Mon Aug 17 21:45:42 UTC 2020 : Method request headers: {}
Mon Aug 17 21:45:42 UTC 2020 : Method request body before transformations: "A_STRING"
Mon Aug 17 21:45:42 UTC 2020 : Request validation succeeded for content type application/json

ここで役立つ場合は、私のモデルです:

{
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-04/schema#",
  "required": 
  [
    "trainingSiteRequester",
    "employeeTrainingList"
  ],
  "properties": 
  {
    "trainingSiteRequester": 
    {
      "type": "string"
    },
    "employeeTrainingList": 
    {
      "type": "array",
      "items": 
      {
        "additionalProperties": false,
        "type": "object",
        "required": 
        [
          "id",
          "trainingURL",
          "dueDate"
        ],
        "properties": 
        {
          "trainingURL": 
          {
            "type": "string"
          },
          "dueDate": 
          {
            "type": "string"
          },
          "id": 
          {
            "type": "integer"
          }
        }
      }
    }
  }
}

ここで完成させるのは、モデルを API Gateay にアタッチする CloudFormation コードです。

PostMethod:
  Type: AWS::ApiGateway::Method
  Properties:
    AuthorizationType: AWS_IAM
    HttpMethod: POST
    RequestValidatorId: !Ref TrainingNotificationRequestValidator
    RequestModels:
      application/json: !Ref TrainingNotificationRequestModel
    Integration:
      Credentials: !GetAtt TrainingNotificationsAPIGatewayRole.Arn
      IntegrationHttpMethod: POST
      IntegrationResponses:
        - SelectionPattern: 200
          StatusCode: 200
        - SelectionPattern: 429
          StatusCode: 429
      PassthroughBehavior: NEVER
      RequestParameters:
        integration.request.querystring.Action: "'SendMessage'"
        integration.request.querystring.TopicArn: !Sub "'${ReceivedRequestsSNS}'"
        integration.request.querystring.Message: "method.request.body"
      RequestTemplates:
        application/json: "{\"statusCode\": 200}"
      Type: AWS
      Uri:
        Fn::Join:
          - ""
          - - "arn:aws:apigateway:"
            - Ref: AWS::Region
            - ":sns:action/Publish"
    MethodResponses:
      - StatusCode: 200
      - StatusCode: 429
      - StatusCode: 500
    ResourceId: !Ref TrainingNotificationsAPIGatewayResources
    RestApiId: !Ref TrainingNotificationsAPIGateway

# Request Model
TrainingNotificationRequestModel:
  Type: AWS::ApiGateway::Model
  Properties:
    RestApiId: !Ref TrainingNotificationsAPIGateway
    ContentType: application/json
    Name: TrainingNotificationRequestModel
    Schema:
      $schema: 'http://json-schema.org/draft-04/schema#'
      additionalProperties: false
      required:
        - trainingSiteRequester
        - employeeTrainingList
      properties:
        trainingSiteRequester:
          type: string
        employeeTrainingList:
          type: array
          items:
            type: object
            additionalProperties: false
            properties:
              id:
                type: integer
              trainingURL:
                type: string
              dueDate:
                type: string
            required:
              - id
              - trainingURL
              - dueDate

TrainingNotificationRequestValidator:
  Type: AWS::ApiGateway::RequestValidator
  Properties:
    RestApiId: !Ref TrainingNotificationsAPIGateway
    Name: TrainingNotificationRequestValidator
    ValidateRequestBody: true

ここに画像の説明を入力

4

1 に答える 1