【问题标题】:400 error when accessing S3 bucket in ap-south-1 region using boto使用 boto 访问 ap-south-1 区域中的 S3 存储桶时出现 400 错误
【发布时间】:2017-02-22 05:53:47
【问题描述】:

我一直在尝试从运行在 EC2 实例上的 python 程序访问 S3 存储桶。附上代码和错误:

from boto.s3.connection import S3Connection         
import boto           

conn=S3Connection()            
bucket=conn.get_bucket('nplr1')           

错误:

    Traceback (most recent call last):
  File "Main.py", line 140, in <module>
    main()
  File "Main.py", line 33, in main
    conn.get_all_buckets()
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 444, in get_all_buckets
    response.status, response.reason, body)
boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidAccessKeyId</Code><Message>The AWS Access Key Id you provided does not exist in our records.</Message>

这是我的 /etc/boto.cfg 文件

[Credentials]              
aws_access_key_id = 'id'            
aws_secret_access_key = 'key'

[s3]       
region='ap-south-1'           
aws_access_key_id ='id'             
aws_secret_access_key = 'key'   

这有什么问题?为什么我无法访问存储桶?

【问题讨论】:

  • 我认为'host'应该是'region'。
  • 嘿@zatta,我尝试用区域替换主机,但出现此错误:boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
  • bucketname 是否正确?如果是,提供的密钥是否可以访问它?
  • 嗨@franklinsijo,我编辑了我的问题。我收到错误消息 >您提供的 AWS 访问密钥 ID 在我们的记录中不存在。我是否必须使用 AWS 配置文件更改任何内容?
  • 检查区域是否正确。没有 ap-south-1 区域。我看到有亚太地区(新加坡)ap-southeast-1 apigateway.ap-southeast-1.amazonaws.com HTTPS 亚太地区(悉尼)ap-southeast-2 apigateway.ap-southeast-2.amazonaws.com HTTPS

标签: amazon-web-services amazon-s3 amazon-ec2


【解决方案1】:

问题与ap-south-1 使用Signature v4 签名请求有关,而boto 无法识别这一点。 boto3 也没有。

但是,您可以覆盖签名配置。这是boto3中的一些工作代码:

import boto3
from botocore.client import Config

s3 = boto3.resource('s3', config=Config(signature_version='s3v4'))
bucket=s3.get_bucket('nplr1')

对于boto,我设法通过明确声明ap-south-1 的主机来使其工作:

from boto.s3.connection import S3Connection         
import boto           

conn=S3Connection(host='s3.ap-south-1.amazonaws.com')            
bucket=conn.get_bucket('nplr1')   

有用的信息来自:

【讨论】:

    【解决方案2】:

    您的代码未访问凭据文件中的 [s3] 配置文件。创建客户端连接时需要明确请求配置文件。因此,该地区可能没有被选中。

    我建议您通过 AWS Command-Line Interface (CLI) 测试您的凭据。例如,运行 aws s3 ls 将测试您是否有权列出您的 Amazon S3 存储桶。如果可行,那么您可以执行进一步的命令来测试您的权限(例如aws s3 ls s3://nplr1)。

    【讨论】:

    • 嘿@John,我尝试运行该命令,但遇到了同样的错误。我尝试了命令aws configure 并添加了凭据。然后我尝试了aws s3 ls 并成功找到了我的存储桶。但是当我运行程序时出现错误 400: Bad Request
    • @John 有ap-south-1 区域。它是最近添加的。
    • 啊!我设法重现了您的 400: Bad Request 错误。请参阅我的其他答案。
    猜你喜欢
    • 2018-06-19
    • 2021-08-02
    • 2020-11-05
    • 2016-11-01
    • 2018-09-17
    • 2017-12-12
    • 2014-02-16
    • 2019-01-07
    • 2015-08-23
    相关资源
    最近更新 更多