【发布时间】:2020-05-27 08:39:25
【问题描述】:
我有一个存储桶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 东西都不熟悉。
【问题讨论】:
-
请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。
-
@halfer 感谢您的指出。写的时候有这种感觉。将来一定会牢记这一点。
标签: amazon-web-services amazon-s3 boto3 pre-signed-url