簡體   English   中英

Lambda / 預簽名 url 訪問被拒絕

[英]Lambda / Pre-signed url access denied

我寫了一個 lambda function,它為 S3 存儲桶中的文檔返回了一個預簽名的 url。

代碼非常簡單:

            const url = s3.getSignedUrl('getObject', {
                Bucket: BUCKET_NAME,
                Key: myFile.Key,
                Expires: 20
            })

            const response = {
                statusCode: 200,
                headers: {
                    "Access-Control-Allow-Origin": "*"
                },
                body: JSON.stringify({
                    "url": url
                }),
            };

有趣的是,當我在本地(使用無服務器框架)調用這個 function 時,如下所示:

sls invoke local -f getEconomyFile -d '{ "queryStringParameters": { "key": "myfile.pdf" } }'

它的工作。 我有一個 url 給我文件。

但是當我部署到 AWS Lambda 時,function 返回一個 URL,它總是在文件上顯示“訪問被拒絕”:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>93778EA364B3506B</RequestId>
    <HostId>
        yqnPC0SeIVE3/Pl7/d+xHDJ78=
    </HostId>
</Error>

為什么它在本地工作而不是部署?

謝謝 !

以下是預簽名 URL 不起作用時要檢查的事項列表:

  1. Lambda 函數的 IAM 策略需要有權訪問相關 S3 對象(通過 arn:aws:s3::::BUCKET-NAME/*)。 如果它沒有訪問權限,它將能夠創建一個預簽名的 URL(純粹的本地計算**),但該 URL 實際上不允許您訪問該對象(因為支持預簽名 URL 的憑據確實無法訪問)。
  2. 檢查 URL 是否未過期。
  3. 檢查用於簽署 URL 的憑據是否未過期。 當使用臨時憑證預簽名 URL 時,這是一個常見問題,其中憑證在預簽名 URL 到期之前到期。
  4. 檢查客戶端時間是否同步。
  5. 檢查 URL 是否在傳輸過程中沒有被破壞或以某種方式編碼。

** 您可以通過預先簽署一個對象(例如 s3://notmybucket/fred)來判斷這是一個本地計算,並且不涉及對 AWS 的任何調用。 這將起作用並生成一個預先簽名的 URL,但它實際上不能用於檢索該對象。

https://aws.amazon.com/premiumsupport/knowledge-center/s3-bucket-owner-full-control-acl/

由於其他帳戶可以訪問存儲桶,因此如果他們將 object 放入存儲桶中,則帳戶所有者不會自動訪問這些放置文件。 要解決此問題,您需要將其添加到您的命令中:

--acl bucket-owner-full-control

aws s3api put-object --bucket accountB-bucket --key example.txt --acl bucket-owner-full-control

或者

aws s3 cp s3://accountA-bucket/test.txt s3://accountB-bucket/test2.txt --acl bucket-owner-full-control

否則,您將 object hyper 的 ACL 留給推送該文件的其他帳戶和用戶。

希望有所幫助。

暫無
暫無

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

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