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



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

我们有一个通过API网关在lambda上运行的图像大小调整服务。我想知道我们是否可以用ALB取代API网关。按照现在的工作方式,我们必须向api网关发送一个base64编码的图像,作为回报,api网关将其转换为二进制文件并发送回我们的客户。

如果我们用ALB取代API网关,我们将如何提供图像/二进制响应?我们必须对现有基础设施进行哪些必要的更改。

如果您还没有弄清楚,您可以用与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就会为你解码,确保内容类型设置正确。

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

现在,应用程序负载均衡器支持通过HTTP和HTTPS对请求进行Lambda调用。如果内容类型是以下类型之一,则负载均衡器将主体按原样发送给Lambda函数,并将isBase64Encoded设置为false:text/*、application/json、application/javascript和application/xml。对于所有其他类型,负载均衡器Base64对主体进行编码,并将isBase64Encoded设置为真正的

以下是一个示例事件。

{
"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官方指南将描述您的用例

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

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

最新更新