如何在不暴露存储桶名称的情况下为自定义域生成S3预签名URL [英] How to generate an S3 pre-signed URL for a custom domain without exposing bucket name
本文介绍了如何在不暴露存储桶名称的情况下为自定义域生成S3预签名URL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个存储桶my-bucket-name
,我想授予对folder-name
中的某些file.pdf
的临时访问权限。至于默认设置,我使用boto3获取下一个链接:
https://my-bucket-name.s3.amazonaws.com/folder-name/file.pdf?AWSAccessKeyId=<key>&Signature=<signature>&x-amz-security-token=<toke>&Expires=<time>
但我还有一个DNS别名,my.address.com
映射到my-bucket-name.s3.amazonaws.com
。当然,如果我直接使用它,我会从亚马逊获得SignatureDoesNotMatch
。因此,我使用下一段代码来生成预签名链接:
from botocore.client import Config
kwargs = {}
kwargs['endpoint_url'] = f'https://my.address.com'
kwargs['config'] = Config(s3={'addressing_style': 'path'})
s3_client = boto3.client('s3', **kwargs)
url = s3_client.generate_presigned_url(ClientMethod='get_object',
Params={
'Bucket': 'my-bucket-name',
'Key': 'folder-name/file.pdf'
},
ExpiresIn=URL_EXPIRATION_TIME)
因此,它返回我的下一个链接:
https://my.address.com/my-bucket-name/folder-name/file.pdf?AWSAccessKeyId=<key>&Signature=<signature>&x-amz-security-token=<toke>&Expires=<time>
这有两个问题:
- 我不想暴露我的存储桶名称,所以
my-bucket-name/
应该省略 - 此链接不起作用,我收到
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>
这些是问题:
- 是否可以在不暴露存储桶名称的情况下实现可行的链接?
- 我已经读到一些关于自定义域只支持HTTP,不支持HTTPS访问的消息,是真的吗?在这种情况下我应该怎么做?
- DNS别名不是我创建的,所以我不确定它是否正常工作或设置是否正确,我应该检查/询问什么来验证它是否可以为S3工作?
目前我有点迷失在亚马逊文档中。此外,我对所有这些AWS内容都是新手。
推荐答案
无法在Amazon S3预签名URL中隐藏存储桶名称。这是因为请求是向存储桶发出的。签名只是授权请求。
您可以这样做的一种方法是使用Amazon CloudFront,并将存储桶作为源。您可以将域名与CloudFront分发关联,该分发与CloudFront获取其内容的源无关。
Amazon CloudFront支持预签名URL。您可以通过Origin Access Identity (OAI)授予CloudFront访问S3存储桶的权限,然后将分发配置为私有。然后,通过CloudFront预签名URL访问内容。请注意,分发的全部内容都是私有的,因此您需要两个CloudFront分发版(一个是公共的,一个是私有的),或者只将CloudFront用于私有部分(并继续使用直接到S3的公共部分)。
如果整个网站是私有的,那么您可以将Cookie与CloudFront一起使用,而不必为每个URL生成预先签名的URL。
这篇关于如何在不暴露存储桶名称的情况下为自定义域生成S3预签名URL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文