我应该使用boto3写入只有IAM实例配置文件的S3存储桶,但是如何?

时间:2017-10-04 23:29:09

标签: amazon-s3 boto3 amazon-iam

我有一个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)我的同事认为这不应该是必要的。

有人有这样一个完整的例子吗?

2 个答案:

答案 0 :(得分:0)

建议:

  1. 升级和/或重新安装所需软件包和依赖项的当前版本:

    pip install --upgrade --ignore-installed botocore boto3 awscli
    
  2. 在“类型:

    ”下验证aws configure list是否显示iam-role
    access_key     ****************DFAB         iam-role
    secret_key     ****************zxQ4         iam-role
    
  3. 简化您的代码。如果你只想上传一个文件,你就会走很长很风景的路线!请尝试使用此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')
    
  4. 解决您的角色问题后:如果您的业务需要通过上传新文件来同步本地目录和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角色!