【问题标题】:Bulk Generate Pre-Signed URLs boto3批量生成预签名 URL boto3
【发布时间】:2022-01-12 02:11:59
【问题描述】:

我目前正在使用以下内容为存储桶资源创建预签名的 url:

bucket_name = ...
key = ...
s3_client = ...

s3_client.generate_presigned_url(
    ClientMethod="get_object",
    Params={
        "Bucket": bucket_name,
        "Key": key
    },
    ExpiresIn=100
)

这很好用。但是,我想知道是否可以在一个请求中为多个密钥生成预签名的 url?或者是否需要为每个密钥发出一个请求?我在有关此主题的文档中没有发现任何有用的信息。我正在寻找这样的东西:

bucket_name = ...
keys = [...]
s3_client = ...

# Returns an array of pre-signed urls, in the same order as `keys`
s3_client.generate_presigned_url(
    ClientMethod="get_object",
    Params={
        "Bucket": bucket_name,
        "Keys": keys
    },
    ExpiresIn=100
)

【问题讨论】:

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


    【解决方案1】:

    生成预签名 URL 实际上是在本地完成的,无需调用 AWS。这是因为所有必要的信息(Bucket、Key、Secret Key)都是本地已知的并且可以生成签名。

    因此,请随意重复调用该函数,因为没有网络/服务开销。

    一般来说,不需要批量生成 URL。相反,每当您的应用程序希望引用资源(例如 HTML 页面上的图像)时,它可以快速调用 generate_presigned_url() 函数并设置适当的超时时间。

    【讨论】:

    • 请注意,如果在循环中生成多个签名 URL,您可能希望重用 S3 客户端对象。实例化该对象可能会不必要地耗费时间/资源。
    • 辉煌;我想知道为什么他们没有批量选项。谢谢!
    • 非常感谢您的回答先生,我有一个疑问,如果我想为存储桶中的多个文件生成预签名 url。例如:目前对于 1.jpg,我正在生成一个单一的预置 url,并使用该 url 我可以完美地将内容上传到我的存储桶,但是如果我想上传 4 个文件怎么办。例如1.jpg、2.jpg、3.jpg、4.jpg
    • @JohnRotenstein 感谢您的链接,它可以为多个文件生成预签名的 url,并且可以一次发布单个文件/对象,有什么方法可以让我一次上传所有文件使用我为他们生成的预签名网址?只是想知道:) 在此先感谢
    【解决方案2】:

    正如@John Rotenstein 在他的回复中提到的,您可以在 For 循环中重复调用此函数。

    这是一个例子:

    def create_presigned_urls(s3Client, bucket_name: str, key: str, expires_in: int):
      """Create presigned_urls
      Args:
          s3Client (s3 Class): boto3 S3 Class
          bucket_name
          key
          expires_in: The number of seconds the presigned URL is valid for.
    
      Returns:
          (string): presigned URL
      """
      presigned_url = s3Client.generate_presigned_url(
        ClientMethod="get_object",
        Params={
            "Bucket": bucket_name,
            "Key": key
        },
        ExpiresIn=expires_in
      )
      return presigned_url
    

    for循环:

    s3Client = boto3.client('s3')
    bucket_name = 'BUCKET_NAME'
    expires_in = 3600
    list_file_url = []
    
    for index, unit in df.iterrows():
        key = df['key_name']
        url = create_presigned_urls(s3Client, bucket_name, key, expires_in)
        list_file_url.append(url)
    

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多