Может ли кто-нибудь сказать мне, как вернуть поток из шлюза 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.
Вы достигнете предела полезной нагрузки шлюза API в 10 МБ независимо от типа возвращаемого значения с размером 100 МБ.
Лучшим вариантом будет сохранить данные, которые вы хотите вернуть, в S3, сгенерировать предварительно подписанный URL-адрес, а затем вернуть URL-адрес клиенту через вашу Lambda.
Функции Amazon Lambda и шлюз API не предназначены для возврата больших файлов.
Этот ответ правильный, так как вы возвращаете больше, чем ограничение полезной нагрузки синхронного вызова Lambda в 6 МБ и ограничение шлюза API в 10 МБ. Вместо этого используйте S3 предварительно подписанные URL для потоковой передачи файлов. Сохраните файл в S3, сгенерируйте ссылку и верните ее клиенту.
Важно понимать, что и 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, таким образом вы будете контролировать сервер и сможете держать свои соединения открытыми столько, сколько захотите, и отправлять столько данных, сколько хотите.
Конечно нет? Если я транслирую, лямбда не загрузит полное содержимое файла? Использование ссылки S3 потребует от клиента аутентификации с помощью AWS IAM, что в настоящее время ему не нужно делать, и это было бы довольно неудобно.