Python 通过预先签名的URL执行简单的PUT操作“保持获取错误”;我们计算的请求签名与您提供的签名不匹配;

Python 通过预先签名的URL执行简单的PUT操作“保持获取错误”;我们计算的请求签名与您提供的签名不匹配;,python,amazon-s3,boto3,Python,Amazon S3,Boto3,我正在使用 boto3==1.17.57 我读过 但我不知道为什么我仍然得到 我们计算的请求签名与您的签名不匹配 假如检查您的密钥和签名方法 当我尝试执行PUT操作时 我的代码片段非常简单 import requests import boto3 from botocore.client import ClientError s3 = boto3.resource('s3') bucket_name = 'cloud-storage-1' file_name = 'car.jpg'

我正在使用

boto3==1.17.57
我读过

但我不知道为什么我仍然得到

我们计算的请求签名与您的签名不匹配 假如检查您的密钥和签名方法

当我尝试执行PUT操作时

我的代码片段非常简单

import requests
import boto3
from botocore.client import ClientError

s3 = boto3.resource('s3')

bucket_name = 'cloud-storage-1'
file_name = 'car.jpg'



########
# BUCKET
########
try:
    s3.meta.client.head_bucket(Bucket=bucket_name)
except ClientError as e:
    print(str(e))
    print("Try to create bucket for the first time")

    s3.create_bucket(
        Bucket=bucket_name,
        CreateBucketConfiguration={
            'LocationConstraint': 'eu-central-1'
        }
    )



##################
# GET FILE CONTENT
##################
with open(file_name, 'rb') as object_file:
    body = object_file.read()
object_file.close()



###############
# PRESIGNED URL
###############
s3_client = boto3.client('s3')

url = s3_client.generate_presigned_url(
    ClientMethod='put_object',
    Params={
        'Bucket': bucket_name, 
        'Key': file_name
    },
    ExpiresIn=3600
)

print(url)



#####
# PUT
#####
response = requests.put(url, data=body)

print(response.content)
我可以确认
~/.aws/credentials
是正确的,因为我可以看到正在创建的bucket没有问题

创建的Bucket没有问题

~/.aws/凭证
有人知道为什么会这样吗?

时间呢?也许你的系统时钟和AWS的太不一样了?我检查了Docker系统的系统时钟。看起来不错。(我在Docker环境中运行Python脚本)。奇怪的是,这个问题只是随机发生的。如果我倾向于清理整个S3文件和存储桶,它有时会帮助解决问题。或者,如果我在第二天早上运行脚本,也会有帮助。不确定原因:-(
[default]
aws_access_key_id=XXX
aws_secret_access_key=YYY
region=eu-central-1