[英]boto3 generate_presigned_url SignatureDoesNotMatch
[英]Boto3 generate_presigned_url, SignatureDoesNotMatch error
關於SO和其他地方的一些問題和答案概述了解決可能的解決方案,以解決從boto3 SDK調用“ generate_presigned_url”時引發的SignatureDoesNotMatch錯誤。 boto3中很少有人使用,大多數答案都建議您獲取新的憑據來解決此異常。 您可以在此處查看更多信息(但這在PHP中)。
但是這些對我不起作用,因為我使用的是正確的憑據以及正確的存儲桶名稱和密鑰路徑。
最初,我調用此方法來生成我的客戶端,然后調用generate_presigned_url。
client_s3 = boto3.client(
's3',
# Hard coded strings as credentials, not recommended.
aws_access_key_id='XXX',
aws_secret_access_key='XXX',
region_name='us-east-2',
# EDIT: Previously, I used signature_version='v4' here, but as a user here pointed out, this might not work. Regardless, I tried 's3v4' prior to trying 'v4' and neither worked for me.
config=Config(signature_version='s3v4')
)
url = client_s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': 'BUCKET_NAME',
'Key': 'CORRECT_KEY'
}
)
當所有使用的參數看似正確時,什么會造成此錯誤? 我該如何解決?
boto3的文檔中明確提到該選項應類似於config=Config(signature_version='s3v4')
。 v4
無法正常工作。
這是boto3文檔的示例。
import boto3
from botocore.client import Config
# Get the service client with sigv4 configured
s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
# Generate the URL to get 'key-name' from 'bucket-name'
url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': 'bucket-name',
'Key': 'key-name'
}
)
順便說一句, us-east-2
僅允許簽名版本4,因此您無需指定它。 看到這個 。
看到這個AWS論壇之后 ,我發現可能會發生一些麻煩,但是我真的只是想用一個安全的解決方案來解決這個問題。
我的分辨率絕對不是每個人都最佳,但對我有用。
我將“ us-east-2”中的存儲桶中的所有內容復制到“ us-east-1”中的新存儲桶中,並且能夠使用完全相同的訪問/秘密密鑰和存儲桶/密鑰路徑正確訪問該存儲桶。 我只是用了:
client_s3 = boto3.client(
's3',
# Hard coded strings as credentials, not recommended.
aws_access_key_id='XXX',
aws_secret_access_key='XXX'
)
如果您像我一樣,並且不想花費數小時來嘗試破譯AWS的不良文檔,則可以這樣做。 如果您有真正的解決方案,請在此處添加。
我仍然不確定是什么原因造成的,但可能與“ v4”簽名方法有關,該方法依賴於區域。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.