无法使用 boto 从 S3 读取密钥,但可以使用 aws cli
Posted
技术标签:
【中文标题】无法使用 boto 从 S3 读取密钥,但可以使用 aws cli【英文标题】:Cannot read a key from S3 with boto, but can with aws cli 【发布时间】:2017-03-25 03:49:57 【问题描述】:使用这个 aws cli 命令(配置了访问密钥),我可以在本地从 S3 复制密钥:
aws s3 cp s3://<bucketname>/test.txt test.txt
在 boto 中使用以下代码,我得到 S3ResponseError: 403 Forbidden,无论我允许 boto 使用配置的凭据,还是显式传递密钥。
import boto
c = boto.connect_s3()
b = c.get_bucket('<bucketname>')
k = b.get_key('test.txt')
d = k.get_contents_as_string() # exception thrown here
我看过其他关于不使用 validate=False 等验证密钥的 SO 帖子,但这些都不是我的问题。将密钥复制到同一存储桶中的另一个位置时,我得到了类似的结果。使用 cli 成功,但使用 boto 失败。
我查看了 boto 源代码,看看它是否在做任何需要额外权限的事情,但对我来说没有什么特别突出的。
有人有什么建议吗? boto 如何解析其凭据?
【问题讨论】:
有时是因为 boto 可能对aws s3 cp
进行了不同的 API 调用。这是因为get_contents_as_string()
和像s3:GetObject
这样的API 调用之间没有一对一的映射。哪些权限与用户/角色相关联?您可以临时添加所有 S3 权限以查看是否可以解决问题吗?
是的,我认为 boto 需要比 cli 更多的权限,尽管我无法从源代码中看到什么
@SimonTrewhella 我遇到了类似的问题,你找到解决办法了吗?具体还需要哪些其他权限或解决方法?
@monguin 我最终不得不在代码中添加访问密钥,我认为切换到 boto2
【参考方案1】:
显式设置您的凭据,以便我们与具有 ENV 变量的 CLI 相同。
回显 $ACCESS_KEY
回显 $SECRET_KEY
import boto3
client = boto3.client(
's3',
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY
)
b = client.get_bucket('<bucketname>')
k = b.get_key('test.txt')
d = k.get_contents_as_string()
boto 如何解析其凭据。
boto3 查找凭据的机制是搜索可能位置的列表,并在找到凭据后立即停止。 Boto3 搜索凭据的顺序是:
在 boto.client() 方法中将凭据作为参数传递 在创建 Session 对象时将凭据作为参数传递 环境变量 共享凭据文件 (~/.aws/credentials) AWS 配置文件 (~/.aws/config) 担任角色提供者 Boto2 配置文件(/etc/boto.cfg 和 ~/.boto) 配置了 IAM 角色的 Amazon EC2 实例上的实例元数据服务。
http://boto3.readthedocs.io/en/latest/guide/configuration.html#guide-configuration
【讨论】:
以上是关于无法使用 boto 从 S3 读取密钥,但可以使用 aws cli的主要内容,如果未能解决你的问题,请参考以下文章
使用boto3,从整个文件夹或文件从一个s3存储桶复制到同一区域的另一个文件夹时,如何提供访问密钥和秘密访问密钥?