Как вернуть поток из 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.

Конечные и Readonly классы в PHP
Конечные и Readonly классы в PHP
В прошлом, когда вы не хотели, чтобы другие классы расширяли определенный класс, вы могли пометить его как final.
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
БЭМ: Конвенция об именовании CSS
БЭМ: Конвенция об именовании CSS
Я часто вижу беспорядочный код CSS, особенно если проект большой. Кроме того, я совершал эту ошибку в профессиональных или личных проектах и...
Революционная веб-разработка ServiceNow
Революционная веб-разработка ServiceNow
В быстро развивающемся мире веб-разработки ServiceNow для достижения успеха крайне важно оставаться на вершине последних тенденций и технологий. По...
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Заголовок веб-страницы играет наиболее важную роль в SEO, он помогает поисковой системе понять, о чем ваш сайт.
Конфигурация Jest в angular
Конфигурация Jest в angular
В этой статье я рассказываю обо всех необходимых шагах, которые нужно выполнить при настройке jest в angular.
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.html https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html

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

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

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

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