我有一个boto3脚本,使用我的帐户的AccessKeyId和SecretAccessKey成功将文件上传到S3存储桶。这很好。
但我应该从此实例中删除我的凭据,并仅使用附加到该实例的IAM角色。我做了各种尝试,但没有得到这个工作,通常是:
botocore.exceptions.ClientError: An error occurred (InvalidToken) when
calling the PutObject operation: The provided token is malformed or
otherwise invalid.
我的代码:
!/usr/bin/env python
import datetime
import sys
import os
import ConfigParser
import boto3
s3 = boto3.resource('s3')
config = ConfigParser.ConfigParser()
configfile = config.read('edi.config')
s3bucket = config.get('default', 's3bucket')
s3bucket = s3bucket.strip()
print 's3bucket: ', s3bucket
today = datetime.date.today()
todaystr = today.strftime('%m_%d_%Y')
os.chdir(todaystr)
try:
os.mkdir('uploaded')
except:
pass
for f in os.listdir('.'):
if not os.path.isfile(f):
continue
print 'uploading', f
data = open(f)
s3.Bucket('ustc-submissions-non-prod').put_object(Key='closewatch/incoming/%s' % f, Body=data)
os.rename(f,'uploaded/%s' % f)
我在其他地方发现了一个注释,我需要在boto3中承担IAM角色,但是(a)我没有这样做的许可,(b)我没有得到自己的许可和(c)我的同事认为这不应该是必要的。
有人有这样一个完整的例子吗?
答案 0 :(得分:0)
建议:
升级和/或重新安装所需软件包和依赖项的当前版本:
pip install --upgrade --ignore-installed botocore boto3 awscli
在“类型:
”下验证aws configure list
是否显示iam-role
access_key ****************DFAB iam-role
secret_key ****************zxQ4 iam-role
简化您的代码。如果你只想上传一个文件,你就会走很长很风景的路线!请尝试使用此MCVE:
import boto3
with open('example.txt', 'w') as f:
f.write('This is an example.')
s3 = boto3.client('s3')
s3.upload_file(Filename='example.txt',
Bucket='ustc-submissions-non-prod',
Key='example.txt')
解决您的角色问题后:如果您的业务需要通过上传新文件来同步本地目录和S3存储桶,请考虑使用现有的aws s3 sync
命令而不是自定义脚本。
答案 1 :(得分:0)
看起来问题必定是最新版boto3中的一个错误。
我在Ruby中试过它:
require 'aws-sdk-s3'
s3 = Aws::S3::Resource.new(region:'us-west-2')
obj = s3.bucket('bucket-name').object('key')
obj.upload_file('/path/to/source/file')
这只能使用我需要的IAM角色!