簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM