我尝试使用IAM用户从我的s3存储桶生成预签名的URL。如果我作为IAM用户登录到aws控制台并从那里创建预签名的url,则我为IAM用户设置的用户权限有效。使用该URL访问对象也没有问题。但是当使用aws-sdk v3时,我得到一个预先签名的url,每次都返回访问拒绝。我只使用IAM内联权限来控制对bucket对象的访问。这是我的IAM用户政策.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:ListAllMyBuckets"
],
"Resource": "*"
}
]
}
这里是我的Node.js代码,从我的Netlify webhook函数中获取预签名的URL.
import { S3Client } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
import { GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3';
const s3Client = new S3Client({ region: 'us-east-2', accessKeyId: process.env.AWS_FMUSER_KEY, secretAccessKey: process.env.AWS_FMUSER_SECRET_KEY});
const bucket = 'myBucket';
const file = 'testFile.zip'
async function getSignedDownloadUrl(targetFile) {
let command = new GetObjectCommand({ Bucket: bucket, Key:targetFile });
return await getSignedUrl(s3Client, command, { expiresIn: 3600 });
}
let url = await getSignedDownloadUrl(file);
console.log(url)
我设置的区域(us-east-2)与分配给存储桶的区域相同。我读过一些建议,加密可能与它有关,但我感到困惑的是,为什么我可以得到一个工作预签名的网址时,登录到控制台作为IAM用户,但预签名的网址我从代码给我访问拒绝。谢谢
1条答案
按热度按时间vatpfxk51#
我偶然发现了this的帖子,发现我按照Quassnoi的建议错误地传递了我的凭据。
我需要将S3客户端调用更改为...
谢谢你的帮助