使用 Boto3 和 Python 将 tar.gz 文件上传到 S3 存储桶

Upload tar.gz file to S3 Bucket with Boto3 and Python

我无法将 tar.gz 文件从我的本地目录加载到 S3 存储桶位置。 运行使用下面的函数上传任何 csv 文件没有问题,但我收到错误:“Fileobj 必须实现读取”错误。我正在使用 Boto3 和 Python

tar_file 是我本地驱动器上要上传到 S3 存储桶位置的文件

import csv
import glob
import os
import tarfile
from datetime import date
from typing import Optional, Set
from io import BytesIO

import psycopg2
import boto3

from constants import (
    ARTIFACT_STORE,
    DB_HOST,
    DB_PASSWORD,
    DB_USER,
    EXCLUDED_TABLES,
    NIPR_DB_NAME,
    S3_ACCESS_KEY_ID,
    S3_SECRET_ACCESS_KEY,
    S3_ENDPOINT_URL,
    BUCKET_NAME
)

def upload_s3_file():
    tar_file = f"{ARTIFACT_STORE}/{date.today()}_cds.tar.gz"
    s3 = boto3.client('s3',endpoint_url=S3_ENDPOINT_URL,aws_access_key_id=S3_ACCESS_KEY_ID,aws_secret_access_key=S3_SECRET_ACCESS_KEY)
    with tarfile.open(tar_file,'r:gz') as tar:
        s3.upload_fileobj(tar,BUCKET_NAME,tar_file)

当我 运行 将 csv 生成的文件发送到 S3 存储桶时,我没有遇到任何问题:

s3 = boto3.client('s3',endpoint_url=S3_ENDPOINT_URL,aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY)
with open("test.csv", "rb") as f:
        s3.upload_fileobj(f,BUCKET_NAME, "test")

问题是您应该将文件对象传递给 upload_fileobj 而不是 tarfile 对象。

with open(tar_file,'rb') as tar:
    s3.upload_fileobj(tar,BUCKET_NAME,tar_file)