没有路径的S3预签名URL

时间:2019-02-28 19:15:30

标签: 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/xxxx-xxxx/file-name.bin?AWSAccessKeyId=XXXX&Signature=XXXX&Expires=XXXX

我需要类似的东西,不会在路径(/upload/xxxx-xxxx/file-name.bin)中显示密钥名称。

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

2 个答案:

答案 0 :(得分:3)

我相信最好的方法是使用AWS Cloudfront分发文件。您可以将Cloudfront分发的来源设置为MY_BUCKET.s3.amazonaws.com。也可以使用诸如MY_BUCKET.s3.amazonaws.com/upload之类的子文件夹作为原点。

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

https://d111111abcdef8.cloudfront.net/upload/xxxx-xxxx/file-name.bin https://uploads.example.com/upload/xxxx-xxxx/file-name.bin

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

https://uploads.example.com/xxxx-xxxx/file-name.bin


有关将S3存储桶设置为Cloudfront上的来源的更多信息:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistS3AndCustomOrigins.html#concept_S3Origin

有关将S3存储桶的目录路径用作来源的更多信息:https://aws.amazon.com/about-aws/whats-new/2014/12/16/amazon-cloudfront-now-allows-directory-path-as-origin-name/

有关自定义网址的更多信息:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html

答案 1 :(得分:0)

这不是一个完整的答案,但是要发表评论太久了。

我认为您应该能够使用API​​ Gateway作为S3的代理来隐藏路径。您仍然可以使用预签名的url,但是您可能需要创建预签名的API网关url,而不是预签名的S3 url。我从来没有自己做过-我也无法在不久的将来进行尝试-但我会尽我所能列出我认为的完成方式,也许其他人可以尝试并撰写更完整的内容答案。

首先,我们需要设置一个API网关端点,该端点将充当S3的代理。

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

接下来,您需要能够将此代理使用预签名的url。您可能有两种方法可以执行此操作。

第一件事可能是使URL签名通过API网关传递到S3。我知道可以以类似于路径参数的方式映射查询参数。您可能需要在预签名URL的签名Parma上执行一些url编码才能使其正常工作-我不确定。

另一个选择是允许Api Gateway始终写入S3,并要求签名请求才能调用代理端点。 This SO question有一个非常详细的答案,在我看来它应该可以工作。

同样,我知道这不是一个完整的答案,并且我还没有尝试验证它是否可行,但是希望有人可以从这里开始并为您的问题找到一个完整的答案。