尝试使用 presigned-url 访问对象时出现此错误 -
'IllegalLocationConstraintException' 'The me-central-1' location constraint is incompatible for the region specific endpoint this request was sent to'
问题。我已经在位置 ('me-central-1')
创建了存储桶,文件被上传,然后我尝试使用 presigned-url 访问它,它会抛出错误,所以我决定通过在 ('ap-south-1')
中创建另一个存储桶并生成 presigned-url 来再次测试它并尝试访问它并且它可以工作。我仍然不明白访问中东存储桶中的对象时导致位置错误的问题是什么。终点正确为 https://s3.me-central-1.amazonaws.com
.
下面是我的Python代码:
def save_to_s3_bucket(file, file_name):
try:
import base64,json
import requests
from io import BytesIO
from botocore.exceptions import ClientError
from botocore.config import Config
format, imgstr = file.split(';base64,')
s3 = boto3.client('s3', aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY, config=Config(signature_version='s3v4'),
region_name=settings.AWS_DEFAULT_REGION)
random_path = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(10))
s3.put_object(Bucket=settings.AWS_STORAGE_BUCKET_NAME, Key='pvt/doc/ln-app/'+random_path+'/'+file_name, Body=base64.b64decode(imgstr), StorageClass='REDUCED_REDUNDANCY')
img_url = settings.AWS_BUCKET_URL+'pvt/doc/ln-app/'+random_path+'/'+file_name
url = s3.generate_presigned_url('get_object', Params = {'Bucket': settings.AWS_STORAGE_BUCKET_NAME, 'Key': 'pvt/doc/ln-app/'+random_path+'/'+file_name}, ExpiresIn = 10000)
print('AWS-S3-URL--->>>>>>>>>', url)
res = {
'hasError': False,
'message': 'Success',
'response': {
'key': 'pvt/doc/ln-app/'+random_path+'/'+file_name,
'file_url': url
}
}
return res
except Exception as e:
res = {
'hasError': True,
'message': str(e),
'response': None
}
return res
已经解决了。只需要添加endpoint_url即可。对于 2019 年 3 月 20 日之后启动的所有 AWS 区域,您需要在请求中指定端点 URL 和 AWS 区域。有关所有 Amazon S3 区域和终端节点的列表。供参考:
https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints
s3 = boto3.client('s3', aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY, config=Config(signature_version='s3v4'),
region_name=settings.AWS_DEFAULT_REGION, endpoint_url=settings.AWS_BUCKET_ENDPOINT_URL)