簡體   English   中英

如何獲取 S3 存儲桶本身的可下載 url 而不是 object url 使用 Z23EEEB4347BDD26BDDZ,botoEE?

[英]How to get a downloadable url of S3 bucket itself not an object url using python, boto3?

我有很多文件和子文件夾,其中有一些文件夾和文件,所有這些都在 S3 存儲桶中。 所以我知道如何下載文件,因為有一個 object url 點擊它,我們將能夠下載文件。

要求

但我的要求是,我需要 S3 存儲桶的可下載 url 以便單擊它,我將能夠原樣下載存儲桶中的所有內容,如文件、子文件夾等。

import os, boto3, params, subprocess

path  = "C:\\Users\\lenovo\\Desktop\\BackUp"

subprocess.run(['aws', 's3', 'sync', path, 's3://axis-tax-drive'])

我編寫了這段代碼來將內容上傳到 S3,現在我想獲得上面提到的 S3 存儲桶的可下載 url。

是否可以通過創建接入點或類似的東西來滿足要求..

我想知道所有的可能性。

請幫忙..

提前致謝。

無法“從 URL 下載存儲桶”。 對 Amazon S3 的 API 調用只能下載單個 object。 也不可能要求 S3 提供存儲在 S3 中的多個文件的 Zip。

但是,您可以使用AWS 命令行界面 (CLI)來執行此操作...

您的代碼顯示了使用 AWS CLI 的示例:

aws s3 sync <path> s3://bucketname

AWS CLI 是一個 Python 程序,它調用 S3 API。 對於上述命令,它列出了path的內容,然后使用循環調用PutObject()命令一次上傳一個文件。 但是,它有點聰明,因為它使用多線程同時上傳多個文件(但每次上傳都由單獨的 API 調用完成)。

您可以反向使用相同的命令將存儲桶下載到您的計算機:

aws s3 sync s3://bucketname <path>

或者,您可以編寫自己的程序來遍歷文件並單獨下載它們。

這將是 API 網關 / Lambda 方法。

假設您有一個 Lambda,它從您的 S3 存儲桶下載所有對象並將其放入 zip 中,如下所示:

import logging
import os
from io import BytesIO
from typing import Dict, Any
from zipfile import ZipFile

import boto3

LOGGER = logging.getLogger("zip-bucket")
logging.basicConfig(level="INFO",)
'''
  this is the method which is invoked by the lambda. if you upload it AWS lambda, this is your method which will be called.
  not quite sure about what is in the event, but I do not need it for now.
'''
def handle(event: Dict[str, Any], context: Dict[str, Any]):
    s3 = boto3.client("s3")
    bucket = os.environ["BUCKET"]
    s3_objects = s3.list_objects(Bucket=bucket)
    zip_buffer = BytesIO()
    with ZipFile(zip_buffer, 'w') as myzip:
        for s3_object in s3_objects['Contents']:
            key = s3_object['Key']
            LOGGER.info("Zipping %s", key)
            myzip.writestr(key, s3.get_object(Bucket=bucket, Key=key)['Body'].read())
    myzip.close()
    return {
            'headers': { "Content-Type": " application/zip; charset=binary" },
            'statusCode': 200,
            'body': zip_buffer.getvalue(),
            'isBase64Encoded': False
        }



if __name__ == '__main__':
    zipfile = open("result.zip", "wb")
    zipfile.write(handle(None, None)['body'])
    zipfile.close()

您可以在本地運行它進行測試,也可以創建 AWS lambda。 由於唯一的依賴是提供的 aws-sdk (boto3),它開箱即用。 請記住,您必須向您的 s3 存儲桶(ListBucket 和 GetObject)授予 lambda 執行角色權限。 現在您的請求處理邏輯已經到位。 現在缺少的是某種 HTTP 端點。 API 網關在這里發揮作用。

在 AWS go 到 API 網關並創建一個 HTTP 網關,因為這是最簡單的一個。 您可以在創建新的 api 時連接之前創建的 lambda。 如果您通過 AWS 控制台執行此操作,它將在您的 lambda 中即時創建策略。 在您獲得 http 端點之后,您可以在其中下載 zip。 如果它不起作用,您需要查看 Cloudwatch 日志或 lambda 或 api 網關。

此鏈接可能對您感興趣: https://docs.aws.amazon.com/apigateway/latest/developerguide/lambda-proxy-binary-media.html

請記住,該方法沒有內置身份驗證!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM