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



我有一个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)我的同事认为无论如何都不需要。

有人得到了这种事情的完整示例?

建议:

  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命令而不是自定义脚本。

看起来这个问题必须是最新版本的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",
)

相关内容

  • 没有找到相关文章

最新更新