Boto / Boto3:bucket.get_key():403禁止

时间:2017-12-14 11:28:04

标签: python-3.x amazon-web-services amazon-s3 boto3 boto

我尝试连接到S3 AWS不使用凭据。我为我的实例添加了Role S3 fullaccess。目的是检查文件是否存在,如果没有,将其上传到S3桶,否则,检查md5sum,如果与本地文件不同,则上传。

所以我尝试使用bucket.get_key('mykey')通过boto获取S3 AWS中的文件密钥。我收到了这个错误:

File "/usr/local/lib/python3.5/dist-packages/boto/s3/bucket.py", line 193, in get_key key, resp = self._get_key_internal(key_name, headers, query_args_l)

File "/usr/local/lib/python3.5/dist-packages/boto/s3/bucket.py", line 232, in _get_key_internal response.status, response.reason, '') boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden"

我在搜索时搜索并添加"validate=False",但它没有解决。我使用的是Python 3.5,botoboto3

这是我的代码:

import boto3
import boto
from boto import ec2
import os
import boto.s3.connection
from boto.s3.key import Key

bucket_name = "abc"

conn = boto.s3.connect_to_region('us-west-1', is_secure = True, calling_format = boto.s3.connection.OrdinaryCallingFormat())
bucket = conn.get_bucket(bucket_name, validate=False)
key = bucket.get_key('xxxx')

print (key)

我不知道为什么会收到这个错误。请帮我清楚这个问题。谢谢!

更新

我刚找到根源导致这个问题。原因是“请求时间和当前时间之间的差异太大”。 然后它没有从S3桶获取文件的密钥。我更新了ntp服务以同步本地时间和UTC时间。它运行成功。 同步时间:

sudo service ntp stop
sudo ntpdate -s  0.ubuntu.pool.ntp.org
sudo service ntp start

谢谢!

1 个答案:

答案 0 :(得分:1)

IAM角色是搜索顺序的最后一个。我打赌你在搜索顺序之前存储了凭据,而搜索顺序没有完全的S3访问权限。检查Configuration Settings and Precedence并确保不存在凭据,以便使用IAM角色获取凭据。虽然它适用于CLI,但它也适用于脚本。

AWS CLI按以下顺序查找凭据和配置设置:

  1. 命令行选项 - 可以将区域,输出格式和配置文件指定为命令选项以覆盖默认设置。

  2. 环境变量 - AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY和AWS_SESSION_TOKEN。

  3. AWS凭证文件 - 位于Linux,macOS或Unix上的〜/ .aws /凭证,或Windows上的C:\ Users \ USERNAME .aws \凭据。除默认配置文件外,此文件还可包含多个命名配置文件。

  4. CLI配置文件 - 通常位于Linux,macOS或Unix上的〜/ .aws / config或Windows上的C:\ Users \ USERNAME .aws \ config中。此文件可以包含默认配置文件,命名配置文件以及每个配置文件的CLI特定配置参数。

  5. 容器凭据 - 当您为任务分配角色时,由Amazon Elastic Container Service在容器实例上提供。

  6. 实例配置文件凭据 - 这些凭据可用于具有指定实例角色的EC2实例,并通过Amazon EC2元数据服务提供。