用于 S3 的 API 网关代理和子目录

Posted

技术标签:

【中文标题】用于 S3 的 API 网关代理和子目录【英文标题】:API Gateway Proxy for S3 with subdirectories 【发布时间】:2018-11-09 02:02:42 【问题描述】:

我为“S3”创建了一个集成类型为“AWS 服务”的 API 网关方法 GET。 我定义了一个从 method.request.path.item 映射的路径覆盖:object

只要路径只包含存储桶本身 (./bucket/mybucketname),它就可以工作,并且 item 的值为 mybucketname

但是当我指定例如 ../bucket/mybucketname/foo/bar/test.txt 作为路径时,item 值应该是 mybucketname/foo/bar/test.txt 但它为空。我认为是因为嵌套路径

当我选择包罗万象的路径变量 proxy+ 时,我无法再选择集成类型“AWS 服务”。

任何提示我做错了什么或我应该做什么才能通过 API Gateway 从 S3 检索子文件夹中的文件/文件夹?

【问题讨论】:

你解决了吗?如果您可以发布答案,那就太好了。我也面临同样的问题。 【参考方案1】:

这可以使用proxy resource 来完成。

这是我实现@Johnny90 想要的步骤:

    在 API Gateway 控制台中单击您的 API。

    选择/bucket 资源,然后从操作 下拉菜单中选择创建资源。然后,在“新建子资源”窗格中执行以下操作。

    一个。勾选“配置为代理资源”。

    b.使用默认的proxy 作为资源名称。

    c。使用 proxy+ 作为资源路径。

    d。选择创建资源

    为集成类型选择 HTTP 代理,并将端点 URL 键入为任何网站(例如,https://my-website.com/proxy)。然后选择保存

    选择集成请求

    一个。选择 AWS 服务 作为集成类型。

    b.从 AWS 区域下拉列表中,选择您的 S3 存储桶所在的区域。

    c。从 AWS 服务中,选择 S3。对于 AWS 子域,请将其留空。

    d。对于 HTTP 方法,请选择 GET。

    e。为操作类型选择使用路径覆盖。并输入bucket/proxy

    f。粘贴具有足够权限的 IAM 角色。

    g.点击保存

在将集成请求从 HTTP 代理 集成更改为 AWS 服务 后,我们必须为 API 添加一些设置。首先,您必须设置 URL 路径参数,以便 API Gateway 可以理解 Integration Requestresource path 中定义的 proxy 变量。

    在集成请求中扩展URL路径参数,然后选择添加路径

    在名称列中输入proxy,在映射自列中输入method.request.path.proxy

其次,从Method Execution中选择Method Response

    选择添加响应。输入 200 表示 HTTP 状态。

    展开 200 代码的响应。

    一个。选择添加页眉。键入 Content-Type 作为名称。

    b.单击添加响应模型。为 Content type 键入 application/json,然后从模型下拉菜单中选择 Empty

最后,从Method Execution中选择Integration Response

    扩展 200 方法响应状态

    对于 Header Mapping,您应该在 Response 标题列中看到 Content-Type。在映射值列中输入integration.response.header.Content-Type

以下是我的配置:

集成请求:

集成响应:

方法响应:

【讨论】:

从调用的 url 调用文件时它不起作用。确切的错误消息是:由于配置错误,执行失败:无法对正文进行 base64 解码。【参考方案2】:

关键是如何在路径覆盖中传递 object 变量的值。 我认为您为请求路径中的集成请求设置了 url 路径参数,如下所示:

object = method.request.path.object     

我认为问题是因为对象中有“/”,api路径(资源)也是如此。 这导致 api 网关只能识别根路径中的对象。

我所做的是从请求查询字符串中为集成请求设置 url 路径参数,如下所示:

object = method.request.querystring.object

有效

或者您可以尝试使用 url 编码对对象路径进行编码,将 '/' 替换为 '%2F'。不过我从来没有尝试过。

【讨论】:

对您的 ObjectIds 进行 URL 编码以将 '/' 替换为 '%2F' 也可以 @KevinHooke 你不记得你是怎么做到的吗? @Samuurai 我认为是 URLEncoder.encode() / decode()【参考方案3】:

路径覆盖:bucket_name/folder 模式按级别,它用于第一个 folder。

您可以像这样访问 s3 嵌套路径。

这是最后一个object,所以提到了所有的路径图。 这个链接会有所帮助 https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html

【讨论】:

【参考方案4】:

@johnny90,首先配置为 lambda 代理,同时创建资源 proxy+...创建后..将集成类型更新为“AWS 服务”。然后您可以将任何 AWS 服务配置到您的 API 网关。

【讨论】:

这个正在工作,应该是公认的答案!在访问 S3 子目录时,使用代理资源可以避免 URL 编码问题。 创建资源 proxy+ 后,我无法将集成类型设置为“AWS 服务”。

以上是关于用于 S3 的 API 网关代理和子目录的主要内容,如果未能解决你的问题,请参考以下文章

用于 gRpc 服务的 API 网关

如何通过 lambda 和 api 网关将我的 blob 上传到我的 s3 存储桶?

API(网关)提供的反向代理和Service Fabric有啥区别?

网关层了解软件架构中的网关层

Node.js API 网关和 nginx 作为反向代理

使用 Spring 云网关和 Nginx 作为反向代理的网关超时