使用boto访问ap-south-1区域中的S3存储桶时出现400错误

时间:2017-02-20 15:48:14

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

我一直在尝试从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'   

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

2 个答案:

答案 0 :(得分:0)

您的代码未访问凭据文件中的[s3]个人资料。创建客户端连接时需要显式请求配置文件。因此,该地区可能不会被接收。

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

答案 1 :(得分:0)

问题与ap-south-1使用签名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')   

有用的信息来自: