Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.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不带路径的预签名url_Amazon Web Services_Amazon S3_Boto3_Boto - Fatal编程技术网

Amazon web services S3不带路径的预签名url

Amazon web services S3不带路径的预签名url,amazon-web-services,amazon-s3,boto3,boto,Amazon Web Services,Amazon S3,Boto3,Boto,我需要一种方法,让客户端将数据上传到S3,而不向他们显示文件的完整位置(路径)。使用AWS S3预签名URL,这是可行的吗 我用的是boto3 s3.client.generate_presigned_url( ClientMethod='put_object', ExpiresIn=7200, Params={'Bucket': BUCKET, 'Key': name} ) 但结果将是: https://s3.amazonaws.com/MY_BUCKET/upload/xxx

我需要一种方法,让客户端将数据上传到S3,而不向他们显示文件的完整位置(路径)。使用AWS S3预签名URL,这是可行的吗

我用的是boto3

s3.client.generate_presigned_url(
  ClientMethod='put_object', 
  ExpiresIn=7200,
  Params={'Bucket': BUCKET, 'Key': name}
)
但结果将是:

https://s3.amazonaws.com/MY_BUCKET/upload/xxxx-xxxx/file-name.bin?AWSAccessKeyId=XXXX&Signature=XXXX&Expires=XXXX

我需要这样的东西,它不会在路径中显示密钥名(
/upload/xxxx xxxx/file name.bin


如果没有预先签名的url,我还有什么其他解决方案?

这不是一个完整的答案,但它太长了,不能作为评论

我认为您应该能够使用API网关作为S3的代理来隐藏路径。您仍然可以使用预签名的URL,但可能需要创建预签名的API网关URL,而不是预签名的S3 URL。我自己从来没有做过,在不久的将来我也无法尝试,但我会尽我所能展示我认为是如何做到的,也许其他人可以尝试一下,写出一个更完整的答案

首先,我们需要设置一个API网关端点,作为S3的代理

AWS有一篇非常详尽的文章,我认为您可以通过修改代理的PathOverride,使自定义端点指向S3中的特定bucket和文件夹。如果您查看AWS文档中PathOverrides的屏幕截图,您可以看到他们已将路径覆盖设置为
{bucket}/{object}
,但我认为您可以将PathOverride设置为
mySecretBucket/my/secret/folder/{object}
,然后适当地更新路径映射

接下来,您需要能够使用此代理的预签名URL。有两种方法可以做到这一点

第一件可能有效的事情是使url签名通过API网关传递到S3。我知道可以用与路径参数类似的方式映射查询参数。您可能需要对预先签名的url的签名参数执行一些url编码,以使其工作—我不完全确定

另一个选项是允许Api网关始终写入S3,并且需要一个签名请求来调用代理端点。有一个非常详细的答案,在我看来,它应该是有效的


同样,我知道这不是一个完整的答案,我也没有尝试验证这是否有效,但希望有人能从这开始,为你的问题找到一个完整的答案

我认为最好的方法是使用AWS Cloudfront分发文件。您可以将Cloudfront发行版的来源设置为
MY_BUCKET.s3.amazonaws.com
。也可以使用子文件夹,如
MY_BUCKET.s3.amazonaws.com/upload
作为源文件

Cloudfront将使用生成的CDN端点域在S3源中为您的文件提供服务,或者也可以设置和使用自定义域

如果使用子文件夹作为原点:


有关在Cloudfront上将S3 Bucket设置为原点的更多信息:

有关使用S3 Bucket的目录路径作为源的详细信息:


关于自定义URL的更多信息:

我只是想提出一个想法:你可以有一个简单的Lambda函数,在上传时被触发,然后移动/重命名上传的对象。@AlexanderAzarov正是我想要避免的,但我想我能做到itLambda@edge这里可能有用。是否有任何特殊原因不希望他们看到路径/键?知道它不会给他们任何额外的访问权。@JohnRotenstein我知道,但由于一些遗留代码,该路径在另一个应用程序上是开放的。在我们完全迁移客户之前,我们需要隐藏它。当然,我使用cloudfront与S3接口,这对我的上传问题毫无帮助。我不满意,但至少你提供了lambda以外的东西,这似乎是合理的。我会给你赏金,但问题暂时还没有解决,这是公平的。这不是一个非常令人满意的解决方案。对于AWS来说,添加模糊的预签名链接似乎应该是一个非常简单的功能;我不知道他们为什么不支持。