繁体   English   中英

使用 boto3 的 S3 预签名帖子网址问题

[英]S3 presigned post urls issue using boto3

我有一个 webapp 服务于 apache2 在后端运行 python-flask。 该应用程序托管在Linode上,并且严重依赖于他们的 S3 Object 存储。 我正在使用boto3与 S3 存储进行交互。 我的问题是关于生产中使用的generate_presigned_url方法。 它返回以下结构:

{
 'url': 'https://eu-central-1.linodeobjects.com/my-s3-bucket', 
 'fields': {
   'ACL': 'private', 
   'key': 'foo.bar', 
   'AWSAccessKeyId': 'FOOBAR', 
   'policy': 'base64longhash...', 
   'signature': 'foobar'
  }
} 

每次我在同一个 python session 上使用此方法时, policy键都会返回更长的值(每个后续请求的长度增加约 1.5 倍)。 在几次请求之后, policy的大小变得非常大(几十 MB)并且应用程序中断。 如果我重新启动 python 服务, policy大小将被重置。

在挖掘了boto3文档和 GitHub 中的一些线程之后,在这里我找不到任何可以帮助我重置 S3 连接而无需重新启动整个 python Z21D6F40CFB511982E4424E0E250A95. 定期重新启动 apache2 服务不是一个好方法,所以我的解决方案是使用subprocess进程从独立脚本中调用generate_presigned_url并将字符串 output 解析回 Z466DEEC76ECDF5FCA6D38571F634 之前并不理想不必继续从 apache 内部调用 bash 脚本。 我使用的主要功能如下:

AWS_BUCKET_PARAMS = {'ACL': 'private'}

# connect to my linode's s3 bucket
def awsSign():
    return boto3.client('s3', aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, endpoint_url=AWS_ENDPOINT_URL)

# generate presigned post object for uploading files
def awsPostForm(file_path):
    s3 = awsSign()
    return s3.generate_presigned_post(AWS_BUCKET, file_path, AWS_BUCKET_PARAMS, [AWS_BUCKET_PARAMS], 1800)

# generate post object from external script
def awsPostFormTerminal(file_path):
    from subprocess import Popen, PIPE
    cmd = [ 'python3', '-c', f'from utils import awsPostForm; print(awsPostForm("{file_path}"))' ]
    output = Popen( cmd, stdout=PIPE ).communicate()[0]
    return json.loads(output.decode('utf-8').replace('\n', '').replace("'", '"'))

无论为文件列表调用awsSign()一次或多次,都会发生此问题。

简而言之,我希望有一种更好的方法来从同一 python session 中的generate_presigned_url中检索后续post forms,而无需增加每个新请求的policy 如果有正确的方法来重新启动boto3连接,请提供一些我在设置 API 调用时错过的参数,或者它可能是 Linode 的 S3 object 存储服务所特有的。

如果有人能指出我正确的方向,我将不胜感激!

好吧,事实证明这是一个新手错误 - 从linode 的问答中得到了提示。 所以,回答我自己的问题:

原来AWS_BUCKET_PARAMS变量在通过generate_presigned_post后被引用更新。 在发送请求之前复制函数的 scope 中的全局变量解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM