首页 > 解决方案 > AWS Lambda (URL) 重写流程

问题描述

我是 Lambda 新手,所以我想了解如何部署以下场景:

  1. Lambda 连接到 API 网关(后者又连接到反向代理)
  2. 从 API 网关到 lambda 的请求需要路由到 3 个不同的 ALB,每个 ALB 位于不同的 (VPC) 私有子网中。

除了编写 Lambda 函数(使用 python)来重写 url 之外,我需要进行哪些配置更改才能实现此目的?

如果有人可以在这里解释消息流,那就太好了。

谢谢阿比吉特

标签: amazon-web-servicesaws-lambdaaws-api-gatewayaws-elb

解决方案


这对我来说似乎是多个问题,我将尝试分解试图实现的目标。

将 ALB 与 API 网关一起使用

API Gateway 如何使用负载均衡器来服务 http 流量有很多选择。解决方案实际上取决于您尝试使用的 API 网关类型。

假设您的 API 是RESTWebSockets,您有 2 个选择来启用入站到负载均衡器的 HTTP 流量:

  • 直接作为HTTPorHTTP_PROXY请求,列出 API 网关将流量转发到的可公开访问的主机名。
  • 如果您想保持传输私有,那么您唯一的选择是创建一个网络负载均衡器并使用VPCLink在 API Gateway 和您的网络资源之间创建私有连接。

如果您正在创建HTTP API(有时称为 API Gateway v2),那么您可以使用与私有 ALB 的直接连接,但是请注意,此时 HTTP API 不支持 REST API 的所有功能,因此您在执行此操作之前会想要比较功能集。

使用多个负载均衡器来引导流量

您确定每个资源/方法组合的值,例如POST /example将分配其目标端点,但只有一个.

如果您使用 REST API 来指定转发流量的任何端点,我的建议是使用阶段变量,原因如下:

  • 防止域名输入错误
  • 允许快速替换主机名
  • 为金丝雀部署提供在 2 个变量名称之间按比例转移流量的功能(只要类型相同,这些名称可以是任何东西,例如 Lambda 到另一个 Lambda,而不是 Lambda 到负载均衡器)。

使用 Lambda 重定向

从技术上讲,Lambda 可以通过使用以下语法返回响应来执行重定向

{
    statusCode: 302,
    headers: {
      Location: 'https://api.example.com/new/path',
    }
}

但是请注意,这会将请求更改为GET请求,这还将在重定向发生时删除正文请求的有效负载。此外,您需要为要重定向的每个资源/方法组合进行设置。

您可以使用 2 个选项来解决这些问题,它们都涉及将CloudFrontLambda@Edge函数结合使用。

Origin Request如果您可以修改 Request URI 属性以匹配新的 URI 结构,第一个解决方案可以作为请求类型更改的解决方法。通过这样做,您的客户仍然可以使用 API,同时您会通知他们对您正在迁移的某些路径的弃用。

第二种解决方案是一种解决方法,可以解决向每个资源/方法组合添加重定向的需要,这可能会为重定向创建大量混乱的方法。您可以创建一个 Lambda@Edge 函数来对Origin Response事件执行相同的重定向。您可以在您的 Lambda 函数中创建映射来确定它应该重定向到哪个 URL。

Lambda@Edge 示例函数页面上有很多很棒的示例


推荐阅读