【问题标题】:Cannot read a key from S3 with boto, but can with aws cli无法使用 boto 从 S3 读取密钥,但可以使用 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

标签: python amazon-web-services amazon-s3 boto aws-cli


【解决方案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

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2020-02-14
    • 2014-04-22
    • 2015-04-21
    相关资源
    最近更新 更多