Подавать двоичные ответы через ALB и лямбда-интеграцию

AWS только что анонсировала новую функцию Вызов функций Lambda с помощью балансировщиков нагрузки приложений. Это отличная новость, поскольку нам не нужно настраивать все эти сопоставления для шлюза API только для того, чтобы получить простой ответ от моей лямбда-функции.

У нас есть служба изменения размера изображения, работающая на лямбда-выражении через шлюз API. Мне интересно, можем ли мы заменить шлюз API на ALB. Теперь, как это работает, мы должны отправить изображение в кодировке base64 на шлюз API, который, в свою очередь, преобразует его в двоичный файл и отправит обратно нашим клиентам.

Если бы мы заменили API-шлюз на ALB, как бы мы обслуживали изображения / двоичные ответы, какие изменения мы должны были бы внести в нашу существующую инфраструктуру.


person Umer    schedule 07.12.2018    source источник


Ответы (3)


Получение событий от балансировщика нагрузки - это пример использования:

Теперь балансировщик нагрузки приложений поддерживает вызов Lambda для запросов как по HTTP, так и по HTTPS. Если тип содержимого является одним из следующих типов, балансировщик нагрузки отправляет тело функции Lambda как есть и устанавливает для isBase64Encoded значение false: text / *, application / json, application / javascript и application / xml. Для всех других типов балансировщик нагрузки Base64 кодирует тело и устанавливает isBase64Encoded в значение true.

Ниже приводится пример события.

{
    "requestContext": {
     "elb": {
     "targetGroupArn":
     "arn:awscn:elasticloadbalancing:region:123456789012:targetgroup/my-target- group/6d0ecf831eec9f09" // ALB reference
          }
          },
"httpMethod": "GET",
"path": "/",
"queryStringParameters": {parameters},
"headers": {
"accept": "text/html,application/xhtml+xml",
"accept-language": "en-US,en;q=0.8",
"content-type": "text/plain",
"cookie": "cookies",
"host": "lambda-846800462-us-east-2.elb.amazonaws.com", //this is where Lambda CNAME is declared
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)",
"x-amzn-trace-id": "Root=1-5bdb40ca-556d8b0c50dc66f0511bf520",
"x-forwarded-for": "72.21.198.66",
"x-forwarded-port": "443",
"x-forwarded-proto": "https"
      },
"isBase64Encoded": false,
"body": "request_body"
 }

в соответствии с Официальным руководством AWS, в котором будет описан ваш вариант использования

person Yash Bindlish    schedule 11.12.2018

Если вы еще не поняли, вы можете предоставить двоичные данные из своей лямбда-функции так же, как вы это делали для API GW. ALB также поддерживает тот же флаг isBase64Encode, который может быть установлен в ответе JSON. ALB b64 декодирует тело, если этот флаг установлен.

Из документации: { "statusCode": 200, "statusDescription": "HTTP OK", **"isBase64Encoded": False,** "headers": { "server": "my-server", "set-cookie": "name=value", "Content-Type": "text/html; charset=utf-8" }, "body": "Welcome" }

По сути, просто b64 кодирует ваше тело и устанавливает этот флаг, ALB декодирует его за вас, убедитесь, что тип контента установлен правильно.

person varun_lodaya    schedule 17.12.2018

На мой взгляд, этот способ, которым ALB будет вызывать функцию Lambda, - это маршрутизация на основе пути приложения. скажем, у вашего приложения есть путь / обработка изображений, поэтому, когда ваш клиент получит доступ к указанному ресурсу, ALB вызовет функцию LAMBDA в качестве вашей цели.

Теперь с этой новой функцией у вас есть возможность использовать ALB или шлюз, или и то, и другое. Новые возможности позволяют легко расширить существующую услугу прямо сейчас.

person Yash Bindlish    schedule 07.12.2018
comment
Спасибо @yash за ваш ответ. Вопрос заключался в том, как загружать изображения / двоичный контент через ALB. В настоящее время с API-шлюзом и лямбда-интеграцией лямбда-функция будет возвращать объект изображения в кодировке base64, который будет преобразован в двоичный BLOB-объект шлюзом api. Итак, как добиться того же с помощью ALB и Lambda. - person Umer; 11.12.2018
comment
@Umer Я только что опубликовал пример и подробное описание в качестве еще одного ответа на ваш вариант использования. Я надеюсь, это поможет - person Yash Bindlish; 11.12.2018