无法使用 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存储桶复制到同一区域的另一个文件夹时,如何提供访问密钥和秘密访问密钥?

使用 boto3 检查 s3 的存储桶中是不是存在密钥

S3 AWS 的 IAM 角色和密钥设置使用 boto3 访问两个不同的账户存储桶

如何在 boto S3 中获取文件/密钥大小?

Amazon S3 boto:如何重命名存储桶中的文件?

使用 Amazon s3 boto 库,如何获取已保存密钥的 URL?