如何在不暴露存储桶名称的情况下为自定义域生成S3预签名URL [英] How to generate an S3 pre-signed URL for a custom domain without exposing bucket name

查看:20
本文介绍了如何在不暴露存储桶名称的情况下为自定义域生成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>

这些是问题:

  1. 是否可以在不暴露存储桶名称的情况下实现可行的链接?
  2. 我已经读到一些关于自定义域只支持HTTP,不支持HTTPS访问的消息,是真的吗?在这种情况下我应该怎么做?
  3. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆