Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 带子目录的S3 API网关代理_Amazon Web Services_Amazon S3_Api Gateway - Fatal编程技术网

Amazon web services 带子目录的S3 API网关代理

Amazon web services 带子目录的S3 API网关代理,amazon-web-services,amazon-s3,api-gateway,Amazon Web Services,Amazon S3,Api Gateway,我为“S3”创建了一个集成类型为“AWS服务”的API网关方法GET。 我定义了一个路径覆盖:{object},它从method.request.Path.item映射而来 只要路径只包含bucket本身(./bucket/mybucketname),它就会工作,{item}的值就是mybucketname 但是当我指定例如../bucket/mybucketname/foo/bar/test.txt作为路径时,{item}值应该是mybucketname/foo/bar/test.txt,但

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

只要路径只包含bucket本身(./bucket/mybucketname),它就会工作,{item}的值就是mybucketname

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

当我选择catch all path variables{proxy+}时,我无法再选择集成类型“AWS Service”


有没有提示我做错了什么,或者我应该做什么,以便通过API网关从S3检索子文件夹中的文件/文件夹?

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

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

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

我要做的是为来自RequestQueryString的集成请求设置url路径参数,如下所示:

object = method.request.querystring.object
它起作用了


或者您可以尝试使用url编码对对象路径进行编码,将“/”替换为“%2F”。但我从未试过

路径覆盖:bucket_name/{folder}模式根据级别,它是第一个{folder}

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

这是最后一个{object},前面提到的所有路径映射。 此链接将非常有用

这可以通过使用

以下是我实现@Johnny90目标的步骤:

  • 单击API网关控制台中的API

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

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

    b。使用默认的
    代理
    作为资源名称

    c。对资源路径使用
    {proxy+}

    d。选择创建资源

  • 选择HTTP代理作为集成类型,并将端点URL键入任何网站(例如,{Proxy})。然后选择保存

  • 选择集成请求

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

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

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

    d。对于HTTP方法,选择GET

    e。为操作类型选择“使用路径替代”。并键入
    bucket/{proxy}

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

    g。单击保存

  • 将集成请求从HTTP代理集成更改为AWS服务后,我们必须为API添加一些设置。首先,必须设置URL路径参数,以便API网关能够理解集成请求中资源路径中定义的
    {proxy}
    变量

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

  • 在“名称”列中键入
    proxy
    ,在“映射自”列中键入
    method.request.path.proxy

  • 第二,从方法执行中选择方法响应

  • 选择添加响应。键入200以获取HTTP状态

  • 展开200代码的响应

    a。选择添加标题。键入
    内容类型
    作为名称

    b。单击添加响应模型。为
    内容类型键入
    application/json
    ,然后从Models下拉菜单中选择Empty

  • 最后,从方法执行中选择集成响应

  • 扩展200方法响应状态

  • 对于标题映射,您应该在响应标题列中看到内容类型。在映射值列中键入
    integration.response.header.Content Type

  • 以下是我的配置:

    集成请求:

    整合响应:

    方法响应:

    你解决了吗?如果你能把答案贴出来就好了。我也面临同样的问题。URL编码您的ObjectID以用“%2F”替换“/”是有效的too@KevinHooke难道你不记得你是怎么做到的吗?@Samuurai我想这是用URLEncoder.encode()/decode()做的这个应该是公认的答案!在访问S3子目录时,使用代理资源可以避免URL编码问题。在创建资源{proxy+}后,我无法将集成类型设置为“AWS服务”。从调用的URL调用文件时,它不起作用。确切的错误消息是:由于配置错误,执行失败:无法对正文进行base64解码。