gpt4 book ai didi

amazon-web-services - S3 PUT 的 Boto generate_url 不适用于 IAM 角色?

转载 作者:行者123 更新时间:2023-12-04 08:11:18 27 4
gpt4 key购买 nike

我使用以下 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_IDSECRET_ACCESS_KEY .因此,我删除了硬编码的 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'})

使用此代码,每当我生成 URL 并执行 PUT从我的客户端 Web 应用程序(通过 Ajax)请求它,我得到一个 HTTP 400 Bad Request来自 S3 的错误:
<Error>
<Code>InvalidToken</Code>
<Message>The provided token is malformed or otherwise invalid.</Message>
<!-- account-specific stuff removed -->
</Error>

为什么会这样?

一些额外的细节:
  • 这将部署到自动分配其 IAM 角色的 EC2 服务器。我已确认角色的授权已正确提供给我的 Python 代码。我代码的所有其他部分——包括 generate_url()生成 GET 的调用URL - 使用 ACCESS_KEY_ID 工作正常自动传递到 EC2 实例的环境。
  • Python 2.7.9 和 Boto 2.38.0。
  • IAM 角色似乎拥有所有适当的权限,我的代码的其他部分使用该角色与 S3 成功交互(获取项目和创建项目)这一事实证明了这一点。只有这个特别PUT这是行不通的。
  • 前端逻辑发送Content-Type标题,这就是标题在那里的原因。我尝试删除 Content-Type来自此 Boto 代码和前端逻辑的 header ,但问题仍然存在。
  • 最佳答案

    对于它的值(value),我无法复制这个问题。我设置了一个全新的 EC2 实例,为其分配了一个 IAM 角色,该角色附加了 AmazonS3FullAccess 权限

    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Action": "s3:*",
    "Resource": "*"
    }
    ]
    }

    我能够安装的最早的 Python 版本是 2.7.12 和 Boto 2.38.0
    [root@ip-172-31-13-14 ~]# python -V
    Python 2.7.12
    [root@ip-172-31-13-14 ~]# pip freeze|grep boto
    boto==2.38.0
    botocore==1.5.95

    然后我运行代码 app.py
    from boto.s3.connection import S3Connection


    def get_signed_upload_url():
    BUCKET = 'test'
    KEY = 'test-2'
    s3 = S3Connection(is_secure=True)
    return s3.generate_url(300, 'PUT', bucket=BUCKET, key=KEY,
    headers={'Content-Type': 'text/plain'})


    if __name__ == "__main__":
    url = get_signed_upload_url()
    print "curl -v -X PUT -H 'Content-Type: text/plain' -d @hello2.txt '" + url + "'"

    然后运行生成的cURL命令,文件上传成功
    > Host: test.s3.amazonaws.com
    > User-Agent: curl/7.53.1
    > Accept: */*
    > Content-Type: text/plain
    > Content-Length: 8585
    > Expect: 100-continue
    >
    < HTTP/1.1 100 Continue
    * We are completely uploaded and fine
    < HTTP/1.1 200 OK
    < x-amz-id-2: redacted
    < x-amz-request-id: redacted
    < Date: Tue, 19 Dec 2017 05:45:15 GMT
    < x-amz-version-id: redacted
    < ETag: "redacted"
    < Content-Length: 0
    < Server: AmazonS3

    在这个阶段,我只能猜测您使用的 IAM 角色可能没有足够的权限来执行 PUT 操作?否则,您的客户端代码实际执行 PUT 请求的方式可能会有所不同,但这不太可能。

    其他检查事项:
  • 确保 EC2 实例上的时钟时间准确
  • 确保设置了 AWS_REGION 环境变量
  • 关于amazon-web-services - S3 PUT 的 Boto generate_url 不适用于 IAM 角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47671669/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com