在Python中无需身份验证即可将大型文件上载到S3

在Python中无需身份验证即可将大型文件上载到S3,python,amazon-web-services,amazon-s3,octoprint,Python,Amazon Web Services,Amazon S3,Octoprint,我正在尝试在不使用凭据的情况下将大型文件上载到AmazonS3。我正在用这个为Octoprint创建一个插件,由于它是公开的,所以我不能在代码中添加任何类型的凭据。目前,我上传的代码如下所示: import boto3 from botocore import UNSIGNED from botocore.client import Config s3 = boto3.client('s3', config=Config(signature_version=UNSIGNED)) # Crea

我正在尝试在不使用凭据的情况下将大型文件上载到AmazonS3。我正在用这个为Octoprint创建一个插件,由于它是公开的,所以我不能在代码中添加任何类型的凭据。目前,我上传的代码如下所示:

import boto3
from botocore import UNSIGNED
from botocore.client import Config

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

# Create an S3 client


filename = 'file.txt'
bucket_name = 'BUCKET_HERE'

s3.upload_file(filename, bucket_name, filename)
# first pip install environ
import environ
SOME_KEY = env('SOME_KEY', default='')
但是,它给了我以下错误:

S3UploadFailedError: Failed to upload largefiletest.mp4 to BUCKETNAMEHERE/largefiletest.mp4: An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Anonymous users cannot initiate multipart uploads.  Please authenticate.

有没有办法解决这个问题,或者对其他图书馆有什么建议?您的意思是存储库是公共的,而运行时环境是私有的吗?如果是这样,标准做法是设置如下环境变量:

import boto3
from botocore import UNSIGNED
from botocore.client import Config

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

# Create an S3 client


filename = 'file.txt'
bucket_name = 'BUCKET_HERE'

s3.upload_file(filename, bucket_name, filename)
# first pip install environ
import environ
SOME_KEY = env('SOME_KEY', default='')
这样,您就可以轻松地更新凭据,而无需更改代码或损害安全性

编辑: 然后,在将运行此代码的计算机上,您可以将环境变量设置为:

  • 马科斯:
  • Linux:
  • 窗口:

将凭据存储在单独的文件中,并修改代码以从文件中读取凭据。任何使用该插件的人都必须创建自己的凭据文件。不过,它必须是所有用户的特定密钥。我的两个想法是对密钥进行加密,或者以某种方式让代码从单独的服务器上检索一个带有密钥的文件,以便在代码中使用。老实说,我一点也不在乎是否有人拿到了这些钥匙,反正他们只有上传权限。但是公开发布密钥是违反AWS TOS的,所以我必须找到一些解决办法。用户是否需要直接触摸密钥,或者只需要将内容上传到S3?如果是后者,那么你可以在后台实现上传而不暴露密钥。我不完全确定我会怎么做。。。要明确的是,我自己没有任何实际的服务器。只是S3订阅。抱歉,如果这是一个愚蠢的问题,我在这方面绝对是新手,非常感谢您的帮助。在这种情况下,您可能会将密钥埋在代码中的某个地方,并使用一个模糊的变量名…;)如果钥匙对安全性不是那么重要,我想那没关系。