NodeJS 使用IAM用户从控制台预签名的URL工作,从代码上看,它不?

bihw5rsg  于 2023-10-17  发布在  Node.js
关注(0)|答案(1)|浏览(80)

我尝试使用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用户,但预签名的网址我从代码给我访问拒绝。谢谢

vatpfxk5

vatpfxk51#

我偶然发现了this的帖子,发现我按照Quassnoi的建议错误地传递了我的凭据。
我需要将S3客户端调用更改为...

const s3Client = new S3Client({ region: 'us-east-2', credentials: {accessKeyId: process.env.AWS_FMUSER_KEY, secretAccessKey: process.env.AWS_FMUSER_SECRET_KEY}});

谢谢你的帮助

相关问题