Запрос AWS GET с отклоненным телом CloudFront - PullRequest
0 голосов
/ 15 декабря 2018

Я создаю API, используя AWS SAM (Lambda & API Gateway), контракт которого определяется третьей стороной.

Третья сторона вызывает мой API с помощью запроса GET, который содержит JSON в теле.Однако когда запрос отправляется в API с телом, он отклоняется CloudFront.

Это запрос:

curl -X GET -H "Content-Type: application/json" --data '{"hello":"world"}' https://my-api.execute-api.us-east-2.amazonaws.com/Prod/my-api

Это ответ:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

    
        
        ERROR: The request could not be satisfied
    
    
        403 ERROR
        The request could not be satisfied.
        
Bad request.


        
Generated by cloudfront (CloudFront) Request ID: 1p0St_-e3noQL-2uMxeB_2I6lkMr1mg5afvxJRmVpCdnG67Vgnhj9w==

При проверке журналов запрос никогда не попадает в шлюз API или функцию Lambda.Однако, если я удаляю тело из запроса, то оно попадает в функцию Lambda, и я получаю соответствующее сообщение об ошибке от API (сообщающее вызывающей стороне, что ожидаемое тело отсутствует.)

curl -X GET -H "Content-Type: application/json" https://my-api.execute-api.us-east-2.amazonaws.com/Prod/my-api

I 'используя базовую конфигурацию шлюза API через шаблон SAM.Это соответствующий раздел:

MyApiFunction:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: bin/main.zip
    Handler: main
    Runtime: go1.x
    Tracing: Active
    Role: !Sub ${MyApiLambdaExecutorRole.Arn}
    Events:
      CatchAll:
        Type: Api
        Properties:
          Path: /my-api
          Method: GET

1 Ответ

0 голосов
/ 15 декабря 2018

GET запросы не могут содержать тело запроса.Попробуйте вместо этого использовать POST.

Если вы хотите отправить ограниченные данные в запросе GET, вы можете использовать параметры запроса.

Вы можете увидеть в Лямбда-документах AWS, что это невозможно здесь:

https://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-lambda-non-proxy-integration.html

Это потому, что отправленный вами запрос GET не можетпринять полезную нагрузку и не проходит проверку запроса.

Возможно, вы можете использовать экземпляр EC2 или другой сервис, который не использует API-шлюз для обработки запроса.

...