在 AWS API 网关集成中处理路径映射
Manipulating path mapping in AWS API gateway integration
我想修改 API 网关到 S3 映射中的 url 参数 /resource/{VaRiAbLe} 以便它实际指向 /my-bucket/{variable} .也就是说,它接受 mixed-case 输入,并将其映射到 lower-case 名称。映射路径变量对于 S3 集成来说相对简单,但我似乎无法使 lower-case 映射正常工作。
通读 documentation 映射参数,看起来路径参数是简单的字符串值(而不是模板值),因此将映射定义为 method.request.path.variable.toLowerCase() 不会工作。
有人知道如何实现此映射吗?
- 将路径变量映射到 JSON body,然后调用另一个实际执行 S3 调用的 API 方法?
- 硬着头皮,实现一个 Lambda 函数来为我获取 S3?
- 为 S3 找到另一个 api 方法,它接受我可以用来获取数据的 JSON body?
使用编排调用更新
根据 Jack 提供的信息,我想我应该尝试进行编排调用,因为流量足够低,我确信我无法保持 lambda 热。
作为概念验证,我向我的资源添加了两个方法(位于 /resource/{variable}
- GET
和 POST
。GET
方法链接到 POST
,实际检索数据。
POST方法配置
这是一种香草 S3 代理方法,您将 {variable}
的 URL 路径参数设置为 method.request.body.variable
.
GET方法配置
这是一种 HTTPS 代理方法。 POST 方法需要一个 URL,因此您需要部署 API 才能获得 URL。这里唯一需要的其他配置是 body 映射模板,其内容如下:
{
"variable" : "$input.params('variable').toLowerCase()",
"something" : "$input.params('something')"
}
这应该足以让它工作。
这样做的缺点似乎是我要为该资源向我的 API 添加一个额外的方法 (POST),这可能会使 API 的消费者感到困惑。我认为应该可以在 /resource
资源上制作 POST
,从 API 设计的角度来看,这至少更有意义。
根据调用此 API 的频率,我要么使用 Lambda 代理,要么将两个 API 网关方法链接在一起。如果 API 被调用的频率足以使 Lambda 函数保持温暖(比如每分钟一次),则使用 Lambda。如果没有,请使用精心策划的 API 调用。
精心策划的 API 通话会很有趣,如果您有任何疑问,我很乐意为您提供帮助。
据我所知,唯一用于获取对象数据的 S3 API 是在其 API 参考中记录的 GET。
我想修改 API 网关到 S3 映射中的 url 参数 /resource/{VaRiAbLe} 以便它实际指向 /my-bucket/{variable} .也就是说,它接受 mixed-case 输入,并将其映射到 lower-case 名称。映射路径变量对于 S3 集成来说相对简单,但我似乎无法使 lower-case 映射正常工作。
通读 documentation 映射参数,看起来路径参数是简单的字符串值(而不是模板值),因此将映射定义为 method.request.path.variable.toLowerCase() 不会工作。
有人知道如何实现此映射吗?
- 将路径变量映射到 JSON body,然后调用另一个实际执行 S3 调用的 API 方法?
- 硬着头皮,实现一个 Lambda 函数来为我获取 S3?
- 为 S3 找到另一个 api 方法,它接受我可以用来获取数据的 JSON body?
使用编排调用更新
根据 Jack 提供的信息,我想我应该尝试进行编排调用,因为流量足够低,我确信我无法保持 lambda 热。
作为概念验证,我向我的资源添加了两个方法(位于 /resource/{variable}
- GET
和 POST
。GET
方法链接到 POST
,实际检索数据。
POST方法配置
这是一种香草 S3 代理方法,您将 {variable}
的 URL 路径参数设置为 method.request.body.variable
.
GET方法配置 这是一种 HTTPS 代理方法。 POST 方法需要一个 URL,因此您需要部署 API 才能获得 URL。这里唯一需要的其他配置是 body 映射模板,其内容如下:
{
"variable" : "$input.params('variable').toLowerCase()",
"something" : "$input.params('something')"
}
这应该足以让它工作。
这样做的缺点似乎是我要为该资源向我的 API 添加一个额外的方法 (POST),这可能会使 API 的消费者感到困惑。我认为应该可以在 /resource
资源上制作 POST
,从 API 设计的角度来看,这至少更有意义。
根据调用此 API 的频率,我要么使用 Lambda 代理,要么将两个 API 网关方法链接在一起。如果 API 被调用的频率足以使 Lambda 函数保持温暖(比如每分钟一次),则使用 Lambda。如果没有,请使用精心策划的 API 调用。
精心策划的 API 通话会很有趣,如果您有任何疑问,我很乐意为您提供帮助。
据我所知,唯一用于获取对象数据的 S3 API 是在其 API 参考中记录的 GET。