用于 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 Request 中 resource 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 网关代理和子目录的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 lambda 和 api 网关将我的 blob 上传到我的 s3 存储桶?