В вашей общей сути есть ряд изменений.
Я предлагаю избегать чтения извлеченного tar-файла в памяти, где вы можете передавать потоковое содержимое непосредственно в корзину S3.
def extract(filename):
upload_status = 'success'
try:
s3.upload_fileobj(
tardata.extractfile(filename),
bucket,
os.path.join(path, tarname, filename)
)
except Exception:
logger.error(
'Failed to upload %s in tarfile %s',
filename, tarname, exc_info=True)
upload_status = 'fail'
finally:
return filename, upload_status