Iva*_*nov 8 amazon-s3 amazon-web-services
const AWS = require('aws-sdk');
export function main (event, context, callback) {
const s3 = new AWS.S3();
const data = JSON.parse(event.body);`
const s3Params = {
Bucket: process.env.mediaFilesBucket,
Key: data.name,
ContentType: data.type,
ACL: 'public-read',
};
const uploadURL = s3.getSignedUrl('putObject', s3Params);
callback(null, {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*'
},
body: JSON.stringify({ uploadURL: uploadURL }),
})
}
Run Code Online (Sandbox Code Playgroud)
当我在本地测试它时,它工作正常,但在部署它后 x-amz-security-token,然后我得到拒绝访问的响应。我怎样才能摆脱这个 x-amz-security-token?
Sea*_*lan 11
我遇到了同样的问题。使用一切正常,serverless-offline
但是当我部署到 Lambda 时,我开始收到AccessDenied
有关 URL 的问题。在比较serverless-offline
部署和 AWS 部署之间返回的 URL 时,我注意到唯一的区别是X-Amz-Security-Token
在 URL 中包含作为查询字符串参数的 。经过一番挖掘,我发现分配的令牌是基于 lambda 函数所具有的假定角色。我所要做的就是为该角色授予适当的 S3 策略并且它起作用了。
小智 3
我刚刚解决了一个非常相似的问题,可能与你的问题相同。我说可能是因为您没有说明部署对您来说意味着什么。我假设您正在部署到 Lambda,但您可能不会,这可能适用,也可能不适用,但如果您使用临时凭证,这将适用。
我最初使用了上面使用的方法,但后来使用 npm 模块aws-signature-v4来查看它是否不同,并且得到了与您相同的错误。
您将需要令牌,当您使用临时凭据签署请求时需要它。在 Lambda 的情况下,凭证位于运行时,包括您需要传递的会话令牌,在其他地方也很可能也是如此,但我不确定我已经有几年没有使用 ec2 了。
埋藏在文档中(抱歉我找不到说明的地方)指出某些服务要求使用其他规范查询参数来处理 session_token。我正在使用的模块将其添加到最后,正如 sig v4 指令似乎暗示的那样,所以我修改了它,使令牌是规范的并且可以工作。
我们更新了 aws-signature-v4 模块的实时版本以反映此更改,现在它可以很好地用于签署您的 s3 请求。
我会使用我所做的模块,因为我感觉 sdk 由于某种原因做了错误的事情。
使用示例(这包含在多部分上传中,因此包含部分编号和上传 ID):
function createBaseUrl( bucketName, uploadId, partNumber, objectKey ) {
let url = sig4.createPresignedS3URL( objectKey, {
method: "PUT",
bucket: bucketName,
expires: 21600,
query: `partNumber=${partNumber}&uploadId=${uploadId}`
});
return url;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6497 次 |
最近记录: |