[英]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 不起作用時要檢查的事項列表:
** 您可以通過預先簽署一個對象(例如 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.