我有一个boto3脚本,该脚本使用我的帐户的AccessKeyId和SecretAccessey成功地将文件上传到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)我的同事认为无论如何都不需要。
有人得到了这种事情的完整示例?
建议:
-
升级和/或重新安装所需软件包和依赖项的当前版本:
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
命令而不是自定义脚本。
看起来这个问题必须是最新版本的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角色起作用!
可能您忘了指定AWS区域:
session = boto3.session.Session()
self.s3_resource = session.resource(
"s3",
region_name="us-east-1", # example
aws_access_key_id="your_access_key_id",
aws_secret_access_key="your_secret_access_key",
aws_session_token="your_session_token",
)