Как создать функцию Python шлюза AWS Lambda / API, которая принимает файл PDF в качестве входных данных, используя multipart / form-data? - PullRequest
0 голосов
/ 10 февраля 2019

Я уже давно борюсь с этим.Мне нужно создать ресурс в API-шлюзе, связывающий с лямбда-функцией, которая принимает файл PDF в качестве входных данных, отправляемых как POST-запрос multipart / form-data.Для простоты, я просто сейчас возвращаю файл.

Когда я пытаюсь вызвать API со следующим скручиванием, я получаю Внутренняя ошибка сервера от AWS.Кому-нибудь удалось отправить файл pdf в Lambda без необходимости использовать трюк S3 (загрузить на S3)?

Заранее всем спасибо за любые подсказки.

Команды /Файлы:

curl

curl -vvv -X POST -H "Content-Type: multipart/form-data" -F "content=@file.pdf" https://...MYAPIHERE.../pdf

В настоящее время я использую serverless и python3.

Ниже приведены мои файлы:

Servelerlss.yaml

function:
  pdf:
    handler: handler.pdf
    events:
      - http:
          path: /pdf
          method: post 
          integration: lambda
          request:
            template:
              application/json: "$input.json('$')"
          response:
            headers:
              Content-Type: "'aplication/json'"

handler.py

def pdf(event, context):
    pdf = event.get('content')
    out = {'statusCode': 200,
           'isBase64Encoded': False,
           'headers': {"content-type": "application/json"},
           'body': json.dumps({
               'input':  pdf,
               'inputType': 'url',
               #'tags': list(tags.keys()),
               'error': None})}
    return(out)

1 Ответ

0 голосов
/ 12 февраля 2019

Мне, наконец, удалось решить эту проблему после большого количества Google и с помощью команды поддержки AWS.

Оказывается, что API-шлюз проверяет заголовки: "Content-Type" или "Accept" ввходящий запрос и сопоставляет его с настройками Binary Media Type , чтобы определить, какая полезная нагрузка считается двоичной.Это означает, что нам нужно указать два типа контента (multipart / form-data, application / pdf) как Бинарный тип мультимедиа .

Это можно сделать с помощью без обслуживания, используя serverless-apigw-binary и добавление их в serverless.yaml :

plugins:
  - serverless-apigw-binary 

custom:
  apigwBinary:
    types:           #list of mime-types
      - 'multipart/form-data'
      - 'application/pdf'

Но поскольку lambda ожидает полезную нагрузку в формате application / json отAPI-шлюз, двоичные данные не могут быть переданы напрямую.Поэтому параметры ContentHandling должны быть установлены на «CONVERT_TO_TEXT».В файле yaml это выглядит так:

contentHandling: CONVERT_TO_TEXT

Окончательный улов был решен Крисом Голсоном в serverless-thumbnail .Спасибо тебе за это, Крис.Мне просто интересно, как ты это сделал ...


Serverless.yaml

plugins:
  - serverless-apigw-binary 

custom:
  apigwBinary:
    types:           #list of mime-types
      - 'multipart/form-data'
      - 'application/pdf'

function:
  pdf:
    handler: handler.pdf
    events:
      - http:
          path: /pdf
          method: post 
          integration: lambda
          request:
            contentHandling: CONVERT_TO_TEXT
            passThrough: WHEN_NO_TEMPLATES
            template:
              application/pdf: "{'body': $input.json('$')}"
              multipart/form-data: "{'body': $input.json('$')}"
          response:
            contentHandling: CONVERT_TO_BINARY
            headers:
              Content-Type: "'aplication/json'"
...