【发布时间】:2018-05-20 04:18:40
【问题描述】:
我使用以下 Python/Boto 代码生成一次性文件上传 URL 到 Amazon S3 存储桶:
from boto.s3.connection import S3Connection
def get_signed_upload_url():
s3 = S3Connection(ACCESS_KEY_ID, SECRET_ACCESS_KEY, is_secure=True)
return s3.generate_url(300, 'PUT', bucket=BUCKET, key=KEY,
headers={'Content-Type': 'text/plain'})
它已经运行了好几年,并且一直持续到今天。
但现在,我正在转换为 IAM 角色 - 这将使我免于对 ACCESS_KEY_ID 和 SECRET_ACCESS_KEY 进行硬编码。因此,我删除了硬编码的键,从而产生了以下代码:
from boto.s3.connection import S3Connection
def get_signed_upload_url():
s3 = S3Connection(is_secure=True)
return s3.generate_url(300, 'PUT', bucket=BUCKET, key=KEY,
headers={'Content-Type': 'text/plain'})
使用 this 代码,每当我生成一个 URL 并从我的客户端 Web 应用程序(通过 Ajax)向它发出 PUT 请求时,我都会从 S3 收到 HTTP 400 Bad Request 错误:
<Error>
<Code>InvalidToken</Code>
<Message>The provided token is malformed or otherwise invalid.</Message>
<!-- account-specific stuff removed -->
</Error>
为什么会这样?
一些额外的细节:
- 这将部署到自动分配其 IAM 角色的 EC2 服务器。我已确认角色的授权正确地提供给我的 Python 代码。我的代码的所有其他部分(包括生成
GETURL 的generate_url()调用)都可以正常工作,使用自动传递给 EC2 实例环境的ACCESS_KEY_ID。 - Python 2.7.9 和 Boto 2.38.0。
- IAM 角色似乎拥有所有适当的权限,我的代码的其他部分使用该角色成功地与 S3 交互(获取项目和创建项目)就证明了这一点。只有这个特定的
PUT不起作用。 - 前端逻辑发送一个
Content-Type标头,这就是该标头存在的原因。我尝试从这个 Boto 代码和前端逻辑中删除Content-Type标头,但问题仍然存在。
【问题讨论】:
-
是boto问题。 Boto sdk 应该是 2.5.1 或更多
-
@IshaaRora:Boto 2.5.1 于 2012 年 6 月发布 (pypi.python.org/pypi/boto/2.5.1)。我正在使用 2015 年 4 月发布的 Boto 2.38.0 (pypi.python.org/pypi/boto/2.38.0)。
-
您使用的是哪个地区?您使用 boto 而不是 boto3 是否有原因?
标签: amazon-web-services amazon-s3 boto amazon-iam