通过 ALB 和 Lambda 集成提供二进制响应

Serve Binary responses via ALB and Lambda Integration

AWS 刚刚宣布了一项新功能使用应用程序负载均衡器调用 Lambda 函数。这是个好消息,因为我们不必为 API 网关配置所有这些映射,只是为了从我的 lambda 函数获得简单的响应。

我们通过 API 网关在 lambda 上提供图像大小调整服务 运行。我想知道我们是否可以用 ALB 替换 API 网关。它的工作方式现在我们必须将 base64 编码的图像发送到 api 网关,网关在 return 中将其转换为二进制文件并发送回我们的客户端。

如果我们用 ALB 替换 API 网关,我们将如何服务 images/binary 响应 我们必须对现有基础架构进行哪些必要的更改。

在我看来,ALB 调用 Lambda 函数的方式是基于应用程序路径的路由。比方说,您的应用程序有一个路径 /imageprocessing,因此当您的客户端访问上述资源时,ALB 将调用 LAMBDA 函数作为您的目标。

现在有了这个新功能,您就可以使用 ALB 或 Gateway 或两者。新功能让您现在可以轻松扩展现有服务。

从负载均衡器接收事件是用例:

现在,应用程序负载均衡器支持通过 HTTP 和 HTTPS 对请求调用 Lambda。如果内容类型是以下类型之一,负载均衡器将正文按原样发送到 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"
 }

following Official AWS Guide which will describe your use case

如果您还没有弄清楚,您可以像为 API GW 那样使用 Lambda 函数提供二进制数据。 ALB 还支持可以在响应 JSON 中设置的相同 "isBase64Encode" 标志。如果设置了该标志,则 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 将为您解码,确保内容类型设置正确。