簡體   English   中英

在boto3中創建/使用預簽名URL時無法驗證訪問憑據

[英]Unable to validate access credentials when creating/using presigned URLs in boto3

我正在使用boto3將加密的EBS快照從一個區域復制到另一個區域,但是在嘗試復制時,我收到的是Invalid presigned URL消息。 我在源區域中使用boto3客戶端方法generate_presigned_url生成了預簽名URL,並在目標區域中調用了復制函數,如下所示:

uw2_client = non_prod.client(
    'ec2', 
    region_name="us-west-2", 
    config=Config(signature_version='s3v4')
)
presigned_url = uw2_client.generate_presigned_url(
    ClientMethod='copy_snapshot',
    Params={
        'SourceSnapshotId': og_snapshot_id,   # Original snapshot ID
        'SourceRegion': 'us-west-2',
        'DestinationRegion': 'us-east-1'
        # I also tried include all parameters from copy_snapshot.
        # It didn't make a difference.
        # 'Description': desc,
        # 'KmsKeyId': 'alias/xva-nonprod-all-amicopykey',
        # 'Encrypted': True,
    }
)

這是我創建副本的代碼。

ue1_client = non_prod.client(
    'ec2', 
    region_name="us-east-1", 
    config=Config(signature_version='s3v4')
)
response = ue1_client.copy_snapshot(
    Description=desc,
    KmsKeyId='alias/xva-nonprod-all-amicopykey',   # Exists in us-east-1
    Encrypted=True,
    SourceSnapshotId=og_snapshot_id,
    SourceRegion='us-west-2',
    DestinationRegion='us-east-1',
    PresignedUrl=pre_signed_url
)

成功返回預簽名的URL。 但是,如果我嘗試使用該預簽名的URL復制快照,則會收到無效的URL錯誤。 如果我嘗試驗證網址:

r = requests.post(presigned_url)
print(r.status_code)
print(r.text)

我得到:

<Response>
    <Errors>
        <Error>
            <Code>AuthFailure</Code>
            <Message>AWS was not able to validate the provided access credentials</Message>
        </Error>
    </Errors>
    <RequestID>3189bb5b-54c9-4d11-ab4c-762cbea32d9a</RequestID>
</Response>

您可能會認為我的憑據會出現問題,但是我不確定該怎么做...這與我用來創建預簽名URL的憑據相同。 而且我的IAM用戶可以不受限制地訪問EC2。

我顯然在這里做錯了,但我無法弄清楚是什么。 任何見識將不勝感激。

編輯

只是為了確認這不是權限問題,我使用可以訪問所有內容的個人帳戶嘗試了此操作。 仍然收到相同的錯誤消息。

事實證明,該文檔是錯誤的...在同一賬戶內復制加密的快照時,不需要簽名URL(根據AWS支持)。

通過AWS支持:

...實際上不需要創建預簽名URL即可將加密的快照從一個區域復制到另一個區域(在同一AWS賬戶內)。

但是,根據他們的文檔,也不可能將加密的快照復制到另一個帳戶... \\ _(ツ)_ /¯

當前的boto3.EC2.Client.copy_snapshot函數文檔說:

PresignedUrl(字符串)-

使用Amazon EC2 Query API復制加密的源快照時,必須提供一個預簽名的URL。 對於未加密的快照,此參數是可選的。

相反,只需在目標區域中創建客戶端對象並像下面這樣調用copy_snapshot()方法即可完成此操作:

try:
    ec2 = boto3.client(
        service_name='ec2',
        region_name='us-east-1'
    )

    ec2.copy_snapshot(
        SourceSnapshotId='snap-xxxxxxxxxxxx',
        SourceRegion='us-west-2',
        Encrypted=True,
        KmsKeyId='DestinationRegionKeyId'
    )
except Exception as e:
    print(e)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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