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