Как вернуть поток из AWS ApiGateway?

Может ли кто-нибудь сказать мне, как вернуть поток из шлюза AWS Api? Мой API вызывает лямбду, написанную на C#, которая успешно возвращает строку, но я не знаю, как изменить ее, чтобы она возвращала поток. Мне это нужно, потому что он будет использоваться для загрузки заархивированного файла размером 100 МБ.

Это упрощенная версия моего текущего обработчика лямбда.

    public APIGatewayHttpApiV2ProxyResponse MainHandler(APIGatewayProxyRequest request, ILambdaContext context)
    {
        ...
        var response = new APIGatewayHttpApiV2ProxyResponse
        {
            StatusCode = (int)HttpStatusCode.OK,
            Body = "MainHandler was called",
            Headers = new Dictionary<string, string> { { "Content-Type", "text/plain" } }
        };

        return response;
    }

Я не знаю, как изменить это, чтобы вернуть поток вместо текста.

Я нашел примеры того, как использовать поток с помощью HttpClient:

c#: как опубликовать асинхронный запрос и получить поток с помощью httpclient?

но нет примеров того, как создать его из AWS.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы достигнете предела полезной нагрузки шлюза API в 10 МБ независимо от типа возвращаемого значения с размером 100 МБ.

Лучшим вариантом будет сохранить данные, которые вы хотите вернуть, в S3, сгенерировать предварительно подписанный URL-адрес, а затем вернуть URL-адрес клиенту через вашу Lambda.

Функции Amazon Lambda и шлюз API не предназначены для возврата больших файлов.

Конечно нет? Если я транслирую, лямбда не загрузит полное содержимое файла? Использование ссылки S3 потребует от клиента аутентификации с помощью AWS IAM, что в настоящее время ему не нужно делать, и это было бы довольно неудобно.

Ant Waters 11.01.2023 10:23

Этот ответ правильный, так как вы возвращаете больше, чем ограничение полезной нагрузки синхронного вызова Lambda в 6 МБ и ограничение шлюза API в 10 МБ. Вместо этого используйте S3 предварительно подписанные URL для потоковой передачи файлов. Сохраните файл в S3, сгенерируйте ссылку и верните ее клиенту.

Ermiya Eskandary 11.01.2023 13:05
Ответ принят как подходящий

Важно понимать, что и API-шлюз, и лямбда-функции имеют ограничения и не предназначены для работы с длительными открытыми HTTP-соединениями. Шлюз API имеет жесткий предел размера ответа 10 МБ, в то время как лямбда-функция имеет жесткий предел 6 МБ (синхронизация) и 256 КБ (асинхронный), пожалуйста, обратитесь к приведенным ниже документам для получения дополнительной информации.

https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.htmlhttps://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html

Я цитирую два решения из следующего ответа Шлюз API передает контент большого размера в ответ

  • Пусть ваш компьютер EC2 загрузит результат в S3, а шлюз API вернет предварительно подписанный URL-адрес для загрузки ответа из S3. Это приведет к потоковой загрузке, но сначала придется дождаться завершения загрузки EC2 -> S3.

  • Используйте Elastic Beanstalk, таким образом вы будете контролировать сервер и сможете держать свои соединения открытыми столько, сколько захотите, и отправлять столько данных, сколько хотите.

Другие вопросы по теме