您好我是创建烧瓶应用的新手,我创建了一个小型GUI来将文件上传到S3 Bucket 以下是处理相同
的代码段s3 = boto3.client('s3', region_name="eu-west-1",
endpoint_url=S3_LOCATION, aws_access_key_id=S3_KEY, aws_secret_access_key=S3_SECRET)
myclient = boto3.resource('s3')
file = request.files['file[]']
filename=file.filename
data_files = request.files.getlist('file[]')
for data_file in data_files:
file_contents = data_file.read()
ts = time.gmtime()
k=time.strftime("%Y-%m-%dT%H:%M:%S", ts)
name=filename[0:-4]
newfilename=(name+k+'.txt')
myclient.Bucket(S3_BUCKET).put_object(Key=newfilename,Body=file_contents)
message='File Uploaded Successfully'
print('upload Successful')
当我从本地系统测试它时,该部件工作正常,但在将其上传到EC2实例时,该部分
myclient.Bucket(S3_BUCKET).put_object(Key=newfilename,Body=file_contents)
是它抛出错误的地方:
botocore.exceptions.NoCredentialsError:无法找到凭据
我创建了一个文件config.py,我将存储所有凭据并在运行时传递它们。 不确定在EC2实例中导致错误是什么,请帮助我
答案 0 :(得分:1)
您可能是confusing boto3 service resource and client。
#!!!! this instantiate an object call s3 to boto3.s3.client with credential
s3 = boto3.client('s3', region_name="eu-west-1",
endpoint_url=S3_LOCATION, aws_access_key_id=S3_KEY, aws_secret_access_key=S3_SECRET)
#!!!! this instantiate an object call myclient to boto3.s3.resource that use
# credential inside .aws folder, since no designated credential given.
myclient = boto3.resource('s3')
您似乎尝试将显式凭据传递给boto3.resource,而不使用.aws / credential和.aws / default访问密钥。如果是这样,这不是正确的方法。要将凭证明确传递给boto3.resource,建议使用boto3.Session(也适用于boto3.client)。这也允许您使用初始化会话连接到不同的AWS服务,而不是为程序内的不同服务传递API密钥。
import boto3
session = boto3.session(
region_name = 'us-west-2',
aws_access_key_id=S3_KEY,
aws_secret_access_key=S3_SECRET)
# now instantiate the services
myclient = session.resource('s3')
# .... the rest of the code
然而,更好的方法是使用.aws凭证。因为在代码中硬编码任何访问密钥/密码是一种不好的做法。如果需要访问不同区域中的不同API密钥,也可以使用配置文件名称调用。 e.g。
〜/ .aws /凭证
[default]
aws_access_key_id = XYZABC12345
aws_secret_access_key = SECRET12345
[appsinfinity]
aws_access_key_id = XYZABC12346
aws_secret_access_key = SECRET12346
〜/ .aws /配置 [默认] region = us-west-1
[profile appsinfinity]
region = us-west-2
代码
import boto3
app_infinity_session = boto3.session(profile_name= 'appsinfinity')
....