我需要一种方法,让客户端将数据上传到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,我还有什么其他解决方案?
答案 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有一个非常详细的答案,在我看来它应该可以工作。
同样,我知道这不是一个完整的答案,并且我还没有尝试验证它是否可行,但是希望有人可以从这里开始并为您的问题找到一个完整的答案。