【发布时间】:2021-08-29 22:50:47
【问题描述】:
我的 python (Django) 应用程序存储机密文档并在 AWS S3 中有一个私有存储桶。
当您请求资源时,它会使用 boto3 生成一个预签名的 URL,以便能够下载文档。
这样做的代码如下:
@staticmethod
def create_presigned_url(key_name, bucket_name=settings.AWS_PDF_STORAGE_BUCKET_NAME, expiration=60):
"""
Generate a pre-signed URL to share a PDF.
:param key_name: string.
:param bucket_name: string.
:param expiration: Time in seconds for the pre-signed url to remain valid.
:return: Pre-signed URL as a string. If error, returns None.
"""
s3_client = boto3.client('s3')
try:
response = s3_client.generate_presigned_url(
'get_object',
Params={'Bucket': bucket_name, 'Key': f"pdf/{key_name}"},
ExpiresIn=expiration
)
except ClientError:
return None
return response
当我在本地运行我的应用程序时,它运行良好。它会生成一个链接,我可以用它来下载文档,并在 60 秒后过期。这样的 URL 如下所示:
https://BUCKETNAME.s3.amazonaws.com/pdf/testuser1/dummy.pdf?AWSAccessKeyId=ACCESSKEY&Signature=SIGNATURE&Expires=EXPIRATION"
然后我将我的应用程序部署到 AWS Elastic Beanstalk。配置了具有 AWS 机密的所有相同环境变量。但是当我运行相同的请求时,我会得到一个更长的 URL,如下所示:
https://fiber-staging-pdfs.s3.amazonaws.com/pdf/liza/dummy.pdf?AWSAccessKeyId=ACCESSKEY&Signature=SIGNATURE&x-amz-security-token=TOKEN&Expires=EXPIRATION
不知何故,在此环境下运行相同的代码时添加了x-amz-security-token 参数?为什么?当我尝试访问这个生成的 URL 时,我收到 403 Forbidden 错误。
此存储桶的存储桶策略如下:
{
"Version": "2012-10-17",
"Id": "POLICYID",
"Statement": [
{
"Sid": "SID",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNTID:root"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::BUCKETNAME/*"
}
]
}
【问题讨论】:
标签: python django amazon-web-services amazon-s3 boto3