【问题标题】:Generate presigned s3 URL of latest object in the bucket using boto3使用 boto3 生成存储桶中最新对象的预签名 s3 URL
【发布时间】:2020-04-22 14:01:31
【问题描述】:

我有一个包含多个文件夹的 s3 存储桶。如何使用 aws 中的 python boto3 为用户询问的每个文件夹生成最新对象的 s3 预签名 URL?

【问题讨论】:

  • 旁注: 通常,应用程序会在请求时创建预签名 URL。这是因为它们是有时间限制的,因此在需要它们之前创建预签名 URL 将导致 URL 过期,或者需要一个不利于安全的长期 URL。
  • “对于用户询问的每个文件夹”是什么意思?

标签: amazon-web-services amazon-s3 boto3


【解决方案1】:

你可以做类似的事情

import boto3
from botocore.client import Config
import requests
bucket = 'bucket-name'
folder = '/' #you can add folder path here don't forget '/' at last

s3 = boto3.client('s3',config=Config(signature_version='s3v4'))

objs = s3.list_objects(Bucket=bucket, Prefix=folder)['Contents']     
latest = max(objs, key=lambda x: x['LastModified'])
print(latest)

print (" Generating pre-signed url...")
url = s3.generate_presigned_url(
    ClientMethod='get_object',
    Params={
        'Bucket': bucket,
        'Key': latest['Key']
    }
)
print(url)
response = requests.get(url)
print(response.url)

这里它将提供整个存储桶中最新的最后修改文件,但是您可以根据需要更新登录名和更新前缀值。

如果您使用的是 Kubernetes POD、VM 或任何东西,您可以传递环境变量或使用 python dict 来存储最新的密钥(如果需要)。

【讨论】:

    【解决方案2】:

    如果它是一个小桶,则递归列出该桶,并根据需要添加前缀。按时间戳对结果进行排序,并为最新创建预签名 URL。

    如果是一个非常大的桶,这将是非常低效的,您应该考虑其他方式来存储最新文件的密钥。例如:每当上传对象时触发 Lambda 函数,并将该对象的密钥写入 DynamoDB(或其他持久存储)中的 LATEST 项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-30
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 2017-11-28
      • 2015-11-22
      相关资源
      最近更新 更多